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

BLDC3_1 hall3 中debounce理解

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      

赞(0)
未经允许不得转载:TI中文支持网 » BLDC3_1 hall3 中debounce理解
分享到: 更多 (0)