Simulink实现无感电机控制:自动代码生成在某国产ARM0定点MCU上
目录
前言
这次尝试了在国产arm0内核的MCU上实现Simulink自动代码生成永磁同步电机无传感控制。机缘巧合之下拿到了一块国产MCU的电机控制板和一个5000RPM的小电机。最后实现了无传感控制,在这里总结下一些经验。
芯片的参数如下:
开发流程
1. 首先根据新的电机参数在浮点的模型上进行仿真验证, 这里选择使用的观测器是龙伯格观测器
新的电机和控制参数调整完后仿真没有问题
2. 不放心可以先在浮点的MCU上跑一把,一般电机参数和实际参数相差不大,仿真没问题,实际运行也没啥问题
3. 把浮点模型定点化
可以参考以下文章链接
Simulink 自动代码生成电机控制:自动定点化Fixed-Point Tool 使用_simulink模型定点化_卡洛斯伊的博客-CSDN博客
定点化的技巧
创建电机的运行实例,不同的输入电压,不出的负载,越多的输入输出实例,定点化后问题越少!
但是高转速可能输入的电流范围太小,大扭矩可能转速不够高,转速范围小。不能完全依赖自动定点化收集的数据。所以可以考虑局部定点化,分每个单独的模块进行定点化。如:
先对电流环进行定点化,或者先对SVPWM模块进行定点化都可以。完整系统进行定点化有很多工况会考虑不到范围。
当全局定点化运行后,如果系统仿真不正常,就需要去对模块进行检查
可通过Scope和log的方式去检查可疑的输出信号。如:
定点化后跑到一定的转速就失控了,不知道是控制环路引起的还是角度引起的。
这个时候可以用电机的实际角度进行控制排除观测器原因,直接用电流环控制,排除速度环。
直接给电流环和实际角度,运行如下,能正常控制,说明电流环没有问题
对比观测器的角度和实际角度,观测器观测的角度和实际角度对不上了,先把问题定位到观测器,理论上来讲观测到的角度要和实际的角度一样。
再进到观测器里面查找是观测器的问题,还是锁相环的问题,经过一翻查找,定位到了下面这个位置。
适当调整范围后:
目标转速也能达到,可以到开发板中进行测试了
有时候在定位数据溢出可以用浮点和定点混合运行测试,如:
仿真后:
浮点和定点的反电动势完全重合在一起,说明定点化的模块在当前工况没有问题。
这种方式,也能快速去定位数据溢出的位置。直到仿真的结果和自己想要的结果一致。就可以直接生成代码并集成了。
代码生成运行演示
也是在ADC里面调用生成的代码,传递电流信息等。
电机
总结
掌握定点化流程方法后,系统越复杂就越不要想着通过几个实例就把整个系统完全定点化好,也需要对一些异常的模块进行分析,仿真以达到数据失真小,且不溢出。Simulink定点化后有些数据是16位的,可以考虑把一些数据用32位表示,以确保其精度。