使用simulink搭建V/F电机控制框架,并集成到STM32F4中
1.Simulink模型搭建
本例子使用V/F拖动启动方法控制永磁同步电机启动,simulink模型
其中V/F启动部分输出d,q轴的期望电压,并通过SVPWM调制算法施加到电机的三相:模型的输入为空,模型输出为为三路PWM波的占空比。
function [ud_out,uq_out,ange_out] = VF()
persistent count theta_e;
if(isempty(count))
count=0;
theta_e = 0;
end
count=count+1;
if (count<4500)%输出定矢量
ange_out=0;
ud_out=0.3*3.5*4; %(*3.5*5)导致电流过大,满占空比
uq_out=0.0;
elseif(count>=4500 && count<9000)%输出拖拽量
we_hope = (count-4500)/4500*400;
theta_e = theta_e + we_hope*0.001;
if theta_e > 2*pi
theta_e = theta_e-2*pi;
end
ange_out=theta_e;
ud_out=0.0;
uq_out=5;
else
we_hope = 400;
theta_e = theta_e + we_hope*0.001;
if theta_e > 2*pi
theta_e = theta_e-2*pi;
end
ange_out=theta_e;
ud_out=0.0;
uq_out=5;
end
仿真周期设置为0.001s,仿真运行后电机三相的马鞍波图上图所示。
2.自动代码生成配置
首先由于实际芯片的运行方式是离散的,求解器一定要设置为定步长和离散状态。
具体的设置可以看模型文件。
使用Embedded Coder 自动生成嵌入式代码,报告如下:一共生成五个文件 ,需要关注的是PMSM_initialize初始化函数和PMSM_step函数,前者是模型中一些参数的初始化,后者是需要在任务中不断调用的函数。
3.STM32CubeMX初始代码生成
选取芯片STM32F407VET6配置工程,1.时钟配置为外部时钟,sysclick168M,
2.需要一个高级定时器产生三路PWM波,选择TIM1的前三个通道,由于TIM1挂在APB2总线上,定时器 base频率为168M,为了产生10KHZ的PWM,设置预分频寄存器PSC为(2-1),自动重装寄存器CNT为(4200-1),计数模式为中央对齐,则PWM频率 = 168M/(PSC+1)/(CNT+1) /2= 10k,CH Polarity设置为Low ,使得比较寄存器的值越大,PWM占空比越大。
3.此外需要一个电机驱动板的控制使能信号,此处使用PE15,设置GPIO为推挽输出模式。全部设置完成后生Keil工程代码
4.代码集成和接口编写
PMSM文件夹中为生成的Keil工程,在此处新建一个文件夹Simulink,将第一章中生成的C代码复制到Simulink文件夹中。
接着进入Keil工程,
Step1:在main.c中TIM初始化后添加PWM开始输出的代码
Step2:源代码添加,头文件路径添加
Step3:头文件引用和初始化函数
在main.c中引入头文件PMSM.h,编译之后无错误和警告出现,接下来将初始化函数加入main函数中,while循环之前
Step4:调用PMSM_Step函数
由于simulink模型设置的仿真步长为0.001s,需要启动一个周期为0.001s的PMSM_Step任务,而此处为简便起见,直接将PMSM_Step放在cortex内核的systick定时器中断中。Systick中断服务函数位于stm32f4xx_it.c中:void SysTick_Handler(void) ,将
Step4:函数接口:
模型的输出定义在PMSM.c中,如下 ExtY_PMSM_T PMSM_Y;是一个结构体变量
/* External outputs (root outports fed by signals with default storage) */
typedef struct {
uint16_T PWM_ABC[3]; /* '<Root>/PWM_ABC' */
} ExtY_PMSM_T;
每调用一次PMSM_Step()后,将PWM_ABC中输出的值赋给TIM1的比较寄存器(CCR)中,进行PWM输出更新。最终的systick函数如下
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
/*1ms中断*/
PMSM_step();
TIM1->CCR1 = PMSM_Y.PWM_ABC[0];
TIM1->CCR2 = PMSM_Y.PWM_ABC[1];
TIM1->CCR3 = PMSM_Y.PWM_ABC[2];
/* USER CODE END SysTick_IRQn 1 */
}
5.PMSM驱动板输出波形:
PMSM驱动板的三相中A相输出10KHZ的PWM波如下图所示:
标签:count,TIM1,PMSM,MBD,控制算法,STM32,theta,PWM,out From: https://www.cnblogs.com/yyyq/p/18226420