运动控制平台整体系统中设计了速度闭环控制,需要传感器精确检测被控制对象的瞬时信息,进行误差校正。测速装置是运动系统中的重要装置,其速度分辨能力的高低是实现高精度,大范围速度测量的重要因素。对于不同的控制系统,所选择的测速装置以及测速方法也会有所不同,所以应根据实际系统的要求,选择不同的测试方法以满足系统要求。
(1)基于光电编码器电机测速方法的分析
控制理论中基于光电编码器的电机测速方法常见的有以下四种方案:M法、T法、M/T法、变M/T法,下面就此四种方案进行比较和分析其优缺点。
方案一:M法(又叫定时测角法)是在规定的时间间隔T内,测量编码器所产生的脉冲数m1来获得被测速度值。该方法的问题是计时准确计数不准确,所以此方法的检测过程在极端情况下会产生±1个转速脉冲的误差,则相对误差为1/m1,当被测装置转速较高时,m1将会较大,故只有在电机转速较高时才会有较高的测量精度。所以M法只适用于高速测量场合。
方案二:T法(又叫定角测时法)是相邻两个脉冲的时间间隔来确定被测速度的方法。该方法是计数准确计时不准确,此方法在极端会产生±1个高频脉冲周期。因此T法在低速测量(相邻转速脉冲间隔时间较大)时才会有较高的精度。
方案三:M/T法是同时测量检测时间和此检测时间内转速脉冲的个数来确定被测速度。由于转速脉冲的频率远小于高频脉冲的频率,因此如果用转速脉冲信号的上升沿/下降沿来同步计数器的起止,在预定的测速时间内,转速脉冲信号的计数值将为整数(无误差) ,只有高频时钟脉冲会产生士1个周期的误差,因其很小,影响可以忽略,所以M /T法可适用于测量高、低速的场合,且具有较高的测速精度,检测时间不宜过长。虽然M /T法测速可满足一些快速性要求不高的速度伺服控制的要求,它具有宽的调速范围、高精度和高分辨率的特点,但对于快速响应的伺服系统,M /T法在低速运行时,会使检测时间过分加长,这是速度闭环所不能忍受的。M/T具有较高的检测精度,但在低速状态下检测时间过长,无法满足控制系统的快速响应。
方案四:变M/T法是指测速过程中,不仅测取的测速脉冲与高频时钟脉冲随电机的转速不同而变化,而且测量时间T也是变化的。所以变M/T法相比较其它三种测速方法在高速、低速时都具有较高的测量精度,而且响应速度快,在闭环控制系统中具有较高的使用价值。
增量式PID参考代码:
typedef struct PID
{
int SetPoint; //设定目标Desired Value
long SumError; //误差累计
double Proportion; //比例常数
double Integral; //积分常数
double Derivative; //微分常数
int LastError; //Error[-1]
int PrevError; //Error[-2]
}PID;
static PID sPID; //定义PID类型的变量sPID
static PID *sptr=&sPID; //指针sptr指向sPID
/**************************************************
Initialize PID Structure PID参数初始化
**************************************************/
void InitPID(void)
{
sptr->SumError=0;
sptr->LastError=0; //Error[-1]
sptr->PrevError=0; //Error[-2]
sptr->Proportion=0; //比例常数
sptr->Integral=0; //积分常数
sptr->Derivative=0; //微分常数
sptr->SetPoint=0;
}
/*************************************************
增量式PID计算
************************************************/
int PIDCalc(int NextPoint)
{
register int iError,PID_end; //当前误差
iError=sptr->SetPoint-NextPoint; //增量计算
PID_end=sptr->Proportion * iError – sptr->Integral*sptr->LastError+sptr->Derivative*sptr->PrevError;
//计算E[k]项,E[k-1]项,E[k-2]项
sptr->PrevError=sptr->LastError;
sptr->LastError=iError; //存储误差,用于下次计算
return(PID_end); //返回增量值
HG:
谢谢分享,下次有好的想法文章也可以去博客文章投稿哦
运动控制平台整体系统中设计了速度闭环控制,需要传感器精确检测被控制对象的瞬时信息,进行误差校正。测速装置是运动系统中的重要装置,其速度分辨能力的高低是实现高精度,大范围速度测量的重要因素。对于不同的控制系统,所选择的测速装置以及测速方法也会有所不同,所以应根据实际系统的要求,选择不同的测试方法以满足系统要求。
(1)基于光电编码器电机测速方法的分析
控制理论中基于光电编码器的电机测速方法常见的有以下四种方案:M法、T法、M/T法、变M/T法,下面就此四种方案进行比较和分析其优缺点。
方案一:M法(又叫定时测角法)是在规定的时间间隔T内,测量编码器所产生的脉冲数m1来获得被测速度值。该方法的问题是计时准确计数不准确,所以此方法的检测过程在极端情况下会产生±1个转速脉冲的误差,则相对误差为1/m1,当被测装置转速较高时,m1将会较大,故只有在电机转速较高时才会有较高的测量精度。所以M法只适用于高速测量场合。
方案二:T法(又叫定角测时法)是相邻两个脉冲的时间间隔来确定被测速度的方法。该方法是计数准确计时不准确,此方法在极端会产生±1个高频脉冲周期。因此T法在低速测量(相邻转速脉冲间隔时间较大)时才会有较高的精度。
方案三:M/T法是同时测量检测时间和此检测时间内转速脉冲的个数来确定被测速度。由于转速脉冲的频率远小于高频脉冲的频率,因此如果用转速脉冲信号的上升沿/下降沿来同步计数器的起止,在预定的测速时间内,转速脉冲信号的计数值将为整数(无误差) ,只有高频时钟脉冲会产生士1个周期的误差,因其很小,影响可以忽略,所以M /T法可适用于测量高、低速的场合,且具有较高的测速精度,检测时间不宜过长。虽然M /T法测速可满足一些快速性要求不高的速度伺服控制的要求,它具有宽的调速范围、高精度和高分辨率的特点,但对于快速响应的伺服系统,M /T法在低速运行时,会使检测时间过分加长,这是速度闭环所不能忍受的。M/T具有较高的检测精度,但在低速状态下检测时间过长,无法满足控制系统的快速响应。
方案四:变M/T法是指测速过程中,不仅测取的测速脉冲与高频时钟脉冲随电机的转速不同而变化,而且测量时间T也是变化的。所以变M/T法相比较其它三种测速方法在高速、低速时都具有较高的测量精度,而且响应速度快,在闭环控制系统中具有较高的使用价值。
增量式PID参考代码:
typedef struct PID
{
int SetPoint; //设定目标Desired Value
long SumError; //误差累计
double Proportion; //比例常数
double Integral; //积分常数
double Derivative; //微分常数
int LastError; //Error[-1]
int PrevError; //Error[-2]
}PID;
static PID sPID; //定义PID类型的变量sPID
static PID *sptr=&sPID; //指针sptr指向sPID
/**************************************************
Initialize PID Structure PID参数初始化
**************************************************/
void InitPID(void)
{
sptr->SumError=0;
sptr->LastError=0; //Error[-1]
sptr->PrevError=0; //Error[-2]
sptr->Proportion=0; //比例常数
sptr->Integral=0; //积分常数
sptr->Derivative=0; //微分常数
sptr->SetPoint=0;
}
/*************************************************
增量式PID计算
************************************************/
int PIDCalc(int NextPoint)
{
register int iError,PID_end; //当前误差
iError=sptr->SetPoint-NextPoint; //增量计算
PID_end=sptr->Proportion * iError – sptr->Integral*sptr->LastError+sptr->Derivative*sptr->PrevError;
//计算E[k]项,E[k-1]项,E[k-2]项
sptr->PrevError=sptr->LastError;
sptr->LastError=iError; //存储误差,用于下次计算
return(PID_end); //返回增量值
mangui zhang:
回复 HG:
好的。 好的东西需要分享