STM32 Simulink 自动代码生成电机控制:无传感扩展卡尔曼滤波(EKF)仿真和开发板运行

最近疫情比较严重,居家隔离,突然想要尝试无传感基于卡尔曼滤波器角度速度观测控制自动生成代码生成的实验,有些收获,在这里记录一下。

目录

1.模型搭建和仿真

2.自动代码生成和系统验证

3.总结


1.模型搭建和仿真

Q矩阵:系统噪声

R矩阵:测量噪声

P0矩阵:状态方差

下图是EKF的算法模型,用的是Simulink模型搭建

STM32 Simulink 自动代码生成电机控制:无传感扩展卡尔曼滤波(EKF)仿真和开发板运行_第1张图片

STM32 Simulink 自动代码生成电机控制:无传感扩展卡尔曼滤波(EKF)仿真和开发板运行_第2张图片

为了小电机能正常启动,采用了IF的开环强拉启动后再切闭环的方案,都是通过Simulink实现

STM32 Simulink 自动代码生成电机控制:无传感扩展卡尔曼滤波(EKF)仿真和开发板运行_第3张图片

EKF估计的转速和实际转速(开始是开环强拉,转速会有波动),进入闭环后和实际转速基本一致

STM32 Simulink 自动代码生成电机控制:无传感扩展卡尔曼滤波(EKF)仿真和开发板运行_第4张图片

 EKF估计的角度STM32 Simulink 自动代码生成电机控制:无传感扩展卡尔曼滤波(EKF)仿真和开发板运行_第5张图片

 通过Simulink搭建的EKF仿真没有问题,开始生成代码验证

2.自动代码生成和系统验证

生成代码后集成到Keil的工程里面,以下是Simulink生成的代码

STM32 Simulink 自动代码生成电机控制:无传感扩展卡尔曼滤波(EKF)仿真和开发板运行_第6张图片

 好家伙,在STM32F401(主频84MHz)的平台上,从进中断计算完成到出中断的时间需要84us,PWM的频率是10KHz,后面仔细去查找原因后发现EKF的观测器执行时间太长,比起滑模算法来讲更占用时间STM32 Simulink 自动代码生成电机控制:无传感扩展卡尔曼滤波(EKF)仿真和开发板运行_第7张图片

调整编译器的优化选项:

选择version 6的编译器

STM32 Simulink 自动代码生成电机控制:无传感扩展卡尔曼滤波(EKF)仿真和开发板运行_第8张图片

 选择优化选项-O2:

STM32 Simulink 自动代码生成电机控制:无传感扩展卡尔曼滤波(EKF)仿真和开发板运行_第9张图片

 执行时间从84us直接降到50us左右,电机正常运行。

 运行效果演示:

EKF

3.总结

目前发现基于EKF的观测器计算量比较大,对于低端的MCU来讲压力还是比较大,后面再看看能不能把算法优化,节省时间。

对于不同的电机,需要对

Q矩阵:系统噪声

R矩阵:测量噪声

进行调优

你可能感兴趣的:(STM32,代码生成,simulink,stm32,单片机,matlab)