[电机应用]

AC7811-BLDC无感控制代码调试与测试记录

[复制链接]
836|4
手机看帖
扫描二维码
随时随地手机跟帖
coshi|  楼主 | 2023-3-14 13:05 | 显示全部楼层 |阅读模式
接线注意
供电
对于 AC781x 电机 Demo 板,其 MCU 控制板和功率板的 12V 输入只需接一路即可,如果电机额定电压为 12V,那么将功率板中的功率管供电模式选择跳点(靠近 D5)短接即可,不需要再额外供电;如果电机的额定电压大 12V,那么功率管就需要单独供电:需要将功率板上的功率管供电模式选择跳点(靠近 D5)断开,电源从 J15 端输入。

707976410002616dee.png

一定要注意:驱动板12V的输入不要忘记,预取芯片都是12V供电的。

887966410002c7b2a9.png

跳帽
控制模式选择
97769641000317bd58.png


这个跳帽我试了,全部不接,对电机运转没什么影响。

保护策略调试
过压
修改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互补通道输出波形
900596410003d83046.png

反电动势波形

434036410004283faa.png
启动的电流波形
469606410004744e4f.png

串口打印调试
功能测试
在测试的时候,发现串口打印printf不能用。

经过查找,发现忘记引用debugout文件:
701276410004d0ce3f.png


文件中有对串口2(USB接口)的printf重定向
7572464100052f3970.png


这些都配置完之后,又发现打印出来乱码,怀疑波特率不对,查找到串口初始化里,设置的是115200,修改之后,打印出来还是乱的。

怀疑是不是波特率设置的太低,于是改成230400,打印成功

78864100058c876d.png

操作提示打印
在按键操作时,可实时反馈电机的变化

333566410005ee6fc5.png

一些参数的观察
换相30°延迟时间
1964564100063ea401.png

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

674576410006870d0c.png

速度斜坡
似乎明白了一点,这个g_bldc_speedCmd.speedTargetRamp,其实就是在你设定完目标转速之后逐渐变化的速度值

就像下面这个例子,按下加速按钮,设定转速720r/m,然后速度斜坡开始从初始的655,逐渐增加直到设定的720。

15816410006d91066.png

速度反馈值
通过反电动势获得电机的电频率:

/*!
* @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
871164100077b6ac4.png


所以很有可能是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);
}

48416410007e34f3f.png
设定目标准苏720,速度斜坡与速度反馈都开始逐渐增加,直到设定的转速。

但同时发现,这个速度反馈值确实不是很稳定:有时候会与速度斜坡出现差异。


5596164100086129c0.png
在电流环中:
速度环输出的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);
}

490096410008d88557.png
观察ibusRefPu这个参数

你会发现这个数值的变化非常奇怪,我简单处理了一下数据:

3630764100092e67d5.png

你会发现,稳定之后(稳定之后,不包括预定位、启动、开环的过程,那一段数值更奇怪)这个电流是在不断变化的,慢慢的往上升,又忽然下来,再升,再下来……

后来我又测试了一下,在运行的过程中加速:

3087364100097ef5a6.png

参考电流的变化速度更快了,

明显在设定一个更高的转速之后,电流参考值有一个过调制,

并且速度越快,电流参考值也越来越稳稳定

ACMP反电动势
发现一个问题,用来和三相反电动势进行轮询比较,进行hall输出的对象是谁?

代码里:直接整了一个BEMF_REF

940286410009ea2d67.png

而它对应GPIO_PA10,也就是ADC_IN3这个通道

14280641000a4e276d.png





可我死活找不到这个AD的采样电路(在原理图中)

但我在PCB图里面找到了:也就是这个V_REF
21115641000aa07fb5.png


而且反电动势采样这部分的电路,原理图里好像都没有!!!


————————————————
版权声明:本文为CSDN博主「Iron2222」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43824188/article/details/128542144

使用特权

评论回复

相关帖子

summeryf| | 2023-7-25 10:37 | 显示全部楼层
这两块板子的资料在哪找啊,官网没找到

使用特权

评论回复
pengf| | 2023-9-5 23:47 | 显示全部楼层
全部不接都没什么影响?

使用特权

评论回复
chenqianqian| | 2023-9-7 08:42 | 显示全部楼层
这个波形抖动有点厉害

使用特权

评论回复
fcccc| | 2023-9-9 19:14 | 显示全部楼层
demo也就是能转起来,细看问题还是比较多的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

3301

帖子

4

粉丝