接线注意

供电

对于 AC781x 电机 Demo 板,其 MCU 控制板和功率板的 12V 输入只需接一路即可,如果电机额定电压为 12V,那么将功率板中的功率管供电模式选择跳点(靠近 D5)短接即可,不需要再额外供电;如果电机的额定电压大 12V,那么功率管就需要单独供电:需要将功率板上的功率管供电模式选择跳点(靠近 D5)断开,电源从 J15 端输入。
image.png
一定要注意:驱动板12V的输入不要忘记,预取芯片都是12V供电的。
image.png

跳帽

控制模式选择
image.pngimage.png
这个跳帽我试了,全部不接,对电机运转没什么影响。

保护策略调试

过压

修改MAX_BUS_VOLTAGE为25,同时调大输入电压,使其超过25V,看看会不会保护

  1. #define MAX_BUS_VOLTAGE 25 /*!< Maximum operating voltage of the controller.Unit:V */

测试正常,电机立马停转。

欠压

  1. #define MIN_BUS_VOLTAGE 9 /*!< Minimum operating voltage of the controller.Unit:V */

调小输出电压使其小于9V,电机停转

过流

  1. #define BLDC_OVER_CURRENT_THRESHOLD 20 /*!< Bus current overcurrent protection threshold, unitS: A*/

可以调整为0.1A试一试,不行
空载下,电流太小了,而电流阈值设置最小为1A,没法弄。

波形测试

PWM互补通道输出波形

image.png

反电动势波形

image.png

启动的电流波形

image.png

串口打印调试

功能测试

在测试的时候,发现串口打印printf不能用。
经过查找,发现忘记引用debugout文件:
image.png
文件中有对串口2(USB接口)的printf重定向
image.png
这些都配置完之后,又发现打印出来乱码,怀疑波特率不对,查找到串口初始化里,设置的是115200,修改之后,打印出来还是乱的。
怀疑是不是波特率设置的太低,于是改成230400,打印成功
image.png

操作提示打印

在按键操作时,可实时反馈电机的变化
image.png

一些参数的观察

换相30°延迟时间

image.png
随着速度的增加,换相延时时间明显减小:
image.png

速度斜坡

似乎明白了一点,这个g_bldc_speedCmd.speedTargetRamp,其实就是在你设定完目标转速之后逐渐变化的速度值
就像下面这个例子,按下加速按钮,设定转速720r/m,然后速度斜坡开始从初始的655,逐渐增加直到设定的720。
image.png

速度反馈值

通过反电动势获得电机的电频率:

  1. /*!
  2. * @brief get motor elec freq in bldc control with sensorless.
  3. *
  4. * @param[in] motorDir: motor run direction
  5. * @return elec freq in Q15
  6. */
  7. int16_t BLDC_Bemf_SpeedGet(int16_t motorDir)
  8. {
  9. uint32_t s_elecFreq = 0;
  10. uint32_t s_elecFreqPu = 0;
  11. if (g_bemfControl.aveChangePhaseTime)//只要平均换相时间不为0
  12. {
  13. s_elecFreq = 166667 / (int32_t)(g_bemfControl.aveChangePhaseTime * TIMER_XUS);
  14. /* 166667 refers 6 sector time in us, 166667 = (6 / 10^-6) */
  15. //这个也比较好理解 aveChangePhaseTime是平均换相间隔(其实是一个次数值) 所以要乘以时间单元TIMER_XUS
  16. //得到的才是换一次相,费的时间(单位是us)
  17. //转一圈6次换相 所以还要*6,再把us转化成s 就是上面这个公式
  18. }
  19. s_elecFreqPu = motorDir * MATH_IQ(s_elecFreq * 1.0 / BASE_FREQ);//转化成Q15格式*2^15
  20. return s_elecFreqPu;

再把电频率转化成转速。

  1. void BLDC_ASR_FbkUpdate(SPEED_RAMP_TYPE *command)
  2. {
  3. #if (defined BLDC_HALL)
  4. command->speedFbk = BLDC_Hall_SpeedGet(pBldcVarsCfg->motorDir);
  5. #elif (defined BLDC_SENSORLESS)
  6. command->speedFbk = BLDC_Bemf_SpeedGet(pBldcVarsCfg->motorDir);
  7. #else
  8. #endif
  9. command->speedFbkRpm = MATH_Mpy(command->speedFactor, command->speedFbk);
  10. printf("speedFbkRpm:%f \r\n", (float)command->speedFbkRpm);
  11. }

所以这里的速度反馈值来自于反电动势的平均换相时间。
但测试中发现,你设置的是1310r/m,可稳定之后,反馈回来的速度值确是1199r/m
image.pngimage.png
所以很有可能是PI控制器那里出现问题

PI参数

在速度环中:

  1. void BLDC_SpeedLoop_Calculate(SPEED_RAMP_TYPE *speed, PID_TYPE *pid, BLDC_VARS_CTRL *bldcCtrl)
  2. {
  3. Set_BLDC_PidRef(pid, speed->speedTargetRamp);
  4. printf("speedTargetRamp:%f \r\n", (float)speed->speedTargetRamp / 10);
  5. Set_BLDC_PidFbk(pid, speed->speedFbk);
  6. printf("speedFbk:%f \r\n", (float)speed->speedFbk / 10);
  7. bldcCtrl->ibusRefPu = PID_Calculate(pid);
  8. }

image.pngimage.png
设定目标准苏720,速度斜坡与速度反馈都开始逐渐增加,直到设定的转速。
但同时发现,这个速度反馈值确实不是很稳定:有时候会与速度斜坡出现差异。
image.png

在电流环中:

速度环输出的ibusRefPu,其实就是电流环输入的参考值

  1. void BLDC_SpeedLoop_Calculate(SPEED_RAMP_TYPE *speed, PID_TYPE *pid, BLDC_VARS_CTRL *bldcCtrl)
  2. {
  3. Set_BLDC_PidRef(pid, speed->speedTargetRamp);
  4. //printf("speedTargetRamp:%f \r\n", (float)speed->speedTargetRamp / 10);
  5. Set_BLDC_PidFbk(pid, speed->speedFbk);
  6. //printf("speedFbk:%f \r\n", (float)speed->speedFbk / 10);
  7. bldcCtrl->ibusRefPu = PID_Calculate(pid);
  8. printf("ibusRefPu:%f \r\n", (float)bldcCtrl->ibusRefPu);
  9. }

image.png
观察ibusRefPu这个参数
你会发现这个数值的变化非常奇怪,我简单处理了一下数据:
image.png
你会发现,稳定之后(稳定之后,不包括预定位、启动、开环的过程,那一段数值更奇怪)这个电流是在不断变化的,慢慢的往上升,又忽然下来,再升,再下来……
后来我又测试了一下,在运行的过程中加速:
image.png
参考电流的变化速度更快了,
明显在设定一个更高的转速之后,电流参考值有一个过调制,
并且速度越快,电流参考值也越来越稳稳定

ACMP反电动势

发现一个问题,用来和三相反电动势进行轮询比较,进行hall输出的对象是谁?
代码里:直接整了一个BEMF_REF
image.png
而它对应GPIO_PA10,也就是ADC_IN3这个通道
image.pngimage.png
可我死活找不到这个AD的采样电路(在原理图中)
但我在PCB图里面找到了:也就是这个V_REF
image.png
而且反电动势采样这部分的电路,原理图里好像都没有!!!