文章目录
- 前言
- 一、 恒压频比(V/F)控制原理
- 二、永磁同步电机恒压频比开环控制系统Matlab/Simulink仿真分析
- 2.1.仿真电路分析
- 2.1.1.恒压频比控制算法
- 2.1.2.输出处理
- 2.1.3.主电路
- 2.2.仿真结果分析
- 2.2.1.设定目标转速为1200r/min
- 2.2.1.设定目标转速为变化值
- 三、永磁同步电机恒压频比开环控制系统代码生成及工程实现
- 3.1.功能需求
- 3.2.硬件设计
- 3.3.软件设计
- 3.3.1.STM32CubeMX底层配置
- 3.3.2.应用层与底层的接口开发
- 3.3.3.Matlab/Simulink恒压频比控制算法代码生成
- 3.3.4.应用层与底层的代码集成
- 3.4.仿真验证
- 总结
前言
本章节采用恒压频比的开环控制方法驱动永磁同步电机的转动,首先分析恒压频比的控制原理,然后在Matlab/Simulink中进行永磁同步电机恒压频比开环控制系统的仿真分析,最后将Simulink中的恒压频比控制算法生成代码加载到实际工程中进行工程实现。
一、 恒压频比(V/F)控制原理
二、永磁同步电机恒压频比开环控制系统Matlab/Simulink仿真分析
永磁同步电机恒压频比控制方法与异步电机恒压频比控制方法相似,也是控制电机输入电压与频率同时变化,从而使气隙磁通保持恒定。该控制方法没有电机电流、电压、位置等物理量的反馈,动态性能较差,在给定目标转速发生变化或者负载突变的情况下容易产生失步和震荡的问题,但该控制方法胜在简单,多适用于对转速精度要求不高的场合。
永磁同步电机恒压频比开环控制系统Matlab/Simulink仿真框图如下:
2.1.仿真电路分析
2.1.1.恒压频比控制算法
恒压频比控制算法:永磁同步电机转速与频率的换算关系如下所示:
首先,将设定的电机目标转速通过上式换算为频率,由于该开环控制系统没有自动限制启动电流的作用,因此加入了一个斜坡函数使频率有一个平缓的变化过程。例如仿真中设定的目标转速为1200r/min,换算为频率的过程如下图所示:
然后,由恒压频比V/F控制算法特性(下图所示),使输入电压与频率同步变化,从而保持气隙磁通恒定。低频时Us和Eg都较小,定子电阻和漏感压降所占分量比较显著,不能再忽略,此时人为的把定子电压抬高一些,近似的补偿定子阻抗压降,如下图b线所示:
由上图可知输入电压与频率的关系为(带低频补偿的b线,已知(0,U0)(f1N,UsN)):
将频率通过上式换算为电压,由电机额定转速计算出额定频率f1N(永磁同步电机转速与频率的关系)。永磁同步电机的恒压频比控制为基频以下调速,系统最高频率不能超过额定频率f1N,例如仿真中所选永磁同步电机的额定转速为12540r/min,计算出额定频率f1N为1463Hz,为系统最高设定频率。
目标转速为1200r/min,将转速换算为频率,再由频率的变化得到输入电压的变化,如下图所示:
此处作了一个归一化处理,将电压的变化除以电机额定电压,使输出电压的范围落在[0,1]区间内。
将频率转换为相角,如下图所示:
此时已获得输入电压的幅值U与相角wt,再通过下式将幅值与相角的电压表示转化为两相坐标系下的电压表示:
接着采用反Clark变换,得到最终输入到电机的三相电压:
2.1.2.输出处理
对恒压频比控制算法的输出电压做处理,使其落在[0,1]的范围内:
2.1.3.主电路
**
此处为了偷懒,没有再搭建三相逆变电路,采用Average-Value Inverter模块直接生成三相正弦电压送入永磁同步电机进行控制,永磁同步电机采用BR2804-1700电机,参数如下:
目标转速1200r/min时,生成的送入电机的三相电压如下图所示:
2.2.仿真结果分析
2.2.1.设定目标转速为1200r/min
目标转速与实际转速:
**
**
电机定子电流:
**
**
电机转子位置:
2.2.1.设定目标转速为变化值
目标转速设定:
目标转速与实际转速:
电机定子电流:
电机转子位置:
Id和Iq电流值:
电磁转矩:
三、永磁同步电机恒压频比开环控制系统代码生成及工程实现
3.1.功能需求
实现永磁同步电机的恒压频比控制,可通过按键调节永磁同步电机的转速。
3.2.硬件设计
控制板:STM32F302R8
驱动板:X-NUCLEO-IHM07M1
永磁同步电机:BR2804-1700
控制板与驱动板的详细信息请阅读:
直流有刷电机驱动基于STM32F302R8+X-NUCLEO-IHM07M1(一)
3.3.软件设计
3.3.1.STM32CubeMX底层配置
1、RCC设置外接HSE(Crystal/Ceramic Resonator),时钟设置为72MHz
2、PC10、PC11、PC12设置为推挽输出、无上下拉电阻、高速,初始化状态设为0;PB13设置为推挽输出,下拉电阻、高速,初始化状态为0;PC13设置为输入,无上下拉电阻。
3、设置TIM1时钟源为内部时钟,TIM1_CH1(PA8)设置为PWM输出,TIM1_CH2(PA9)设置为PWM输出,TIM1_CH3(PA10)设置为PWM输出;TIM1预分频值设置为3-1,计数模式选为中央计数模式1,ARR设计为1200-1(1/(1/(72000000/3))*1200=20KHz),内部时钟无分频;使能TIM1更新中断,中断优先级设置为(1,0)
4、USART2设置为异步,115200波特率,8位数据位,无奇偶校验位,1位停止位
5、Project Manager->工程名+IDE配置,Code Generator配置,生成工程代码
**
**
**
**
**
**
3.3.2.应用层与底层的接口开发
Speed_Ref用于设定目标转速;Duty[3]用于接收恒压频比控制算法生成的三相电压,该三相电压作为调制波,TIM1计数器(中央计数模式)作为载波,频率20KHz与Simulink仿真设计一致。调制波与载波进行调制生成PWM,控制三相逆变电路的驱动输出,此处采用SPWM控制方法进行控制;Vmin用于设定恒压频比控制算法中的补偿电压值U0。
有关PWM控制技术请阅读:
PWM控制技术+Simulink仿真详解
3.3.3.Matlab/Simulink恒压频比控制算法代码生成
具体代码生成步骤及设计,请阅读:
直流有刷电机开环调速基于STM32F302R8+X-NUCLEO-IHM07M1(三)
3.3.4.应用层与底层的代码集成
具体代码集成步骤,请阅读:
直流有刷电机开环调速基于STM32F302R8+X-NUCLEO-IHM07M1(三)
在主函数中调用:PMSM_VF_initialize()初始化函数。
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t count=0;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
PMSM_VF_initialize(); //Simulink初始化函数
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(Key_Scany(KEY_GPIO_Port,KEY_Pin)==1)
{
HAL_GPIO_WritePin(GPIOC, EN1_Pin|EN2_Pin|EN3_Pin, GPIO_PIN_SET); //使能三相桥臂
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); //使能三路PWM
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
__HAL_TIM_ENABLE_IT(&htim1,TIM_IT_UPDATE); //使能TIM1更新中断
__HAL_TIM_CLEAR_FLAG(&htim1,TIM_IT_UPDATE);
Speed_Ref+=500; //设定转速,每按一次按键转速增加500
if(Speed_Ref>=12000)
Speed_Ref=12000;
}
HAL_Delay(1);
count++;
if(count%50==0)
{
count=0;
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //程序运行指示灯,50ms闪烁周期
}
}
/* USER CODE END 3 */
}
在TIM1更新中断函数中调用:PMSM_VF_step(Speed_Ref, Duty)函数,实现恒压频比控制算法。
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//Simulink函数 20KHz V/F控制
PMSM_VF_step(Speed_Ref, Duty); //每调用此函数相当于在Simulink中执行了一次模型运算
for(int i=0;i<3;i++)
{
Duty[i]=(1-Duty[i])*htim1.Init.Period;
}
TIM1->CCR1=Duty[0]; //设置占空比,进行SPWM控制
TIM1->CCR2=Duty[1];
TIM1->CCR3=Duty[2];
}
/* USER CODE END 1 */
3.4.仿真验证
编译下载到开发板观察实验现象
恒压频比开环控制系统Simulink仿真及工程实现
高清视频文件太大了,传个模糊的凑活了,哈哈哈哈哈哈哈哈哈哈哈哈哈!!!
总结
本章节采用恒压频比的开环控制方法驱动永磁同步电机的转动,分析了恒压频比的控制原理,然后在Matlab/Simulink中进行了永磁同步电机恒压频比开环控制系统的仿真分析,最后将Simulink中的恒压频比控制算法生成代码加载到实际工程中进行了工程实现,为后续章节的分析奠定基础。