接线注意
供电
对于 AC781x 电机 Demo 板,其 MCU 控制板和功率板的 12V 输入只需接一路即可,如果电机额定电压为 12V,那么将功率板中的功率管供电模式选择跳点(靠近 D5)短接即可,不需要再额外供电;如果电机的额定电压大 12V,那么功率管就需要单独供电:需要将功率板上的功率管供电模式选择跳点(靠近 D5)断开,电源从 J15 端输入。
一定要注意:驱动板12V的输入不要忘记,预取芯片都是12V供电的。
跳帽
控制模式选择
这个跳帽我试了,全部不接,对电机运转没什么影响。
保护策略调试
过压
修改MAX_BUS_VOLTAGE为25,同时调大输入电压,使其超过25V,看看会不会保护
#define MAX_BUS_VOLTAGE 25 /*!< Maximum operating voltage of the controller.Unit:V */
测试正常,电机立马停转。
欠压
#define MIN_BUS_VOLTAGE 9 /*!< Minimum operating voltage of the controller.Unit:V */
调小输出电压使其小于9V,电机停转
过流
#define BLDC_OVER_CURRENT_THRESHOLD 20 /*!< Bus current overcurrent protection threshold, unitS: A*/
可以调整为0.1A试一试,不行
空载下,电流太小了,而电流阈值设置最小为1A,没法弄。
波形测试
PWM互补通道输出波形
反电动势波形
启动的电流波形
串口打印调试
功能测试
在测试的时候,发现串口打印printf不能用。
经过查找,发现忘记引用debugout文件:
文件中有对串口2(USB接口)的printf重定向
这些都配置完之后,又发现打印出来乱码,怀疑波特率不对,查找到串口初始化里,设置的是115200,修改之后,打印出来还是乱的。
怀疑是不是波特率设置的太低,于是改成230400,打印成功
操作提示打印
在按键操作时,可实时反馈电机的变化
一些参数的观察
换相30°延迟时间
随着速度的增加,换相延时时间明显减小:
速度斜坡
似乎明白了一点,这个g_bldc_speedCmd.speedTargetRamp,其实就是在你设定完目标转速之后逐渐变化的速度值
就像下面这个例子,按下加速按钮,设定转速720r/m,然后速度斜坡开始从初始的655,逐渐增加直到设定的720。
速度反馈值
通过反电动势获得电机的电频率:
/*!
* @brief get motor elec freq in bldc control with sensorless.
*
* @param[in] motorDir: motor run direction
* @return elec freq in Q15
*/
int16_t BLDC_Bemf_SpeedGet(int16_t motorDir)
{
uint32_t s_elecFreq = 0;
uint32_t s_elecFreqPu = 0;
if (g_bemfControl.aveChangePhaseTime)//只要平均换相时间不为0
{
s_elecFreq = 166667 / (int32_t)(g_bemfControl.aveChangePhaseTime * TIMER_XUS);
/* 166667 refers 6 sector time in us, 166667 = (6 / 10^-6) */
//这个也比较好理解 aveChangePhaseTime是平均换相间隔(其实是一个次数值) 所以要乘以时间单元TIMER_XUS
//得到的才是换一次相,费的时间(单位是us)
//转一圈6次换相 所以还要*6,再把us转化成s 就是上面这个公式
}
s_elecFreqPu = motorDir * MATH_IQ(s_elecFreq * 1.0 / BASE_FREQ);//转化成Q15格式*2^15
return s_elecFreqPu;
再把电频率转化成转速。
void BLDC_ASR_FbkUpdate(SPEED_RAMP_TYPE *command)
{
#if (defined BLDC_HALL)
command->speedFbk = BLDC_Hall_SpeedGet(pBldcVarsCfg->motorDir);
#elif (defined BLDC_SENSORLESS)
command->speedFbk = BLDC_Bemf_SpeedGet(pBldcVarsCfg->motorDir);
#else
#endif
command->speedFbkRpm = MATH_Mpy(command->speedFactor, command->speedFbk);
printf("speedFbkRpm:%f \r\n", (float)command->speedFbkRpm);
}
所以这里的速度反馈值来自于反电动势的平均换相时间。
但测试中发现,你设置的是1310r/m,可稳定之后,反馈回来的速度值确是1199r/m
所以很有可能是PI控制器那里出现问题
PI参数
在速度环中:
void BLDC_SpeedLoop_Calculate(SPEED_RAMP_TYPE *speed, PID_TYPE *pid, BLDC_VARS_CTRL *bldcCtrl)
{
Set_BLDC_PidRef(pid, speed->speedTargetRamp);
printf("speedTargetRamp:%f \r\n", (float)speed->speedTargetRamp / 10);
Set_BLDC_PidFbk(pid, speed->speedFbk);
printf("speedFbk:%f \r\n", (float)speed->speedFbk / 10);
bldcCtrl->ibusRefPu = PID_Calculate(pid);
}
设定目标准苏720,速度斜坡与速度反馈都开始逐渐增加,直到设定的转速。
但同时发现,这个速度反馈值确实不是很稳定:有时候会与速度斜坡出现差异。
在电流环中:
速度环输出的ibusRefPu,其实就是电流环输入的参考值
void BLDC_SpeedLoop_Calculate(SPEED_RAMP_TYPE *speed, PID_TYPE *pid, BLDC_VARS_CTRL *bldcCtrl)
{
Set_BLDC_PidRef(pid, speed->speedTargetRamp);
//printf("speedTargetRamp:%f \r\n", (float)speed->speedTargetRamp / 10);
Set_BLDC_PidFbk(pid, speed->speedFbk);
//printf("speedFbk:%f \r\n", (float)speed->speedFbk / 10);
bldcCtrl->ibusRefPu = PID_Calculate(pid);
printf("ibusRefPu:%f \r\n", (float)bldcCtrl->ibusRefPu);
}
观察ibusRefPu这个参数
你会发现这个数值的变化非常奇怪,我简单处理了一下数据:
你会发现,稳定之后(稳定之后,不包括预定位、启动、开环的过程,那一段数值更奇怪)这个电流是在不断变化的,慢慢的往上升,又忽然下来,再升,再下来……
后来我又测试了一下,在运行的过程中加速:
参考电流的变化速度更快了,
明显在设定一个更高的转速之后,电流参考值有一个过调制,
并且速度越快,电流参考值也越来越稳稳定
ACMP反电动势
发现一个问题,用来和三相反电动势进行轮询比较,进行hall输出的对象是谁?
代码里:直接整了一个BEMF_REF
而它对应GPIO_PA10,也就是ADC_IN3这个通道
可我死活找不到这个AD的采样电路(在原理图中)
但我在PCB图里面找到了:也就是这个V_REF
而且反电动势采样这部分的电路,原理图里好像都没有!!!
————————————————
版权声明:本文为CSDN博主「Iron2222」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43824188/article/details/128542144
|