概述
本文是机甲大师机器人控制的系列博客之一。在软件单元测试阶段完成后,进行集成测试。本文内容与功能分析阶段相对应。另外,阅读本文的内容需要一些STM32调试经验。
系列博客:
机甲大师机器人控制(一):概念与流程
机甲大师机器人控制(二):功能分析
机甲大师机器人控制(三):软件架构设计
机甲大师机器人控制(四):软件单元
机甲大师机器人控制(五):软件单元测试
机甲大师机器人控制(六):集成测试
机甲大师机器人控制(七):购买清单
文章目录
- 1 开发阶段
- 2 代码集成
- 2.1 生成代码
- 2.2 STM32工程
- 2.2.1 将模型代码导入STM32工程
- 2.2.2 STM32工程的main文件
- 2.3 编译与下载
- 3 实物测试
- 3.1 按键锁定
- 3.2 底盘平面运动
- 3.2.1 基本运动
- 3.2.2 合成运动
- 3.3 舵机云台二自由度运动
- 3.4 发射器控制
- 4 总结
1 开发阶段
集成测试阶段是开发的最终阶段,会逐个验证功能分析阶段中提出的每一条功能需求。
集成测试阶段会暴露出前几个步骤中带来的问题,因此会反复地回到前面的阶段去修改。
集成测试阶段分两步走。首先是代码集成过程,会将软件单元测试阶段初步验证过的模型生成代码,放到STM32工程中和其他的手写代码、寄存器配置代码一起编译成可执行文件。然后是实物测试过程,会将可执行文件刷到STM32驱动板中,然后通过手柄遥控,测试机甲大师机器人是否按照预期的方式行动。
2 代码集成
2.1 生成代码
Simulink模型是没有办法被编译器编译的,所以首先要从模型生成代码。博主在《Simulink代码生成》专栏里已经写了很多关于代码生成的配置方式,本文就不会细说这些配置,但是仍然有以下部分需要注意。
1)注意输入、输出接口信号的数据字典。本项目中,博主定义输入信号是由外部文件定义的,所以StorageClass要定义为ImportFromFile,同时要填好外部的头文件Manual_Code.h。
输出信号在自身的源文件中定义,所以StorageClass选择为ExportedGlobal。
2)选择正确的tlc文件和硬件。在配置窗口中,要选择Embedded Coder的tlc文件,也就是生成通用的嵌入式C代码。在工作中如果是基于Autosar标准的软件开发,这里就是autosar.tlc。
然后需要注意选择正确的硬件,不然数据类型的字长就对应不上。
3)配置好了以后就可以Ctrl + B生成代码。这里要注意,一定不能手动修改生成的代码,也不要阅读源文件中的step函数(虽然博主在以前的博客中经常这么做,但是对于实际项目生成的代码,就不要去阅读了)。如果需要确认一下接口变量和函数,只要读一下头文件即可。
2.2 STM32工程
一个完整的STM32工程的代码比较复杂,包括了寄存器配置和接口函数等等,已经超出了MBD技术的范围。因此,博主重点讲一下怎样将模型生成的代码嵌入到STM32的工程中,并且可以正确地编译、链接。
2.2.1 将模型代码导入STM32工程
1)在2.1节中,会生成一个C源文件和若干个头文件。不同地Matlab版本,或是不同的Simulink配置项,可能导致生成的头文件数量和博主的不一致,不过这个问题影响不大。
2)在STM32工程中新建一个Group,命名为Embedded_Coder。将生成的MTSR_MotionSolve.c文件添加到这个组中。
3)将模型生成的头文件所在的路径加入到STM32工程配置中。
这样的话,就完成了手动添加代码和头文件。
2.2.2 STM32工程的main文件
STM32工程中的main.c文件代码如下。
#include "BoardLib.h"
#include "OLED_I2C.h"
#include "Manual_Code.h"
#include "MTSR_MotionSolve.h" // 模型生成的头文件
int main (void)
{
PS2_Init(); // 初始化PS2用到的寄存器
Manual_Code_initialize();
// 初始化手写代码
MTSR_MotionSolve_initialize();
// 模型生成的初始化函数
MotA_Interface(VeOUTR_int32_BLWheel); // 初始化电机A转速为0
MotB_Interface(VeOUTR_int32_FLWheel); // 初始化电机B转速为0
MotC_Interface(VeOUTR_int32_BRWheel); // 初始化电机C转速为0
MotD_Interface(VeOUTR_int32_FRWheel); // 初始化电机D转速为0
SSenvo(0,VeOUTR_uint16_Srv0PWM);
// 初始化舵机0位置为1500
SSenvo(1,VeOUTR_uint16_Srv1PWM);
// 初始化舵机1位置为1500
SSenvo(2,VeOUTR_uint16_Srv2PWM);
// 初始化继电器电平为低电平
while(1)
{
if( WaitTrue(0,20) ) //20ms运行一次
{
PS2_Interface();
//获取当前周期的PS2信号
MTSR_MotionSolve_step();
//执行模型的step函数,算出输出参数
//Mot_Interface
MotA_Interface(VeOUTR_int32_BLWheel);
//更新该循环内电机A的转速
MotB_Interface(VeOUTR_int32_FLWheel);
//更新该循环内电机B的转速
MotC_Interface(VeOUTR_int32_BRWheel);
//更新该循环内电机C的转速
MotD_Interface(VeOUTR_int32_FRWheel);
//更新该循环内电机D的转速
//Senvo_Interface
SSenvo(0,VeOUTR_uint16_Srv0PWM);
//更新该循环内舵机0的位置
SSenvo(1,VeOUTR_uint16_Srv1PWM);
//更新该循环内舵机1的位置
SSenvo(2,VeOUTR_uint16_Srv2PWM);
//更新该循环内继电器电平信号状态
}
}
}
main.c文件的整体内容比较简单,通过裸机实现任务调度,也就是一个while(1)无限循环。整个main文件包含三部分:
1)头文件
- Manual_Code.h中包括博主对PS2信号处理以及电机接口处理的手写代码,包含该头文件后,main函数就可以调用PS2函数、电机接口函数和PS2输入信号;
- MTSR_MotionSolve.h是模型生成的头文件,包含该头文件后,main函数就可以调用模型的step函数(也就是模型中计算的过程)和模型输出的全局变量;
2)初始化函数
在while(1)循环之前,需要对PS2、模型、电机和舵机进行初始化。
- PS2_Init是对PS2通讯的初始化,这部分是开发板配套的示例函数;
- Manual_Code_initialize是对手写代码的初始化;
- MTSR_MotionSolve_initialize是模型生成的init函数;
- MotX_Interface是将电机X的转速初始值设为0,也就是停止转动;
- SSenvo是将舵机的位置初始为1500,也就是中间位置;
3)while循环
while循环每隔20ms周期运行一次,是控制策略实现的关键。
- PS2_Interface函数会获取当前PS2传给开发板的信号数值,也就是得知在这个循环内,操作者按下了PS2的哪个按键或者摇杆,该函数会修改PS2按键信号,也就是模型的输入信号;
- MTSR_MotionSolve_step是模型的step函数,会根据输入信号算出输出信号,也就是给电机和舵机函数的参数是多少;
- MotX_Interface和SSenvo是电机、舵机和继电器的控制接口,其参数是上一步中的step函数输出的信号;
每个while循环会不停的更新控制器RAM中的全局变量,然后用接口函数驱动电机、舵机或者继电器。
2.3 编译与下载
熟悉Keil和STM32的博友肯定非常了解编译和下载按钮在哪儿,如下图所示。采用不同的下载器,例如Jlink或者ST-Link,需要进行不同的配置。
这里博主想说明一下,编译是整个DIY过程中的第一道障碍,经常会调试很久才能编译通过。博主在做的过程中就经常遇到错误,比方说漏掉了头文件、或者变量名没匹配正确等。这部分需要比较有耐心,才能解决掉所有的问题。
3 实物测试
实物测试是整个控制开发的最后一步。在这个过程中,可以直观地检测出之前的设计是否成功。本章节中,博主会根据功能分析阶段中提出的4条功能需求,来逐一测试其效果。测试方法就是操作PS2手柄,观察机甲大师机器人是否按照预期的功能去运动。由于博客上传图片大小有限,无法上传动图,测试结果会以图片的方式呈现在后文中。
另外,为了直观地体会这一节的内容,博主将本文的测试过程录制了两端简单的视频。
机甲大师平面运动
机甲大师云台及发射器
3.1 按键锁定
按键锁定功能没法通过动图直观地展现出来,效果就是当PS2上的红绿指示灯同时亮起来的时候,PS2上的其余按键才有效。只有红灯亮起的时候是无效的。
3.2 底盘平面运动
3.2.1 基本运动
1)前后拨动左摇杆的Y通道,底盘实现前进后退运动。
2)左右拨动左摇杆的X通道,底盘实现左右平移运动。
3)前后拨动左摇杆的Y通道,底盘实现绕正前方左右摆尾运动。
4)左右拨动左摇杆的X通道,底盘实现顺时针、逆时针自转运动。
3.2.2 合成运动
合成运动就是PS2摇杆的多个通道生效的运动,博主这里只验证几个比较有用的合成运动。
1)向左上方拨动左摇杆,此时左摇杆的X、Y通道同时生效,底盘向左上方运动。
四种对角线运动(左前、左后、右前、右后)都可以通过左摇杆的XY通道组合来实现。
2)向前拨动左摇杆,同时向右拨动右摇杆,此时左摇杆的Y通道和右摇杆的X通道同时生效,底盘实现右转弯。
另外,左前转弯、左后转弯、右前转弯、右后转弯都可以通过此方法实现。
3.3 舵机云台二自由度运动
PS2右手的4个按键控制舵机云台的二自由度运动。双舵机的二自由度运动可以使水弹枪在一定范围内瞄准目标。
1)按下RL,RR按钮,舵机云台实现在水平平面内左右运动,扇形角度为180度。
2)按下RU,RD按钮,舵机云台实现在竖直平面内上下运动,扇形角度为180度。
3.4 发射器控制
按下手柄右手的R1按键可以使继电器闭合,从而控制水弹枪连续发射。
4 总结
本文是最后的集成测试阶段,在该阶段中会将模型生成代码、编译STM32工程,最后下载到控制器中进行测试。该阶段会暴露出很多问题,如果能够一一解决会有不小的收获。
>>返回个人博客总目录
最后
以上就是健壮摩托为你收集整理的机甲大师机器人控制(六):集成测试1 开发阶段2 代码集成3 实物测试4 总结的全部内容,希望文章能够帮你解决机甲大师机器人控制(六):集成测试1 开发阶段2 代码集成3 实物测试4 总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复