基于MBD的电机控制算法开发-STM32

使用simulink搭建V/F电机控制框架,并集成到STM32F4中

1.Simulink模型搭建

本例子使用V/F拖动启动方法控制永磁同步电机启动,simulink模型

image-20240507141006145

其中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
image-20240507141510074

仿真周期设置为0.001s,仿真运行后电机三相的马鞍波图上图所示。

2.自动代码生成配置

首先由于实际芯片的运行方式是离散的,求解器一定要设置为定步长和离散状态。

image-20240507141829388 image-20240507142438194

具体的设置可以看模型文件。

使用Embedded Coder 自动生成嵌入式代码,报告如下:一共生成五个文件 ,需要关注的是PMSM_initialize初始化函数和PMSM_step函数,前者是模型中一些参数的初始化,后者是需要在任务中不断调用的函数。

image-20240507143405455

3.STM32CubeMX初始代码生成

选取芯片STM32F407VET6配置工程,1.时钟配置为外部时钟,sysclick168M,

image-20240507144647004

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占空比越大。

image-20240507145459840

3.此外需要一个电机驱动板的控制使能信号,此处使用PE15,设置GPIO为推挽输出模式。全部设置完成后生Keil工程代码

image-20240507150614213

4.代码集成和接口编写

image-20240507150454733

PMSM文件夹中为生成的Keil工程,在此处新建一个文件夹Simulink,将第一章中生成的C代码复制到Simulink文件夹中。

接着进入Keil工程,

Step1:在main.c中TIM初始化后添加PWM开始输出的代码

image-20240507151109194

Step2:源代码添加,头文件路径添加

image-20240507151330355image-20240507151424922

Step3:头文件引用和初始化函数

在main.c中引入头文件PMSM.h,编译之后无错误和警告出现,接下来将初始化函数加入main函数中,while循环之前

image-20240507151801223

Step4:调用PMSM_Step函数

由于simulink模型设置的仿真步长为0.001s,需要启动一个周期为0.001s的PMSM_Step任务,而此处为简便起见,直接将PMSM_Step放在cortex内核的systick定时器中断中。Systick中断服务函数位于stm32f4xx_it.c中:void SysTick_Handler(void) ,将

image-20240507152604558

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波如下图所示:

tek00000

posted @ 2024-06-01 21:13  阴月无雨  阅读(702)  评论(0)    收藏  举报