驱动电机旋转-BLDC闭环控制方式 STSPIN32F0601驱动板支持以BLDC方式驱动无刷电机调试,通过开环控制的测试后,确定了转速测量的准确性,可以完成转速闭环测试。 1. 基本原理转速闭环控制采用PID控制原理完成。 PID算法是控制行业最经典、最简单、而又最能体现反馈控制思想的算法。PID算法的执行流程是非常简单的,即利用反馈来检测偏差信号,并通过偏差信号来控制被控量。而控制器本身就是比例、积分、微分三个环节的加和。其功能框图如下:
PID的基本实现方法有:1)位置式PID控制器,2) 增量式PID控制器。这些实现方式的特点是: 1)位置式PID控制器 l 位置型PID控制的输出与整个过去的状态有关,用到了偏差的累加值,容易产生累积偏差。 l 位置型PID适用于执行机构不带积分部件的对象。 l 位置型的输出直接对应对象的输出,对系统的影响比较大。 2)增量型PID控制器 l 增量型PID算法不需要做累加,控制量增量的确定仅与最近几次偏差值有关,计算偏差的影响较小。 l 增量型PID算法得出的是控制量的增量,对系统的影响相对较小。 l 采用增量型PID算法易于实现手动到自动的无扰动切换。 鉴于PID控制的点,本次采用增量式PID控制器完成速度控制闭环控制。 根据PID控制原理,可得第K-1次采样时控制器的输出值为:
Kd = Kp * Td/T 2. 驱动代码采用网络上比较成熟的算法,在做适当的匹配修改,完成增量式PID的核心控制器部分。
- #define PWM_Max 500
- #define PWM_Min 50
- typedef struct PID
- {
- longTarget; //É趨Ŀ±ê Desired Value
- longUk; //Uk
- longUdk; //UdkÔöÁ¿
- longUk_1; //Uk-1
- longP; //±ÈÀý³£Êý Proportional Const
- longI; //»ý·Ö³£Êý Integral Const
- int b;
- longD; //΢·Ö³£Êý Derivative Const
- longek_0; //ek
- longek_1; //ek-1
- longek_2; //ek-2
- }PID;
- static PID Speed_PID;
- static PID *Speed_Point = &Speed_PID;
- /*=====================================
- Initialize PID Structure PID
- ====================================*/
- void Speed_PIDInit(void)
- {
- Speed_Point->Target= 100;
- Speed_Point->Uk = 0;
- Speed_Point->Udk = 0;
- Speed_Point->Uk_1 = PWM_Min;
- Speed_Point->ek_0 = 0; //ek=0
- Speed_Point->ek_1 = 0; //ek-1=0
- Speed_Point->ek_2 = 0; //ek-2=0
- Speed_Point->P = 150; //±ÈÀý³£Êý Proportional Const
- Speed_Point->I = 5; //»ý·Ö³£ÊýIntegral Const
- Speed_Point->b =1;
- Speed_Point->D = 0; //΢·Ö³£Êý Derivative Const
- }
- void Speed_PIDSetTarget(long setpoint)
- {
- Speed_Point->Target = setpoint;
- }
- long Speed_PIDAdjust(long Next_Point)
- {
- longftmp;
- Speed_Point->ek_0=Speed_Point->Target - Next_Point;
- if(((Speed_Point->Uk_1>=PWM_Max)&&(Speed_Point->ek_0>=0))
- ||((Speed_Point->Uk_1<=PWM_Min)&&(Speed_Point->ek_0<=0)))
- {
- Speed_Point->b=0;
- }
- else
- {
- Speed_Point->b=1;
- }
- ftmp= Speed_Point->P*(Speed_Point->ek_0-Speed_Point->ek_1)
- +Speed_Point->b*Speed_Point->I*Speed_Point->ek_0
- +Speed_Point->D*(Speed_Point->ek_0-2*Speed_Point->ek_1+Speed_Point->ek_2);
- Speed_Point->Udk= ftmp/1000;
- Speed_Point->Uk= Speed_Point->Uk_1 + Speed_Point->Udk;
- Speed_Point->ek_2= Speed_Point->ek_1;
- Speed_Point->ek_1= Speed_Point->ek_0;
- Speed_Point->Uk_1= Speed_Point->Uk;
- if(Speed_Point->Uk >= PWM_Max)
- {
- returnPWM_Max;
- }
- elseif(Speed_Point->Uk <= PWM_Min)
- {
- returnPWM_Min;
- }
- return(Speed_Point->Uk);
- }
复制代码
通过定时的完成算法调用,产生输出控制量。
3. 运行效果
|