TI中文支持网
TI专业的中文技术问题搜集分享网站

关于无刷直流电机程序BLDC3_1的BUG

在level=1下,程序中 F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced唯一的赋值就是函数F280X_HALL3_Debounce(HALL3 *p),而调用该函数也只有void F280X_HALL3_Read(HALL3 *p)函数,该函数调用完F280X_HALL3_Debounce后,随即便p->EdgeDebounced = 0;那么F280X_HALL3_Next_State_Ptr(p)永远不能执行了。还有,Revolutions小于0的时候,建立HallMap[p->HallMapPointer],这个根本就不能保证把霍尔开关的6个状态保存在这个数组里面, 因为只有当检测到霍尔信号边沿的时候才能保存,HallMapPointer靠脉冲函数来增加,那么如果脉冲产生了N个了,即HallMapPointer都不知道改变到0-5哪个了,电机才转动到出现霍尔信号边沿的出现,简单来说,程序根本不能保证impl1.Out产生一次脉冲,电机就可以转动到出现一个霍尔信号边沿。

这个好像是一个非常大的BUG,不知道我有没有理解错,请指导一下,谢谢。

Joey Mao:

F280X_HALL3_Read(HALL3 *p)函数执行时EdgeDebounced的状态是0,而在函数的最后其状态也进行了清零,说明变量的作用是中间过度。在执行HALL3_DEBOUNCE_MACRO()函数时,在某一条件下EdgeDebounced的值进行了赋值改变,而在完成v.CmtnTrigHall = v.EdgeDebounced;赋值之后,这一循环中EdgeDounced的作用结束,进行了清零。

在level=1下,程序中 F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced唯一的赋值就是函数F280X_HALL3_Debounce(HALL3 *p),而调用该函数也只有void F280X_HALL3_Read(HALL3 *p)函数,该函数调用完F280X_HALL3_Debounce后,随即便p->EdgeDebounced = 0;那么F280X_HALL3_Next_State_Ptr(p)永远不能执行了。还有,Revolutions小于0的时候,建立HallMap[p->HallMapPointer],这个根本就不能保证把霍尔开关的6个状态保存在这个数组里面, 因为只有当检测到霍尔信号边沿的时候才能保存,HallMapPointer靠脉冲函数来增加,那么如果脉冲产生了N个了,即HallMapPointer都不知道改变到0-5哪个了,电机才转动到出现霍尔信号边沿的出现,简单来说,程序根本不能保证impl1.Out产生一次脉冲,电机就可以转动到出现一个霍尔信号边沿。

这个好像是一个非常大的BUG,不知道我有没有理解错,请指导一下,谢谢。

ray1:

回复 Joey Mao:

但是F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced只有在EdgeDebounced==0的条件下才能进入F280X_HALL3_Debounce()函数对EdgeDebounced进行赋值。if (p->CapFlag==0)             // NO_EDGE_DETECTED: No hall signal edges detected on ECAP1-3 (bits 0-2)        {          p->CmtnTrigHall = 0;           // Reset trigger, it only handshakes with calling program.          if (p->EdgeDebounced==0)       // If motor has not moved then debounce current position.           {              F280X_HALL3_Debounce(p);             p->CmtnTrigHall = p->EdgeDebounced;      // Set Commutation trigger here           }          else                                  // If current position is debounced, find match in table             F280X_HALL3_Next_State_Ptr(p);     // and return pointer to current state.  Ptr to be incremented                     // by MOD6CNT after RET.             p->EdgeDebounced = 0;                // Reset trigger        }             这是相关代码。在工程里面找不到您所说的HALL3_DEBOUNCE_MACRO()函数,但是按照上面的代码,F280X_HALL3_Next_State_Ptr(p)是永远执行不了的。

在level=1下,程序中 F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced唯一的赋值就是函数F280X_HALL3_Debounce(HALL3 *p),而调用该函数也只有void F280X_HALL3_Read(HALL3 *p)函数,该函数调用完F280X_HALL3_Debounce后,随即便p->EdgeDebounced = 0;那么F280X_HALL3_Next_State_Ptr(p)永远不能执行了。还有,Revolutions小于0的时候,建立HallMap[p->HallMapPointer],这个根本就不能保证把霍尔开关的6个状态保存在这个数组里面, 因为只有当检测到霍尔信号边沿的时候才能保存,HallMapPointer靠脉冲函数来增加,那么如果脉冲产生了N个了,即HallMapPointer都不知道改变到0-5哪个了,电机才转动到出现霍尔信号边沿的出现,简单来说,程序根本不能保证impl1.Out产生一次脉冲,电机就可以转动到出现一个霍尔信号边沿。

这个好像是一个非常大的BUG,不知道我有没有理解错,请指导一下,谢谢。

Joey Mao:

回复 ray1:

我参考的代码是:C:\ti\controlSUITE\development_kits\DRV8312-C2-KIT_v128\BLDC_Sensored,

请问你使用的代码来源是是哪里?是否能提供下载地址

在level=1下,程序中 F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced唯一的赋值就是函数F280X_HALL3_Debounce(HALL3 *p),而调用该函数也只有void F280X_HALL3_Read(HALL3 *p)函数,该函数调用完F280X_HALL3_Debounce后,随即便p->EdgeDebounced = 0;那么F280X_HALL3_Next_State_Ptr(p)永远不能执行了。还有,Revolutions小于0的时候,建立HallMap[p->HallMapPointer],这个根本就不能保证把霍尔开关的6个状态保存在这个数组里面, 因为只有当检测到霍尔信号边沿的时候才能保存,HallMapPointer靠脉冲函数来增加,那么如果脉冲产生了N个了,即HallMapPointer都不知道改变到0-5哪个了,电机才转动到出现霍尔信号边沿的出现,简单来说,程序根本不能保证impl1.Out产生一次脉冲,电机就可以转动到出现一个霍尔信号边沿。

这个好像是一个非常大的BUG,不知道我有没有理解错,请指导一下,谢谢。

ray1:

回复 Joey Mao:

F2808软件支持里面找的http://www.ti.com.cn/tool/cn/SPRC213;因为一直是确信TI的例程是正确的,所以这个问题困扰了我很久,麻烦给予详细的帮助,万分感谢

在level=1下,程序中 F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced唯一的赋值就是函数F280X_HALL3_Debounce(HALL3 *p),而调用该函数也只有void F280X_HALL3_Read(HALL3 *p)函数,该函数调用完F280X_HALL3_Debounce后,随即便p->EdgeDebounced = 0;那么F280X_HALL3_Next_State_Ptr(p)永远不能执行了。还有,Revolutions小于0的时候,建立HallMap[p->HallMapPointer],这个根本就不能保证把霍尔开关的6个状态保存在这个数组里面, 因为只有当检测到霍尔信号边沿的时候才能保存,HallMapPointer靠脉冲函数来增加,那么如果脉冲产生了N个了,即HallMapPointer都不知道改变到0-5哪个了,电机才转动到出现霍尔信号边沿的出现,简单来说,程序根本不能保证impl1.Out产生一次脉冲,电机就可以转动到出现一个霍尔信号边沿。

这个好像是一个非常大的BUG,不知道我有没有理解错,请指导一下,谢谢。

jie liang1:

你好 我遇到了同样的问题,请问你的疑问解决了吗

在level=1下,程序中 F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced唯一的赋值就是函数F280X_HALL3_Debounce(HALL3 *p),而调用该函数也只有void F280X_HALL3_Read(HALL3 *p)函数,该函数调用完F280X_HALL3_Debounce后,随即便p->EdgeDebounced = 0;那么F280X_HALL3_Next_State_Ptr(p)永远不能执行了。还有,Revolutions小于0的时候,建立HallMap[p->HallMapPointer],这个根本就不能保证把霍尔开关的6个状态保存在这个数组里面, 因为只有当检测到霍尔信号边沿的时候才能保存,HallMapPointer靠脉冲函数来增加,那么如果脉冲产生了N个了,即HallMapPointer都不知道改变到0-5哪个了,电机才转动到出现霍尔信号边沿的出现,简单来说,程序根本不能保证impl1.Out产生一次脉冲,电机就可以转动到出现一个霍尔信号边沿。

这个好像是一个非常大的BUG,不知道我有没有理解错,请指导一下,谢谢。

ray1:

回复 jie liang1:

源程序不行,直接改了之后就可以了。本人的个人意见是TI的例程是有问题的

在level=1下,程序中 F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced唯一的赋值就是函数F280X_HALL3_Debounce(HALL3 *p),而调用该函数也只有void F280X_HALL3_Read(HALL3 *p)函数,该函数调用完F280X_HALL3_Debounce后,随即便p->EdgeDebounced = 0;那么F280X_HALL3_Next_State_Ptr(p)永远不能执行了。还有,Revolutions小于0的时候,建立HallMap[p->HallMapPointer],这个根本就不能保证把霍尔开关的6个状态保存在这个数组里面, 因为只有当检测到霍尔信号边沿的时候才能保存,HallMapPointer靠脉冲函数来增加,那么如果脉冲产生了N个了,即HallMapPointer都不知道改变到0-5哪个了,电机才转动到出现霍尔信号边沿的出现,简单来说,程序根本不能保证impl1.Out产生一次脉冲,电机就可以转动到出现一个霍尔信号边沿。

这个好像是一个非常大的BUG,不知道我有没有理解错,请指导一下,谢谢。

flyangus:

回复 ray1:

发行同样的问题,能否发个例子看看,我的电机转一下就停了

在level=1下,程序中 F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced唯一的赋值就是函数F280X_HALL3_Debounce(HALL3 *p),而调用该函数也只有void F280X_HALL3_Read(HALL3 *p)函数,该函数调用完F280X_HALL3_Debounce后,随即便p->EdgeDebounced = 0;那么F280X_HALL3_Next_State_Ptr(p)永远不能执行了。还有,Revolutions小于0的时候,建立HallMap[p->HallMapPointer],这个根本就不能保证把霍尔开关的6个状态保存在这个数组里面, 因为只有当检测到霍尔信号边沿的时候才能保存,HallMapPointer靠脉冲函数来增加,那么如果脉冲产生了N个了,即HallMapPointer都不知道改变到0-5哪个了,电机才转动到出现霍尔信号边沿的出现,简单来说,程序根本不能保证impl1.Out产生一次脉冲,电机就可以转动到出现一个霍尔信号边沿。

这个好像是一个非常大的BUG,不知道我有没有理解错,请指导一下,谢谢。

liming Liu:

回复 flyangus:

关于HALL3_DRV函数,之前没找到合适的方法,导致在宏定义之前切来切去把自己搞晕了!后来找到一个方法,就是鼠标点在CCS 宏定义上,CCS(5.2)会自动的把全部嵌套显示出来,然后在把显示出的程序拷贝到自己的文件里慢慢研究!

改函数中的Debounced执行如下:

1.首先EdgeDebounced=0,执行读hallgpiod得到hall1.HallGpio

2.判断hall1.HallGpio与HallGpioAccepted的关系,开始hall1.HallGpio(等于hall真实状态如100)不等于HallGpioAccepted(初始是0)

3.继续判断hall1.HallGpio == hall1.HallGpioBuffer,开始肯定也是不等的,道理同上。

4.将hall1.HallGpio 的值写到hall1.HallGpioBuffer缓冲区。

5.第一个循环结束。

6.下一个中断后又从1.开始执行。

7.当执行到3.时,程序开始跳转,因为此时,hall1.HallGpio = hall1.HallGpioBuffer。

8. 因为hall1.DebounceCount<hall1.DebounceAmount,程序不动作,只记录消抖次数。

9.当消抖次数hall1.DebounceCount>=hall1.DebounceAmount(10次=25uS*10,消抖时间)时,

hall1.HallGpio = hall1.HallGpioAccepted,hall状态被确认。

以上不是全部过程,但顺着这个思路下去会知道具体的HALL检测流程的。

 

在level=1下,程序中 F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced唯一的赋值就是函数F280X_HALL3_Debounce(HALL3 *p),而调用该函数也只有void F280X_HALL3_Read(HALL3 *p)函数,该函数调用完F280X_HALL3_Debounce后,随即便p->EdgeDebounced = 0;那么F280X_HALL3_Next_State_Ptr(p)永远不能执行了。还有,Revolutions小于0的时候,建立HallMap[p->HallMapPointer],这个根本就不能保证把霍尔开关的6个状态保存在这个数组里面, 因为只有当检测到霍尔信号边沿的时候才能保存,HallMapPointer靠脉冲函数来增加,那么如果脉冲产生了N个了,即HallMapPointer都不知道改变到0-5哪个了,电机才转动到出现霍尔信号边沿的出现,简单来说,程序根本不能保证impl1.Out产生一次脉冲,电机就可以转动到出现一个霍尔信号边沿。

这个好像是一个非常大的BUG,不知道我有没有理解错,请指导一下,谢谢。

zeyuan du:

老师:

    您好!!请问您关于“

在level=1下,程序中 F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced唯一的赋值就是函数F280X_HALL3_Debounce(HALL3 *p),而调用该函数也只有void F280X_HALL3_Read(HALL3 *p)函数,该函数调用完F280X_HALL3_Debounce后,随即便p->EdgeDebounced = 0;那么F280X_HALL3_Next_State_Ptr(p)永远不能执行了。还有,Revolutions小于0的时候,建立HallMap[p->HallMapPointer],这个根本就不能保证把霍尔开关的6个状态保存在这个数组里面, 因为只有当检测到霍尔信号边沿的时候才能保存,HallMapPointer靠脉冲函数来增加,那么如果脉冲产生了N个了,即HallMapPointer都不知道改变到0-5哪个了,电机才转动到出现霍尔信号边沿的出现,简单来说,程序根本不能保证impl1.Out产生一次脉冲,电机就可以转动到出现一个霍尔信号边沿。

的帖子内容明白了吗??希望您不吝赐教!!

在level=1下,程序中 F280X_HALL3_Next_State_Ptr(p)函数执行的条件是EdgeDebounced不等于0,而EdgeDebounced唯一的赋值就是函数F280X_HALL3_Debounce(HALL3 *p),而调用该函数也只有void F280X_HALL3_Read(HALL3 *p)函数,该函数调用完F280X_HALL3_Debounce后,随即便p->EdgeDebounced = 0;那么F280X_HALL3_Next_State_Ptr(p)永远不能执行了。还有,Revolutions小于0的时候,建立HallMap[p->HallMapPointer],这个根本就不能保证把霍尔开关的6个状态保存在这个数组里面, 因为只有当检测到霍尔信号边沿的时候才能保存,HallMapPointer靠脉冲函数来增加,那么如果脉冲产生了N个了,即HallMapPointer都不知道改变到0-5哪个了,电机才转动到出现霍尔信号边沿的出现,简单来说,程序根本不能保证impl1.Out产生一次脉冲,电机就可以转动到出现一个霍尔信号边沿。

这个好像是一个非常大的BUG,不知道我有没有理解错,请指导一下,谢谢。

JianPing Zhao2:

回复 zeyuan du:

楼上zeyuan du 你好:

     目前我也遇到这个问题了,请问你解决了吗?如果解决的话麻烦帮我解答下吧,谢谢

赞(0)
未经允许不得转载:TI中文支持网 » 关于无刷直流电机程序BLDC3_1的BUG
分享到: 更多 (0)