|
发表于 2006-4-19 10:43:26
|
显示全部楼层
Atmel的494应用笔记有一个数字PI,参考一下吧!我没有用过这个函数,如你成功了告诉一声!!!
/**
* @file mc_control.c
*
* Copyright (c) 2004 Atmel.
*
* @brief This module provide services to control speed for AT90PWM3 Only
* Type of control : PID means proportionnal, integral and derivative.
*
* @version 1.0 (CVS revision : 1.3)
* @date 2006/02/13 12:32:54
* @author raubree
*****************************************************************************/
/* Speed control variables */
signed int speed_error=0; //!<Error calculation
signed int speed_integral = 0;
signed int speed_integ = 0;
signed int speed_proportional = 0;
/**************************************************************************************/
/* Speed Control */
/**************************************************************************************/
/**
* @brief speed controller
* @return value of speed (duty cycle on 16 bits)
* speed_measure has 10 bits resolution
*/
signed int mc_control_speed_16b(signed int speed_ref , signed int speed_measure)
{
signed int Duty = 0;
signed int increment = 0;
// 误差计算
speed_error = speed_ref - speed_measure ;
// 比例项计算 : Kp= 7/64=0.1
speed_proportional = ( speed_error/8 - speed_error/64 );
// 积分项计算
speed_integral = speed_integral + speed_error;
// 速度积分饱和
if(speed_integral > 32000) speed_integral = 32000;
if(speed_integral < -32000) speed_integral = -32000;
// speed_integ = Ki_speed*speed_integral, with Ki_speed = 29/8192=3e-3
speed_integ = (speed_integral - speed_integral/8 + speed_integral/32) / 256 ;
// 占空比计算
increment = speed_proportional + speed_integ;
increment = (increment/2 + increment/4) ; // PI output normalization
// saturation of the PI output饱和 PI输出
if( increment > (signed int)(0) ) {
if (increment <= (signed int)(192)) Duty = (signed int)increment ;
else Duty = 192 ;
}
else {
if (increment < (signed int)(-192)) Duty = -192 ;
else Duty = (signed int)increment ;
}
// return Duty Cycle
return Duty;
} |
|