概述
本文是机甲大师机器人控制的系列博客之一。在功能分析的基础上,本文设计软件的架构以及定义输入输出接口。
系列博客:
机甲大师机器人控制(一):概念与流程
机甲大师机器人控制(二):功能分析
机甲大师机器人控制(三):软件架构设计
机甲大师机器人控制(四):软件单元
机甲大师机器人控制(五):软件单元测试
机甲大师机器人控制(六):集成测试
机甲大师机器人控制(七):购买清单
文章目录
- 1 开发阶段
- 2 软件架构设计
- 2.1 顶层子系统
- 2.1.1 子系统模型
- 2.1.2 输入接口
- 2.2 电机控制子系统
- 2.2.1 子系统模型
- 2.2.2 输入接口
- 2.2.3 输出接口
- 2.3 舵机控制子系统
- 2.3.1 子系统模型
- 2.3.2 输入接口
- 2.3.3 输出接口
- 2.4 水弹枪控制子系统
- 2.4.1 子系统模型
- 2.4.2 输入接口
- 2.4.3 输出接口
- 3 数据字典定义
- 4 总结
1 开发阶段
软件架构设计阶段在功能分析阶段之后,会按照功能分析中的每一条来设计架构和输入输出接口。软件架构设计阶段会在Simulink模型中搭建输入输出端口和子系统,但是还不会开始设计最内层子系统中的控制逻辑。
2 软件架构设计
在软件架构设计这个阶段,博主主要做了两件事。首先,根据功能分析阶段提出的4个功能划分模型的子系统和内层子系统;然后,根据子系统功能来确定输入输出接口。Simulink模型文件命名为MTSR_MotionSolve.slx,含义为运动解算,简写为MTSR。
2.1 顶层子系统
2.1.1 子系统模型
在模型最顶层是一个使能子系统,对应功能分析阶段的第1条功能:按键锁定。使能信号为1的时候,子系统被激活;使能信号为0的时候,子系统不被激活,也就达到了锁定按键的效果。如图所示。子系统名为MTSR。
2.1.2 输入接口
虽然顶层的子系统连接了所有输入输出信号,但是从功能分类的角度来说,Mode按键对应的信号以外的其他信号都是和内层子系统相关的,所以本小节只研究使能信号输入接口VeINPR_uint8_PS2MODE。
序号 | 信号名 | 数据类型 | 范围 | 存储类型 |
---|---|---|---|---|
1 | VeINPR_uint8_PS2MODE | uint8 | [0,1] | ImportFromFile |
这里对几个属性做一些简单的解释:
- 信号名:对应的就是在代码中的变量名。这里的命名规范是博主从一个MBD的公众号上看到一名通用的工程师使用的。VeINPR代表它是输入信号,uint8表示了它的数据类型,PS2MODE是它的物理含义,也就是对应着Mode按键;
- 数据类型:Simulink中的常用类型;
- 范围:这里指的不是数据类型所对应的范围,而是底层所允许的范围;
- 存储类型:也就是Simulink中的StorageClass,可以看看博主以前的博客介绍;
VeINPR_uint8_PS2MODE这个信号只有0和1两个取值,当按一下手柄的Mode键的时候,就从0跳转到1或者1跳转到0,同时绿色指示灯也会亮起(1)或者熄灭(0)。ImportFromFile的存储类型表示了这个信号是外部引入的,因为这个变量依赖于STM32工程中的其他文件,把PS2的传输协议解析出来,然后提供接口给模型。
双击进入顶层子系统后,可以看到第二层中又包含了三个子系统,分别是电机控制子系统、舵机控制子系统和水弹枪控制子系统。
2.2 电机控制子系统
2.2.1 子系统模型
电机控制子系统对应功能分析中的第2条:底盘平面运动。该子系统根据4路摇杆通道的输入,控制4个直流电机的转速和转向,从而带动麦轮转动,实现底盘平面运动的功能。子系统名为Motor_Ctrl。
2.2.2 输入接口
电机控制子系统的输入接口是摇杆的4个通道:左摇杆的X通道、左摇杆的Y通道、右摇杆的X通道、右摇杆的Y通道,分别简写为LX,LY,RX,RY。其属性如下表:
序号 | 信号名 | 数据类型 | 范围 | 存储类型 |
---|---|---|---|---|
1 | VeINPR_uint8_PS2LX | uint8 | [0~255] | ImportFromFile |
2 | VeINPR_uint8_PS2LY | uint8 | [0~255] | ImportFromFile |
3 | VeINPR_uint8_PS2RX | uint8 | [0~255] | ImportFromFile |
4 | VeINPR_uint8_PS2RY | uint8 | [0~255] | ImportFromFile |
这4路输入信号和Mode按键的信号一样,都是由STM32中其他的文件解析手柄的通信协议后所输出给模型的,所以也都是ImportFromFile。
4路通道的数据范围都是0~255的整数。0对应着X通道的最左或者Y通道的最上,255对应着X通道的最右或者Y通道的最下,如图所示。
2.2.3 输出接口
研究输出接口之前,首先先研究一下电机接口函数。电机接口函数是STM32驱动板的配套程序中给出的,如下表所示。
序号 | 函数名 | 含义 | 参数类型 | 参数范围 |
---|---|---|---|---|
1 | MotA_Interface(PWM) | 电机A调速接口 | int32 | [-1000~1000] |
2 | MotB_Interface(PWM) | 电机B调速接口 | int32 | [-1000~1000] |
3 | MotC_Interface(PWM) | 电机C调速接口 | int32 | [-1000~1000] |
4 | MotD_Interface(PWM) | 电机D调速接口 | int32 | [-1000~1000] |
电机接口函数内部封装了控制电机的PWM波控制,调用函数只需要传入一个-1000~1000的整型数即可控制直流电机的正反转和转速。绝对值为1000时,电机两端电压等于电源电压。打个比方,如果电机由两节18650电池驱动,那么电池端电压就是7.4V。MotA_Interface(1000)函数就代表给电机加上正向电压7.4V,轮子就会以7.4V所对应的转速正转。
模型的输出接口正是电机接口函数中传入的参数,因此可以很好的将下表和上表对照。
序号 | 信号名 | 数据类型 | 范围 | 存储类型 |
---|---|---|---|---|
1 | VeOUTR_int32_FLWheel | int32 | [-1000~1000] | ExportedGlobal |
2 | VeOUTR_int32_FRWheel | int32 | [-1000~1000] | ExportedGlobal |
3 | VeOUTR_int32_BLWheel | int32 | [-1000~1000] | ExportedGlobal |
4 | VeOUTR_int32_BRWheel | int32 | [-1000~1000] | ExportedGlobal |
以VeOUTR_int32_FLWheel为例,FLWheel代表左前轮(Front-Left),这里的范围-1000~1000只是为了方便调用的一个虚拟值,不代表电压或者转速这样的实际物理含义,也不是真正的PWM波的数值。ExportedGlobal表示这个信号在生成代码对应的变量是在模型对应的源文件定义的,输出给其他文件使用。
在执行完模型的step函数后,4个输出接口就会赋值成解算出来的数值。然后调用4个MotX_Interface(PWM)函数,将输出变量作为参数,就可以控制电机转速和方向。
2.3 舵机控制子系统
2.3.1 子系统模型
电机控制子系统对应功能分析中的第3条:舵机云台二自由度运动。该子系统根据手柄右手的4个按键的输入,控制双舵机的正反转。子系统名为Servo_Ctrl。
2.3.2 输入接口
舵机控制子系统的输入接口是右手4个按钮对应的信号:右手左按键、右手右按键、右手上按键、右手下按键,分别简写为RL,RR,RU,RD。其属性如下表:
序号 | 信号名 | 数据类型 | 范围 | 存储类型 |
---|---|---|---|---|
1 | VeINPR_uint8_PS2RL | uint8 | [0,1] | ImportFromFile |
2 | VeINPR_uint8_PS2RR | uint8 | [0,1] | ImportFromFile |
3 | VeINPR_uint8_PS2RU | uint8 | [0,1] | ImportFromFile |
4 | VeINPR_uint8_PS2RD | uint8 | [0,1] | ImportFromFile |
这四个按键的属性和摇杆的四个通道类似,只是范围只有0和1。按下按键的时候,信号值是1,松开的时候,信号值是0。
按下RL或RR时,0号舵机左右转动;按下RU或RD时,1号舵机上下转动。
2.3.3 输出接口
研究舵机控制子系统输出接口之前,首先先研究一下舵机的接口函数。舵机接口函数也是STM32驱动板的配套程序中给出的,如下表所示。
序号 | 函数名 | 含义 | 参数1类型 | 参数1范围 | 参数2类型 | 参数2范围 |
---|---|---|---|---|---|---|
1 | SSenvo(Num,PWM) | 舵机接口 | uint8 | [0,1,2,3] | uint16 | [500~2500] |
舵机控制原理很简单,给舵机输入一个周期为20MS 的PWM波,其中脉冲宽度从0.5到2.5ms,舵机对应的位置为0度到180度。表中的第一个参数是舵机编号,从0到3;第二个参数是舵机的PWM控制参数,从500到2500,也就是us为单位的脉宽。
模型的输出接口就是舵机控制函数的第二个参数,对照表格如下:
序号 | 信号名 | 数据类型 | 范围 | 存储类型 |
---|---|---|---|---|
1 | VeOUTR_uint16_Srv0PWM | uint16 | [500~2500] | ExportedGlobal |
2 | VeOUTR_uint16_Srv1PWM | uint16 | [500~2500] | ExportedGlobal |
在执行完模型的step函数后,2个舵机输出接口就会赋值成解算出来的数值。然后调用2次SSenvo(Num,PWM)函数,将输出变量作为第二个参数,就可以控制舵机在这个周期内的目标位置。
2.4 水弹枪控制子系统
2.4.1 子系统模型
水弹枪控制子系统对应功能分析中的第4条: 发射器控制。该子系统根据手柄右手顶部的R1按键的输入,控制继电器的断开和闭合。子系统名为Gun_Ctrl。
2.4.2 输入接口
水弹枪控制子系统的输入接口是右手顶部的按键,简写为R1。这里的名称直接沿用了按键上面刻的字样。其属性如下表:
序号 | 信号名 | 数据类型 | 范围 | 存储类型 |
---|---|---|---|---|
1 | VeINPR_uint8_PS2R1 | uint8 | [0,1] | ImportFromFile |
这里的按键采用了右手顶部的第一个按键R1,当按下按键的时候,VeINPR_uint8_PS2R1为1,松开的时候,VeINPR_uint8_PS2R1为0。
2.4.3 输出接口
在STM32中,可以配置引脚的GPIO寄存器,来实现该引脚输出高电平或者低电平。这里博主偷了个懒,没有在底层做这样的配置,而是直接沿用了舵机接口函数SSenvo(Num,PWM),来控制引脚输出高低电平给继电器(3.3v或0v)。
上一小节提到了,舵机接口函数的第二个参数PWM的范围是500~2500。事实上,如果对舵机控制和PWM输出比较了解的话,可以将这个参数设为接近20000的数,然后舵机引脚就会输出接近3.3v的高电平。具体原因博主就不再展开说,有兴趣可以自己做做舵机实验。
根据上面的思路,就可以定义模型的输出接口:
序号 | 信号名 | 数据类型 | 范围 | 存储类型 |
---|---|---|---|---|
1 | VeOUTR_uint16_Srv2PWM | uint16 | [500,19500] | ExportedGlobal |
从命名上看,还是把接口做成2号舵机的名称。但是,取值范围是500和19500两个整数。取值为500的时候,引脚输出0.1v左右的低电平,继电器保持断开;取值为19500时,引脚输出3.2v左右的高电平,继电器闭合。也就是说,继电器处于常断开的状态,按下R1按键的时候,继电器闭合,水弹枪开始连续发射。
3 数据字典定义
在第二章中,根据架构划分,建立好了各个子系统和输入输出端口。根据其中对输入输出的属性描述,可以在这个阶段顺便建立一下输入输出接口的数据字典。关于数据字典的建立方法,可以参考博主以前的博客《Simulink代码生成:数据字典的建立、关联模型》。
数据字典中如图所示,主要是需要定义名称、类型和存储类型(StorageClass)。对于范围(最大最小值)只是一个概念性的,不需要在数据字典中定义。
4 总结
本文是MBD开发机甲大师控制策略的第三篇,主要设计了模型的架构以及定义了接口相关的属性。下一步会在每个子系统中建立具体的控制策略,也就是软件单元设计阶段。
>>返回个人博客总目录
最后
以上就是震动棒棒糖为你收集整理的机甲大师机器人控制(三):软件架构设计1 开发阶段2 软件架构设计3 数据字典定义4 总结的全部内容,希望文章能够帮你解决机甲大师机器人控制(三):软件架构设计1 开发阶段2 软件架构设计3 数据字典定义4 总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复