在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 你好:
目前我也遇到这个问题了,请问你解决了吗?如果解决的话麻烦帮我解答下吧,谢谢