在实际工作中,有时需要对模型进行半实物仿真,以此来验证模型的正确性。本文将以六步换相模型部署到树莓派4B为例,讲述如何将已建立好的模型以代码生成的形式部署到树莓派中。
前期准备
模型准备
本文使用的模型为无刷直流电机(BLDC)的六步换相模型,基本原理为利用电磁作用在定子上的三个相绕组中产生扭矩,然后根据霍尔传感器对转子位置的检测对转子进行分区控制。其中增量式编码器会输出转子更具体的位置,将这个位置与目标角度使用PID进行调节以控制定子中的PWM输出和正反转控制最后完成对电机的控制。

树莓派与驱动板准备
- 使用的树莓派为树莓派4B
- 使用的驱动板为ATK-PD6010B
- 使用的无刷直流电机为42JSF630AS-1000
- 导线若干
代码生成
1.解压最下方上传的附件1(模型及数据字典文件.7z),打开For_emd_code_2;

2.检查数据字典是否绑定成功,若未绑定点击进入数据字典,并点击选择已存在字典文件与当前模型绑定,选择解压包中的MODD文件完成绑定;

3.检查绑定后,点击代码生成,生成代码;

4.生成后点击代码生成路径进行跳转或复制地址进行跳转;

5.跳转后进入文件夹点击mwb_main进入并进行修改;

6.首先增加需要引用的头文件与定义树莓派的接口,define的接口可以根据不同的需求进行修改,本文的接口仅做参考,下图为修改前后的代码;

#include "For_emd_code_2_private.h"//声明头文件
#include "mwb_runtime.h"
#include <stddef.h>
#include <stdio.h>
#include <wiringPi.h> //导入wiringPi.h库
#define EN_Out 1//设置引脚
#define AH_pin 30//输出的引脚
#define AL_pin 21
#define BH_pin 22
#define BL_pin 23
#define CH_pin 24
#define CL_pin 25
#define HallA 27//输入的霍尔变量
#define HallB 28
#define HallC 29
#define ENCA 0//编码器的输出
#define ENCB 2
#define ENCZ 3
代码说明:
- #include "For_emd_code_2_private声明头文件,为下文写入变量做准备;
- #include <wiringPi.h>引脚设置所需要的库;
- #define EN_Out 1对端口名命名。
7.对端口的输出模式进行设置,其中Sources_id为目标角度波形更换参数,后续可以再模型中的subsystem中进行修改,PWM_up为PWM的上限限制,避免因其过快的转速导致驱动板过流,余下的KI_Global,KP_Global为PID参数;

wiringPiSetup();
pinMode(EN_Out, OUTPUT); // 配置端口为输出模式
pinMode(AH_pin, OUTPUT); // 配置端口为输出模式
pinMode(AL_pin, OUTPUT); // 配置端口为输出模式
pinMode(BH_pin, OUTPUT); // 配置端口为输出模式
pinMode(BL_pin, OUTPUT); // 配置端口为输出模式
pinMode(CH_pin, OUTPUT); // 配置端口为输出模式
pinMode(CL_pin, OUTPUT); // 配置端口为输出模式
pinMode(HallA, INPUT); // 配置端口为输入模式
pinMode(HallB, INPUT); // 配置端口为输入模式
pinMode(HallC, INPUT); // 配置端口为输入模式
pinMode(ENCA, INPUT); // 配置端口为输入模式
pinMode(ENCB, INPUT); // 配置端口为输入模式
pinMode(ENCZ, INPUT); // 配置端口为输入模式
pullUpDnControl(HallA, PUD_DOWN); // 对一个设置 IO 模式为 INPUT 的输入引脚设置上拉电阻模式
pullUpDnControl(HallB, PUD_DOWN); // 对一个设置 IO 模式为 INPUT 的输入引脚设置上拉电阻模式
pullUpDnControl(HallC, PUD_DOWN); // 对一个设置 IO 模式为 INPUT 的输入引脚设置上拉电阻模式
pullUpDnControl(ENCA, PUD_UP); // 对一个设置 IO 模式为 INPUT 的输入引脚设置上拉电阻模式
pullUpDnControl(ENCB, PUD_UP); // 对一个设置 IO 模式为 INPUT 的输入引脚设置上拉电阻模式
pullUpDnControl(ENCZ, PUD_UP); // 对一个设置 IO 模式为 INPUT 的输入引脚设置上拉电阻模式
/* END: use output variables of the model,
such as printing them out or assigning them to other variables */
Sources_id =1;
PWM_up = 30;
KI_Global = 0.1;
KP_Global = 0.1;
8.下面是树莓派端口读取和写入的设置,printf函数在电机运转的同时输出,会对电机的运转过程造成干涉,所以仅在调试过程中可以打开;

HALL_A = (int) digitalRead(HallA); //读取树莓派引脚输出的霍尔信号与编码器信号
HALL_B = (int) digitalRead(HallB);
HALL_C = (int) digitalRead(HallC);
ENC_A = (int) digitalRead(ENCA);
ENC_B = (int) digitalRead(ENCB);
ENC_Z = (int) digitalRead(ENCZ);
Step();
digitalWrite(AH_pin, A_P);//将计算得出的控制信号写入引脚
digitalWrite(AL_pin, A_N);
digitalWrite(BH_pin, B_P);
digitalWrite(BL_pin, B_N);
digitalWrite(CH_pin, C_P);
digitalWrite(CL_pin, C_N);
//printf("Hall:%d,%d,%d ||ENC:%d,%d,%d||",HALL_A,HALL_B,HALL_C,ENC_A,ENC_B,ENC_Z);//霍尔信号和编码器信号
//printf("6Pha:%d,%d,%d,%d,%d,%d||",A_P,A_N,B_P,B_N,C_P,C_N);//6路PWM信号
//printf("ENC_ref:%d||",ENC_ref);//构造的三角波信号源
//printf("ENC_Back:%d||",ENC_Back);//基于编码器反馈的脉冲数
//printf("gap:%d||PWM_cycle:%f||",(ENC_ref-ENC_Back),PWM_cycle);//高边PWM观测
//printf("select_neg:%d ||select_pos:%d||",select_neg,select_pos);//构造的正扇区,负扇区
//printf("\n");
//delay(100);
9.更改后的代码见最下方上传的附件2(mwb_main.c),如果修改不成功可以考虑使用上面的代码覆盖源代码,如果对模型名称有修改的话,需要对代码的名称及内部描述的引用文件进行修改。
PC与树莓派连接
1.本文使用MobaXterm对树莓派进行控制,首先接线。根据下图所示信息进行接线


将两板接线;

下图为实际的接线图;

2.接线后将树莓派与PC建立连接,可以使用网线连接或网络连接均可无线网络则连接wlan0的地址,网线连接则连接eth0;

3.点击菜单中的Sessions,再点击New Session新建连接,本文使用ssh进行连接;

4.连接成功后进入菜单。
部署代码
1.在菜单中新建文件夹;

2.将生成好的代码拖入文件夹;

3.进入路径
cd /home/pi/Sixstep_code_0227/
4.对文件进行编译
gcc *.c -o mo -lwiringPi -lm
5.运行编译好的文件
./mo
实际运行效果见附件3(运行效果.mp4)。