Ti专家您好,正在看无刷直流BLDC电机BLDC3-1文档与例程.其中电机驱动库中有hall3_drv模块,此模块目的是根据检测到hall信号决定电机换相信号,该模块开始有个hall 信号边沿检测,如果检测到,后面理解没问题。没有检测到,对当前电机位置做debounce,这个debounce在这里什么作用,请给指导!谢谢
zhenyu Fu:
您好,我最近也在看这个debonuce程序,思考了很久也搞不懂是什么意思,请问您现在弄明白了吗?能否给在下指点一下,非常感谢。
Ti专家您好,正在看无刷直流BLDC电机BLDC3-1文档与例程.其中电机驱动库中有hall3_drv模块,此模块目的是根据检测到hall信号决定电机换相信号,该模块开始有个hall 信号边沿检测,如果检测到,后面理解没问题。没有检测到,对当前电机位置做debounce,这个debounce在这里什么作用,请给指导!谢谢
Johnson Chen1:
回复 zhenyu Fu:
楼主你好!
是这样的,debounce是为了去除霍尔信号的抖动问题,相当于按键检测去抖动同样的原理。
一但边缘检测到,即霍尔信号有变化,那么先将霍尔信号状态保存下来。
下次进中断时,如果霍尔信号没有变化,那么就没有检测到边沿,开始进入到debounce程序去做去抖动,如果满足了去抖动检测,那么上次边缘的变化就被接收,因此进行换向处理。
Ti专家您好,正在看无刷直流BLDC电机BLDC3-1文档与例程.其中电机驱动库中有hall3_drv模块,此模块目的是根据检测到hall信号决定电机换相信号,该模块开始有个hall 信号边沿检测,如果检测到,后面理解没问题。没有检测到,对当前电机位置做debounce,这个debounce在这里什么作用,请给指导!谢谢
zhenyu Fu:
回复 Johnson Chen1:
TI专家您好!
我感觉这个debounce程序很奇怪呀,里面没有延时检测,只是比较HallGpio与HallGpioAccepted和HallGpioBuffer的值,但HallGpioAccepted和HallGpioBuffer的值从何而来呢?我看了整个程序,它们只是在初始化的时候被HallGpio赋了初值,然后再也没有在其他地方找到能使它们值改变的代码。那么这个去抖又是怎么进行下去的呢?希望能得到您的指点,非常感谢!
Ti专家您好,正在看无刷直流BLDC电机BLDC3-1文档与例程.其中电机驱动库中有hall3_drv模块,此模块目的是根据检测到hall信号决定电机换相信号,该模块开始有个hall 信号边沿检测,如果检测到,后面理解没问题。没有检测到,对当前电机位置做debounce,这个debounce在这里什么作用,请给指导!谢谢
Johnson Chen1:
回复 zhenyu Fu:
你看的是C24xx的BLDC3_1 Hall例程吗?
里面有地方对hall_GPIO_accepted和hall_GPIO_buf进行赋值啊。
BLDD #hall_GPIO, hall_GPIO_buf ;Save new reading and reset debounce counter
BLDD #hall_GPIO_buf, hall_GPIO_accepted ;Current GPIO reading is now debounced
Ti专家您好,正在看无刷直流BLDC电机BLDC3-1文档与例程.其中电机驱动库中有hall3_drv模块,此模块目的是根据检测到hall信号决定电机换相信号,该模块开始有个hall 信号边沿检测,如果检测到,后面理解没问题。没有检测到,对当前电机位置做debounce,这个debounce在这里什么作用,请给指导!谢谢
zhenyu Fu:
回复 Johnson Chen1:
您好,感谢您的细心指导。这两个变量在Debounce函数中确实有赋值,但还有好多地方我不是很理解。例如变量Revolutions、StallCount、DebounceCount和DebounceAmount。
Revolutions我理解的是电机旋转的圈数,但为什么要给它赋一个-10的初值呢,为什么当Revolutions的值小于0时,就creatmap呢?
对于DebounceCount,我理解的是去抖的次数,而DebounceAmount是去抖次数的上限,可是它们在去抖函数中有什么作用呢?
StallCount按照TI文献上的解释是触发转子旋转的,它跟去抖过程又有什么联系呢?
这个去抖到底是怎么样的一个具体的过程,我有些不明白了。不知这是哪位TI专家编写的代码,但确实让人很难懂呀,希望您能再指点一下,非常感谢。debounce函数如下:
void F281X_EV1_HALL3_Debounce(HALL3 *p){
if (p->HallGpio == p->HallGpioAccepted) // GPIO_UNCHANGED: Current GPIO reading == debounced GPIO reading? { if (p->Revolutions <= 0) // Only create hall map during initial Revolutions F281X_EV1_HALL3_Create_Map(p); p->StallCount -= 1; // Decrement stall counter if (p->StallCount == 0) { p->EdgeDebounced = 0x7FFF; // If motor has stalled, then user trigger to commutate p->StallCount = 0xFFFF; // Reset counter to starting value } } else // GPIO_CHANGED: If not zero, then the motor has moved to a new position. { if (p->HallGpio == p->HallGpioBuffer) // Current GPIO reading == previous GPIO reading? { if (p->DebounceCount >= p->DebounceAmount) // If equal, is current GPIO reading debounced? { p->HallGpioAccepted = p->HallGpioBuffer; // Current GPIO reading is now debounced p->EdgeDebounced = 0x7FFF; // Edge/position debounced, trigger commutation
p->DebounceCount = 0; // Reset debounce counter
if (p->HallMapPointer==0) p->Revolutions += 1; // Increment on every rev (HallMapPointer = 0) } else // DEBOUNCE_MORE p->DebounceCount += 1; // Increment debounce counter } else // NEW_READING { p->HallGpioBuffer = p->HallGpio; // Save new reading and reset debounce counter p->DebounceCount = 0; } }}
Ti专家您好,正在看无刷直流BLDC电机BLDC3-1文档与例程.其中电机驱动库中有hall3_drv模块,此模块目的是根据检测到hall信号决定电机换相信号,该模块开始有个hall 信号边沿检测,如果检测到,后面理解没问题。没有检测到,对当前电机位置做debounce,这个debounce在这里什么作用,请给指导!谢谢
ZiHan Lin:
回复 zhenyu Fu:
Johnson Chen1 你好。
在做消抖处理的过程中,不应该是HALL接口电平有跳变时消抖么?
为什么您的解释说是HALL接口没有电平跳变的时候去做消抖呢??
Ti专家您好,正在看无刷直流BLDC电机BLDC3-1文档与例程.其中电机驱动库中有hall3_drv模块,此模块目的是根据检测到hall信号决定电机换相信号,该模块开始有个hall 信号边沿检测,如果检测到,后面理解没问题。没有检测到,对当前电机位置做debounce,这个debounce在这里什么作用,请给指导!谢谢
ZiHan Lin:
回复 ZiHan Lin:
Johnson Chen1
另外还有一个不明白的地方,为什么hall1.Revolution >= 0时,才是工作在闭环状态??
if (hall1.Revolutions>=0)
ClosedFlag=TRUE;
为什么在hall1.Revolution<0时才建立HALL状态表????
Ti专家您好,正在看无刷直流BLDC电机BLDC3-1文档与例程.其中电机驱动库中有hall3_drv模块,此模块目的是根据检测到hall信号决定电机换相信号,该模块开始有个hall 信号边沿检测,如果检测到,后面理解没问题。没有检测到,对当前电机位置做debounce,这个debounce在这里什么作用,请给指导!谢谢
Johnson Chen1:
回复 ZiHan Lin:
楼主你好,
你说的对,整个有边缘跳变到信号确认都属于debounce的过程。
但是我们如果以下面的说明文档来看的话,Hall_debounce 函数的执行,是需要在边缘跳变以后,判断到和上次信号一样时才会执行。
Ti专家您好,正在看无刷直流BLDC电机BLDC3-1文档与例程.其中电机驱动库中有hall3_drv模块,此模块目的是根据检测到hall信号决定电机换相信号,该模块开始有个hall 信号边沿检测,如果检测到,后面理解没问题。没有检测到,对当前电机位置做debounce,这个debounce在这里什么作用,请给指导!谢谢
Blake Ma:
回复 ZiHan Lin:
您好,ZiHan
Revolution 代表目前霍尔传感器旋转的周期数量。
HALL 状态表只需要在第一个霍尔周期内的 6 个状态中进行建立;在完成第一个霍尔周期后,状态表中各个状态所对应的 GPIO 值已经确定完成,只需要针对每一时刻所得到的的 HallGpio 值在已经生成的状态表中查找,确定该时刻所处的位置。
Ti专家您好,正在看无刷直流BLDC电机BLDC3-1文档与例程.其中电机驱动库中有hall3_drv模块,此模块目的是根据检测到hall信号决定电机换相信号,该模块开始有个hall 信号边沿检测,如果检测到,后面理解没问题。没有检测到,对当前电机位置做debounce,这个debounce在这里什么作用,请给指导!谢谢
zhenyu Fu:
回复 Johnson Chen1:
Johnson Chen1 你好。
在BLDC3_1 Hall例程的HALL3_Read函数中有下面一段代码,由于在最后一行把EdgeDebounced赋值为0,那么else后面的代码永远都执行不了,请问这如何解释呢?
if (p->EdgeDebounced==0) // If motor has not moved then debounce current position. { F281X_EV1_HALL3_Debounce(p); p->CmtnTrigHall = p->EdgeDebounced; // Set Commutation trigger here } else // If current position is debounced, find match in table F281X_EV1_HALL3_Next_State_Ptr(p); // and return pointer to current state. Ptr to be incremented // by MOD6CNT after RET. p->EdgeDebounced = 0; // Reset trigger