机甲大师机器人控制(六):集成测试

本文是机甲大师机器人控制的系列博客之一。在软件单元测试阶段完成后,进行集成测试。本文内容与功能分析阶段相对应。另外,阅读本文的内容需要一些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 开发阶段

集成测试阶段是开发的最终阶段,会逐个验证功能分析阶段中提出的每一条功能需求。
机甲大师机器人控制(六):集成测试_第1张图片
集成测试阶段会暴露出前几个步骤中带来的问题,因此会反复地回到前面的阶段去修改。

集成测试阶段分两步走。首先是代码集成过程,会将软件单元测试阶段初步验证过的模型生成代码,放到STM32工程中和其他的手写代码、寄存器配置代码一起编译成可执行文件。然后是实物测试过程,会将可执行文件刷到STM32驱动板中,然后通过手柄遥控,测试机甲大师机器人是否按照预期的方式行动。

2 代码集成

2.1 生成代码

Simulink模型是没有办法被编译器编译的,所以首先要从模型生成代码。博主在《Simulink代码生成》专栏里已经写了很多关于代码生成的配置方式,本文就不会细说这些配置,但是仍然有以下部分需要注意。

1)注意输入、输出接口信号的数据字典。本项目中,博主定义输入信号是由外部文件定义的,所以StorageClass要定义为ImportFromFile,同时要填好外部的头文件Manual_Code.h。
机甲大师机器人控制(六):集成测试_第2张图片
输出信号在自身的源文件中定义,所以StorageClass选择为ExportedGlobal。
机甲大师机器人控制(六):集成测试_第3张图片
2)选择正确的tlc文件和硬件。在配置窗口中,要选择Embedded Coder的tlc文件,也就是生成通用的嵌入式C代码。在工作中如果是基于Autosar标准的软件开发,这里就是autosar.tlc。
机甲大师机器人控制(六):集成测试_第4张图片
然后需要注意选择正确的硬件,不然数据类型的字长就对应不上。
机甲大师机器人控制(六):集成测试_第5张图片
3)配置好了以后就可以Ctrl + B生成代码。这里要注意,一定不能手动修改生成的代码,也不要阅读源文件中的step函数(虽然博主在以前的博客中经常这么做,但是对于实际项目生成的代码,就不要去阅读了)。如果需要确认一下接口变量和函数,只要读一下头文件即可。
机甲大师机器人控制(六):集成测试_第6张图片

2.2 STM32工程

一个完整的STM32工程的代码比较复杂,包括了寄存器配置和接口函数等等,已经超出了MBD技术的范围。因此,博主重点讲一下怎样将模型生成的代码嵌入到STM32的工程中,并且可以正确地编译、链接。

2.2.1 将模型代码导入STM32工程

1)在2.1节中,会生成一个C源文件和若干个头文件。不同地Matlab版本,或是不同的Simulink配置项,可能导致生成的头文件数量和博主的不一致,不过这个问题影响不大。
机甲大师机器人控制(六):集成测试_第7张图片
2)在STM32工程中新建一个Group,命名为Embedded_Coder。将生成的MTSR_MotionSolve.c文件添加到这个组中。
机甲大师机器人控制(六):集成测试_第8张图片
3)将模型生成的头文件所在的路径加入到STM32工程配置中。
机甲大师机器人控制(六):集成测试_第9张图片
这样的话,就完成了手动添加代码和头文件。

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)头文件

  1. Manual_Code.h中包括博主对PS2信号处理以及电机接口处理的手写代码,包含该头文件后,main函数就可以调用PS2函数、电机接口函数和PS2输入信号;
  2. MTSR_MotionSolve.h是模型生成的头文件,包含该头文件后,main函数就可以调用模型的step函数(也就是模型中计算的过程)和模型输出的全局变量;

2)初始化函数

在while(1)循环之前,需要对PS2、模型、电机和舵机进行初始化。

  1. PS2_Init是对PS2通讯的初始化,这部分是开发板配套的示例函数;
  2. Manual_Code_initialize是对手写代码的初始化;
  3. MTSR_MotionSolve_initialize是模型生成的init函数;
  4. MotX_Interface是将电机X的转速初始值设为0,也就是停止转动;
  5. SSenvo是将舵机的位置初始为1500,也就是中间位置;

3)while循环

while循环每隔20ms周期运行一次,是控制策略实现的关键。

  1. PS2_Interface函数会获取当前PS2传给开发板的信号数值,也就是得知在这个循环内,操作者按下了PS2的哪个按键或者摇杆,该函数会修改PS2按键信号,也就是模型的输入信号;
  2. MTSR_MotionSolve_step是模型的step函数,会根据输入信号算出输出信号,也就是给电机和舵机函数的参数是多少;
  3. MotX_InterfaceSSenvo是电机、舵机和继电器的控制接口,其参数是上一步中的step函数输出的信号;

每个while循环会不停的更新控制器RAM中的全局变量,然后用接口函数驱动电机、舵机或者继电器。

2.3 编译与下载

熟悉Keil和STM32的博友肯定非常了解编译和下载按钮在哪儿,如下图所示。采用不同的下载器,例如Jlink或者ST-Link,需要进行不同的配置。
机甲大师机器人控制(六):集成测试_第10张图片
这里博主想说明一下,编译是整个DIY过程中的第一道障碍,经常会调试很久才能编译通过。博主在做的过程中就经常遇到错误,比方说漏掉了头文件、或者变量名没匹配正确等。这部分需要比较有耐心,才能解决掉所有的问题。

3 实物测试

实物测试是整个控制开发的最后一步。在这个过程中,可以直观地检测出之前的设计是否成功。本章节中,博主会根据功能分析阶段中提出的4条功能需求,来逐一测试其效果。测试方法就是操作PS2手柄,观察机甲大师机器人是否按照预期的功能去运动。由于博客上传图片大小有限,无法上传动图,测试结果会以图片的方式呈现在后文中。

另外,为了直观地体会这一节的内容,博主将本文的测试过程录制了两端简单的视频。

机甲大师平面运动

机甲大师云台及发射器

3.1 按键锁定

按键锁定功能没法通过动图直观地展现出来,效果就是当PS2上的红绿指示灯同时亮起来的时候,PS2上的其余按键才有效。只有红灯亮起的时候是无效的。

3.2 底盘平面运动

3.2.1 基本运动

1)前后拨动左摇杆的Y通道,底盘实现前进后退运动。
机甲大师机器人控制(六):集成测试_第11张图片

2)左右拨动左摇杆的X通道,底盘实现左右平移运动。
机甲大师机器人控制(六):集成测试_第12张图片

3)前后拨动左摇杆的Y通道,底盘实现绕正前方左右摆尾运动。
机甲大师机器人控制(六):集成测试_第13张图片

4)左右拨动左摇杆的X通道,底盘实现顺时针、逆时针自转运动。
机甲大师机器人控制(六):集成测试_第14张图片

3.2.2 合成运动

合成运动就是PS2摇杆的多个通道生效的运动,博主这里只验证几个比较有用的合成运动。

1)向左上方拨动左摇杆,此时左摇杆的X、Y通道同时生效,底盘向左上方运动。
机甲大师机器人控制(六):集成测试_第15张图片

四种对角线运动(左前、左后、右前、右后)都可以通过左摇杆的XY通道组合来实现。

2)向前拨动左摇杆,同时向右拨动右摇杆,此时左摇杆的Y通道和右摇杆的X通道同时生效,底盘实现右转弯。
机甲大师机器人控制(六):集成测试_第16张图片

另外,左前转弯、左后转弯、右前转弯、右后转弯都可以通过此方法实现。

3.3 舵机云台二自由度运动

PS2右手的4个按键控制舵机云台的二自由度运动。双舵机的二自由度运动可以使水弹枪在一定范围内瞄准目标。

1)按下RL,RR按钮,舵机云台实现在水平平面内左右运动,扇形角度为180度。
机甲大师机器人控制(六):集成测试_第17张图片

2)按下RU,RD按钮,舵机云台实现在竖直平面内上下运动,扇形角度为180度。
机甲大师机器人控制(六):集成测试_第18张图片

3.4 发射器控制

按下手柄右手的R1按键可以使继电器闭合,从而控制水弹枪连续发射。
机甲大师机器人控制(六):集成测试_第19张图片

4 总结

本文是最后的集成测试阶段,在该阶段中会将模型生成代码、编译STM32工程,最后下载到控制器中进行测试。该阶段会暴露出很多问题,如果能够一一解决会有不小的收获。

>>返回个人博客总目录

你可能感兴趣的:(集成与验证,matlab,simulink,stm32,基于模型的设计)