玖叶教程网

前端编程开发入门

「话说嵌入式」STM32控制算法验证之Matlab PIL

当我们在开发一些控制器高级算法时通常的做法可能是利用像Matlab这种高级编程语言先在PC上进行模拟仿真,没有问题后,再将算法移植到设备上。

在阿圆的上一篇文章里《「话说嵌入式」STM32算法的翅膀之MATLAB》也有提到,ST己经提供了由Matlab直接生成算法,并生到KEIL工程的方法。如果现在算法己经在PC上仿真完成,也己经下载到设备上了,那么我们能保证生成的算法在真实的硬件上运行也是正确的吗?或者说,就算算法是正确的,但我们想使用不同的测试数据对控制器上的算法进行测试时又该怎么做?

今天呢阿圆就带大家瞄一眼复杂算法或系统的在硬件上的代码生成及验证。

事实上这些应用可能在汽车领域,航空领域己经广泛应用了(哟,貌似是个很高级的主题哟)。

好了废话不多说,开始今天的实验,大家需要准备好的环境是

  • Matlab R2016b 64Bit in Windows 10

  • STM32MatTarget_4.4.0_setup.zip

  • Keil,STM32CubeMX

  • STM32F437ZGT6开发板,ST-LINKV2及串口线一条

这里需要注意的是ST官网上最新版本的STM32-MAT/TARGET是4.4.2版本的,需要支持SIMULINK 8.8,R2016b是不支持的。

首先找到STM32-MAT的安装路径,并进入到

E:\MATLAB\STM32-MAT\STM32\STM32demos\PIL\Filter

将以下文件全部复制到Matlab的workspace当中

其次直接在Matlab中打开Test_PIL_IIR_Filter.mdl

从左往右看,输入是一个testdata,中间经过了一个增益为1000的放大器后分别输入到两个滤波器,这里需要注意的是这两个滤波器的框图是一模一样的,不同的是上面的滤波器是运行在STM32F437当中,而下面的滤波器则是在Matlab的仿真。

这里要注意的是x0.001和x0.1只是名字而已,真正的增益是相同的,都为0.001。

理论上两个滤波器的输出需要完全一致,也就是说在示波器中看到差分值要为0。

我们先点击示波器图示,打开示波器

然后点运行

接下来需要配置PC串口和STM32F437ZGT6通信的串口

在配置好通信串口后就会打开STM32CubeMX,因为在上面我们配置了180MHz的时钟频率,所以在STM32CubeMX中也要配置好相应的频率。

有点奇怪的是,默认生成的串口参数并不对,需要设置成8N1模式

串口,时钟都设置好,下面就可以进行工程的生成。

点击编译,但阿圆发现编译并没有成功,有两个宏没有定义

#define CA_CHECK_FLOATING_POINT_ENABLED 0

#define CA_CHECK_LONG_LONG_ENABLED 0

添加两上定义就没问题了~ 再编译运行,到此设备端就准备好了,

回到Matlab,我们可以直接在Matlab那儿点Continue

进行就可以在刚才打开的示波器中看到原始数据,PIL输出的结果以及PIL与Matlab仿真的差值。从示波器可以看到仿真的结果和算法在STM32F437上生成运行是一致的~

在上一篇的文章《「话说嵌入式」STM32算法的翅膀之MATLAB》评论有人问要怎么用Matlab的算法,今天就可以直接回答啦~按上一篇文章里的方法新建好工程后,以本文章为例,就可以直接将matlab的仿真那个框图Reference Simulation model拖到新的工程当中配置好数据的格式,即可

生成工程的方式还是参照上一篇文章啦,很简单的。(图上只是了为演示目的使用,并非正确的使用方式 )

今天的分享就到这里,谢谢大家!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言