基于模型的无刷电机控制代码快速生成
引言
随着软硬件技术的不断发展,以及用户对产品安全性,可靠性的要求,嵌入式应用的开发难度与代码体积都在迅速增加,传统的基于文本的开发方式已经越来越难以满足这种高性能与快节奏研发的要求。
基于模型的设计方法利用Mathworks提供的一系列工具,可直接实现从设计理念到算法模型,再由模型自动生成嵌入式代码的高效开发流程。对于本例来说,在LPC2124芯片上实现无刷电机控制(BLDC),设计者无需考虑如何将电机状态的变换用C或汇编语言体现,仅需关注算法本身,将繁琐的代码生成工作交给计算机完成。这样可以大大缩短产品开发周期,显著提高工作效率。
1 原理分析
直流无刷电机的工作离不开电子开关电路,因此由电动机本体、转子位置传感器和电子开关电路3部分组成了直流无刷电机的控制系统,其结构框图如图1所示。直流电源通过开关电路向电动机定子绕组供电,位置传感器随时检测转子所处的位置,并根据位置信号来控制开关管的导通和截止,从而自动地控制哪些绕组通电、哪些绕组断电,实现了电子换相。
图1 无刷电机控制系统结构框图
下面以一个三相绕组的无刷电机为例,简要介绍其工作原理。图2为三相全桥式驱动电路原理图,对其采用二相通电的方式驱动,即有两个绕阻同时通电。图中包含6个晶体管、二极管组成的三相逆变电路,Ha、Hb、Hc为霍尔元件反馈的转子位置信号。控制电路会根据位置信号决定6路PWM信号的通断,进而使功率管导通或关断,使绕阻按一定顺序导通,驱动电机连续旋转。
当采用二相导通方式驱动电机时,功率管的导通或关断情况经过1/6周期(即60°)。在直流无刷电机的内部嵌有3个霍尔位置传感器,它们在空间上相差120°。由于电机的转子是永磁体,当它在转动的时候,其磁场将发生变化形成旋转磁场,每个霍尔传感器都会产生180°脉宽的输出信号。
图2 三相全桥式驱动电路原理图
假设当前功率管V1、V6导通,则电流从A相流入电机,从C相流出电机,由电流经绕阻产生的磁场方向为(A,C)。由A和C的合磁场产生的转矩使转子转动到AC位置。转子的转动使霍尔传感器的输出发生变化,控制电路会据此调整功率管的导通情况,将V6关断,V5导通。这时,电流从A相流入电机,从B相流出电机,经绕阻产生的磁场方向为(A,B)。由A和B的合磁场产生的转矩使转子转动到AB位置。同样,霍尔器件又会输出一个不同的值,控制电路作出相应的处理,完成一个完整的换相周期。
2 模型搭建
根据上述原理简介可知,无刷电机由一组PWM信号驱动。PWM信号按霍尔元件传送的位置信号决定其通断状态,以驱动电机连续旋转;而PWM信号占空比可用于调节电机转速。在Stateflow中创建状态图,模型共设置PWM1~6六路PWM信号,并以按键key的值控制电机的开关,由此可得无刷电机的状态图,如图3所示。
图3 无刷电机状态图
MotorOff子状态中,将6路PWM信号的占空比调至0,以达到关闭电机的作用,如图4所示。
图4 MotorOff子状态
MotorOn子状态与MotorOff子状态基本类似,不同之处在于:模型接收霍尔元件传送回的电机转子位置信号,并以此判断PWM信号的通断。当霍尔元件返回值为1时,第2、6路PWM信号导通;值为2时,第3、4路PWM信号导通;值为3时,第2、4路PWM信号导通;值为4时,第1、5路PWM信号导通;值为5时,第1、6路PWM信号导通;值为6时,第3、5路PWM信号导通。
Stateflow状态图中的变量pinsel0、pinsel1、io0dir为芯片设置位,pwmmr0~pwmmr6联合控制PWM输出,sensor表示霍尔器件的值,key控制电机是否工作,变量speed用于接收外部的控制信号(例如电位器和ADC),调节PWM占空比,实现电机调速。
完成Stateflow状态图之后,再配合Simulink中的库模块即可完成如图5所示的算法模型。当key=1,电机处于打开状态时,若霍尔传感器状态为1,则第2和第6路PWM信号导通,输出512。信号占空比是由pwmmr0~pwmmr6联合控制的,pwmmr0已将PWM波的周期定义为1 024,则输出512即表示占空比为1:1,这证明算法模型达到了预期目的。
图5 算法模型3代码快速生成
RTW生成实时代码的过程大致可分为成4个阶段:
① 用户在MATLAB/Simulink/Stateflow建立算法模型。
② TLC目标语言编译器读取.rtw文件中的信息,将模型转化成源代码。
③ 生成指定目标的代码。
④ 连接开发目标程序所需的环境。
由上述过程可知,需要对模型作部分修改。图5所示模型中,设计者需要将各个信号源模块和显示器模块替换为输入/输出端口模块,这样才能在生成的代码中为硬件预留数据接口。在模型配置页面中需要将硬件类型指定为ARM compatible,求解器设置为离散型,RTW中的模板文件设置为ert.tlc。
完成上述设置后,将模型保存为arm_BLDC.mdl,按下模型工具栏的按钮即可生成代码。如果计算机上已经安装了TASKING IE FOR ARM软件,并与MATLAB平台正确关联后,系统会自动生成工程,并编译生成可执行文件,非常快捷方便。未安装该软件的用户可用自己熟悉的IDE自行创建工程并加入自动生成的C代码,之后对ert_main.c文件的代码作部分修改(有注释的部分为修改内容):
……
#include "LPC2124.h"/*添加LPC2124头文件*/
extern void PWM_Init(void);/*声明外部函数PWM_Init*/
extern void AD_Read(void);/*声明外部函数AD_Read*/
……//模型输入口与硬件相关联
arm_BLDC_U.In1=(IO0PIN&0x03800000)>>23;
arm_BLDC_U.In2=(IO0PIN&0x8000)>>15;
……//模型输出口与硬件相关联
PINSEL0=arm_BLDC_Y.Out1;
PINSEL1=arm_BLDC_Y.Out2;
IO0DIR=arm_BLDC_Y.Out3;
PWMMR0=arm_BLDC_Y.Out4;
PWMMR1=arm_BLDC_Y.Out5;
PWMMR2=arm_BLDC_Y.Out6;
PWMMR3=arm_BLDC_Y.Out7;
PWMMR4=arm_BLDC_Y.Out8;
PWMMR5=arm_BLDC_Y.Out9;
PWMMR6=arm_BLDC_Y.Out10;
PWMLER=arm_BLDC_Y.Out11;
……
int_T main(int_T argc, const char_T *argv[]);
int_T main(int_T argc, const char_T *argv[]){
/* Initialize model */
arm_BLDC_initialize();
PWM_Init();//调用PWM_Iint()
ADCR=0x002E0401;//ADC初始化
/* Simulating step behavior */
while (rtmGetErrorStatus(arm_BLDC_M) == (NULL)) {
AD_Read();//调用A/D_Read()
arm_BLDC_U.In3=(ADDR>>6) & 0x3FF;// AD结果赋值到In3口
rt_OneStep();//调用rt_OneStep()
}
……//删除printf与fflush代码
……
BLDC控制模型利用了芯片中的PWM发生和ADC功能,因此还需要这两个模块的初始化代码。将初始化代码保存为BLDC_init.c并加入到工程中即可进行编译。
#include"LPC2124.h"
void PWM_Init(void){//初始化LPC2124芯片的PWM功能
PWMPR=1200; //设置分频系数
PWMMR0=1024;//PWMMR0~PWMMR6控制初始占空比
PWMMR1=PWMMR2=PWMMR3=PWMMR4=PWMMR5=PWMMR6=0;
PWMMCR=0x00000002; //重置MR0时钟
PWMPCR=0x7E00; //使能PWM1~PWM6输出
PWMLER=0x7F; //使能PWM0~PWM6锁存
PWMTCR=0x09; //使能PWM模式并启动定时器
}
void AD_Read(void){
ADCR=(ADCR&0x00FFFF00)|0x01|(1<<24);//设置通道1,并进行第1次转换
while((ADDR&0x80000000)==0);//等待转换结束
ADCR &=~0x01000000;//停止转换
}
- 微处理器在电动车无刷电机控制器上的应用(11-26)
- 基于Atmel Mega8的无刷电机控制系统(10-15)
- 基于单片机的直流无刷电机控制系统设计(11-10)
- lpc2124 启动代码详解(11-11)
- 基于DSP和MATLAB的语音数据采集和处理系统(05-13)
- 简化“算法到C代码”是软件业的一项挑战(07-04)