用瑞萨R8C2L单片机实现带PID控制120度方波无刷直流马达BLDC
(立花商会深圳代表处--谢工0755-2519 5639)
最近,发现有很多客户有对(BLDC)无刷直流马达的需求,于是就想做个马达Demo板出来,供客户学习参考下。由于我们是瑞萨的一级代理商,近水楼台先得月,就从公司内部拿了R8C2L来实现带Hall的120度BLDC带PID控制。另外,现在电机马达这块,其实现在很多公司也都是用瑞萨的来做,有很多优势,当然这是题外话不说了。
功能如下:
1.LCD显示实际转速,显示非常稳定,误差个位数以内,基本<3以内
2.模拟电风扇分为3档:1档:1200R/Min, 2档:2000R/Min,3档:2700R/Min
3.PID闭环控制,无论是负载还是电压变化,速度会自动修正到设定速度,反应速度快。
3.电机为直流无刷电机。DC24V,4000 RPM, MCU: R8C2L
先上图:
MCU设计分析:
1. 利用R8C2L内部有一个TRD的互补PWM输出来驱动马达,互补PWM有一个Dead Time死区时间设置,如果电机是采用上下桥双相调制,那就非常有用了。我这是采用双相调制,互补PWM驱动。
2.利用R8C2L内部还有个TRC捕捉中断,用来捕捉Hall的换相,Hall每变化一次,就会有一个中断进来,可以进来换相,同理还有内部计数用来读取实际速度,非常实用,这里赞一下。
原理图参考R8C25如下:
PID 控制
PI闭环控制:
开环:就是没有反馈,闭环就是有速度反馈信息。如下图
一个基本闭环组成有:
1.反馈元素:Hall传感器及Timer RB反馈回速度信息
2.错误检测:AD-Pot设定速度及实际测量速度计算相差误差
3.增益放大:能通过增益Gate放大误差计算出电压及校正速度
总结:PI作用就是将速度误差转化为电流,能过调节PWM来控制马达电压及电流实现调速的目的。
Error = Wr * - Wr //calculate the speed error
Current_Reference = P-Gain *Error; //calculate our current reference
Current_Reference = Current_Reference + Current_Integral; //add in the integral
Current_Integral = Current_Integral + (Error * I-Gain); //accumulate the error as Integral
Voltage_PWM = Current_Reference * Motor_Impedance; //Current to absolute motor voltage
Ratio = Voltage_PWM / Voltage_Bus; //ratio of motor voltage to bus voltage
PWM_Counts = Ratio * PWM_MAX; //finally actual PWM counts to load in timer
我这里采用的是位置式PID,个人感觉位置式PID中若只用P调节反应快一点,增量式PID稳定点效果好一点,我取了前者,这个根据产品需要,需要自己多测试最佳点才行。
//=============================================================
// ----Function: LocPIDCalc()
// ------Syntax: unsigned int locPIDCalc(unsigned int NextPoint);
// -Description: Location Digital PID calculate
// -------Notes: Basic Location Digital PID
// --parameters: Next Point
// -----returns: Location controls parameter
//=============================================================
int LocPIDCalc(int NextPoint)
{
register int iError,dError;
iError = sptr->SetPoint - NextPoint; // 偏差
sptr->SumError += iError; // 积分
dError = iError - sptr->LastError; // 当前微分
sptr->LastError = iError;
return(sptr->Proportion * iError // 比例项
+ sptr->Integral * sptr->SumError // 积分项
+ sptr->Derivative * dError);
}
做到这里,几个主要点已经介绍完了,详情还望大家多多交流一下,一起进步。
再发实图
有项目合作或技术交流,多可以来电咨询,大家共同进步!