Other Parts Discussed in Thread: AM26LV32
主题中讨论的其他器件:AM26LV32
你好
我正在进行 BLDC 电机控制。
我的板与具有 controlCARD F28377的演示板非常相似
从 exemple IDDK v2.0获取的软件库。
我的反馈是 QEP +霍尔。
在一个校准步骤中、我获得了电气零和 TopZ 事件之间的 QEP 增量数量。
之后、将 QEP 配置为在 TopZ 事件上复位。 通过重新获取该角度来计算电角、以在真实电角上获得 RawValue = 0。
在正常使用寿命中、我获取 霍尔电容器、并根据电容器向 QEP 计数器应用位置(+校准步骤给出的角度偏移)
在第一个霍尔传感器更改值时、我进行了相同的操作、因为现在、我们可以确保完全转换了两个霍尔组合。
然后在 TopZ 事件中、QEP 计数器设置为0、然后我恰好处于良好位置。
这是正确的、但是在 Hal 电容器上升沿和 TopZ 之间的某个时间、我看到 QepCnt 毫无理由地复位为0! (无顶部 Z FLG.IEL = 0)
我正在使用 IDDK exemple 上提供的 QEP 计算、未设置标志 IndexSyncFlag。
什么可以重置 QEP 计数器、但我的情况中的 TopZ 除外??
QEP 配置如下:
/*------------------ eQEP 解码控制寄存器的初始化状态------------------------------------------------------- */ #define DV_QEP_QDECCTL_INIT_STATE (XCR_X2 + QSRC_Quad_MODE) /*--------------- eQEP 控制寄存器的初始化状态 ----------------------------------------------- */ #define DV_QEP_QEPCTL_INIT_STATE (QEP_emulation_free +\ PCRM_INDEX +\ 0 +\ IEL_Rising +\ QPEN_ENABLE +\ QCLM_TIME_OUT +\ /*UTE_ENABLE*/0) /*----------------- eQEP 位置比较控制寄存器的初始化状态------------------------------------------------------- */ #define DV_QEP_QPOSCTL_INIT_STATE PCE_DISABLE /*------------------------------------------------------- eQEP 捕捉控制寄存器的初始化状态------------------------------------------------------- */ #define DV_QEP_QCAPCTL_INIT_STATE (UPPS_X32 +\ CCPS_X128 +\ CEN 使能)
电角的计算如下:
{ \ float32 ElectThetaTemp; \/* 检查旋转方向*/ \ IF_MotorPosition _iQep.DirectionQep =(* DV_QEP_Regs[2]).QEPSTS.bit.QDF; \ \/* 检查 EQEP1的位置计数器*/ \ if_MotorPosition _iQep.RawTheta =(* DV_QEP_Regs[2]).QPOSCNT - if_MotorPosition _iQep.InitTheta; \ 如果 (IF_MotorPosition _iQep.RawTheta < 0) \ IF_MotorPosition _iQep.RawTheta = IF_MotorPosition _iQep.RawTheta +(* DV_QEP_Regs[2]).QPOSMAX + 1; 否则、如果 (if_MotorPosition _iQep.RawTheta >(* DV_QEP_Regs[2]).QPOSMAX) \ IF_MotorPosition _iQep.RawTheta = IF_MotorPosition _iQep.RawTheta -(* DV_QEP_Regs[2]).QPOSMAX - 1; \ \ /*计算机械角度*/ \ if_MotorPosition _iQep.MechTheta= if_MotorPosition _iQep.MechScale* if_MotorPosition _iQep.RawTheta; \/* 计算电角*/ \ ElectThetaTemp = IF_MotorPosition _iQep.PolePairs*IF_MotorPosition _iQep.MechTheta; \ if_MotorPosition _iQep.ElecTheta =(ElecThetaTemp)-Floor (ElecThetaTemp); \ \/* 检查索引出现情况*/ 如果 ((* DV_QEP_Regs[2]).QFLG.bit.IEL =1) \{ \ IF_MotorPosition _iQep.IndexSyncFlag = 0x00F0; \ IF_MotorPosition _iQep.QepCountIndex =(* DV_QEP_Regs[2]).QPOSILAT; \ ((* DV_QEP_Regs[2]).QCLR.bit.IEL = 1);//清除中断标志* \} \ \/* 检查单位时间超时事件以进行速度计算:*/ \/* 在 INIT 函数中,单位定时器配置为100Hz */ \ if ((* DV_QEP_Regs[2]).QFLG.bit.UTO = 1) \{ \ /***** 低速计算**/ \ if (((* DV_QEP_Regs[2]).QEPSTS.bit.COEF ||(* DV_QEP_Regs[2]).QEPSTS.bit.CDEF))\ {//捕获计数器溢出,因此不执行计算速度*/ \ (* DV_QEP_Regs[2]).QEPSTS.ALL = 0x000C; \} \ 否则、如果((* DV_QEP_Regs[2]).QCPRDLAT!=0xFFFF) \ /*使用捕获计数器值计算低速*/ \ IF_MotorPosition _iQep.QepPeriod =(* DV_QEP_Regs[2]).QCPRDLAT; \} \}
这仅在真正的实际 TopZ 信号之前出现。 以后再也不来了。
感谢你的帮助。
