主控板STM32F302R8+驱动板X-NUCLEO-IHM07M1+直流减速电机37GB3530,实现电机的正反转驱动。区别于上两章节,本章节工具链采用STM32CubeMX+Matlab/Simulink+Keil,在STM32CubeMX中配置底层,在Matlab/Simulink写应用层,在Keil环境中写应用层与底层的代码接口,并完成程序的集成。
驱动直流电机转动,并实现直流电机的换向控制;按下一次按键电机正转,LED亮;再按一次按键电机停止,LED灭;再按一次按键电机反转,LED亮;再按一次按键电机停止,LED灭,以此循环。用到的控制信号与控制板STM32F302R8对应的引脚关系如下表所示。

控制板:STM32F302R8
驱动板:X-NUCLEO-IHM07M1
直流电机:37GB3530,额定功率10W,额定电压12V,额定电流0.3A
1、RCC设置为外接时钟,72MHz
2、PA8、PA9、PC10、PC11设置为推挽输出,无上下拉电阻,高速,初始化状态值为0;PB13设置为推挽输出,下拉电阻,高速,初始化状态值为0;PC13设置为输入,无上下拉电阻。
3、IDE设置为MDK-RAM,在Keil环境中编写应用层与底层的接口函数,并在Keil环境中完成应用层代码与底层代码的集成。





编程思路:检测按键状态,通过按键状态执行不同的电机运行状态



当检测到按键的下降沿时,Mode++,Mode可能的值为:0,1,2,3,通过不同的Mode值执行不同的电机运行状态。

默认在停止状态并使能桥臂1和桥臂2,如果Mode=1,电机正转;Mode=2,电机停止;Mode=3,电机反转;如果Mode=4电机停止,以此循环。


设定了5个下降沿,Mode值得变化为:1 2 3 0 1 ,电机依次正转 停止 反转 停止 正转

经过仿真验证,符合自己的逻辑设计需求
底层与应用层接口信号的名称及数据类型已经在Keil环境设置完成,设置如下输入输出信号类型:


其余输出信号均参考EN1_State设置

STM32F302R8芯片为ARM Cortex-M4内核

求解器设置为离散


Ctrl+B进行代码生成

注:因为在Stateflow中使用了falling函数,代码生成文件多了rt_zcfcn.c;rt_zcfcn.h;zero_crossing_types.h三个文件

将Matlab生成的代码文件夹复制到底层生成的工程下:APP_DCMotor

在工程中将APP_DCMotor目录中的.c文件都添加进工程

添加头文件路径
注:此时编译会报错,未定义“solver_zc.h”头文件,该头文件在Matlab安装路径下面,可以直接把该文件粘贴复制到APP_DCMotor文件夹下,也可以将改文件的路径进行添加。


编写驱动函数

在主函数中调用Matlab生成代码中的函数,APP_Motor_initialize()为模型初始化函数;APP_Motor_step()模型函数(执行该函数一次,相当于在Matlab中运行该模型一次),根据APP_Motor_step()函数的运算结果,进行MCU引脚赋值进行电机驱动,在Matlab中设置模型10ms运行一次,所以在工程下也要确保APP_Motor_step()函数10ms运行一次,在While循环里加入10ms延时,近似模拟10ms运行APP_Motor_step()函数一次

本章节采用STM32CubeMX+Matlab/Simulink+Keil工具链完成直流电机的驱动及方向控制,为后续章节的分析奠定基础。