基本上配置方式和之前文章使用simulink进行stm32开发1里一样也是先使用Cubemx对引脚进行配置。这次为了控制4个电机,需要4路PWM通道,以及用于控制驱动引脚的8路GPIO口(每个电机由2个接口控制电机转动方向),此外,因为使用的配置项大概如图(其他一些预留引脚是为了后面功能服务的,此处不赘述) 主要使用的是TIM3通道,这里为了节省资源,4路pwm波全部由TIM3配置,配置如图所示 然后配置8路gpio通道用于控制l298驱动,每个电机由两路控制,配置如下
接着开始搭建simulink的模块,因为配置了simulink模块与cubemx的连接(使用Simulink进行stm32开发1),可以拉出模块tim和gpio模块并配置如下: 上面是pwm的驱动模块,要记得设置为占空比控制
下面是gpio的控制模块。 gpio是为了控制L298n驱动板的,逻辑如下
为了使用一些需要的变量类型和变量名称,需要配置数据字典 点击这个按钮进入新建一个sldd文件,我这里放在了和工程的文件夹内,在进行一些模块移植的时候可以进行添加。 配置的几个变量如下 主要是TRUE和FALSE这种布尔值,另外加了一个motion的枚举类型,小电机的动作类型根据逻辑分类不多,一共也就主要为了把motion的几个值都放在一起管理,另外要注意的是为了让这些变量类型在生成代码的时候能够在代码里生成,,要把数据存储的类型选为exported或exportedGlobal。
根据控制l298的逻辑,需要建立一个控制gpio的函数,这里我设置了一个simulink function叫 MotorCtrl如下 这里用了一个switch case的逻辑区分停止,顺时针转动,逆时针转动几种小电机的运行模式,然后输出控制的两个引脚的值,在这里设置的几个引脚的赋值类型都是布尔值boolean,case内部执行如下(例:电机停止) 然后,通过function caller的方式调用该函数
上面的gpio的控制块加上控制pwm波占空比(电机速度)的块就可以封装为一个建议的小车电机控制模块了(由于小车的满载转速还不确定,因此这里控制速度的变量暂时没有加增益进行匹配) 最后把该模块封装为了如下的形式
为了验证该模型的正确性,这里测试4个电机的速度和转动方向,设置不同的pwm占空比,其中两个电机正转,两个为反转,如图 其中控制转动方向的变量用我们设置的数据字典里的值进行代替,即 然后为了能在程序里用全局变量表示四个电机的占空比(速度),这里设置了4个signal 的名字 设置为全局输出 接着,生成代码 得到代码,这里本人发现有一个ert_main的文件和本身的main文件冲突了,然后又回到simulink设置 将generate an example那个选项的√去掉,再生成,over 这里用一个逻辑分析仪看几个通道的pwm控制是否成功,补张图