|
7楼
楼主 |
发表于 2011-2-13 21:58:57
|
只看该作者
纠正了PID程序...之前的PID程序有误所以震荡很严重,其实之前PID程序能把磁铁挂起还真幸运。现在已经很稳了,PID参数调整对稳定性影响也不大。
有一个PC监视真的很方便。
///////////////////////////////////////////////
//PID控制函数
//入口参数:两个通道的ADC值
///////////////////////////////////////////////
void PIDControl(int adc1,int adc2)
{
#define PWMVALUE TIM2->CCR2
UCHAR8 DataBeTrans[2];
const int PWMBias=00,DistanceBias=550;//PWM调整基值,磁铁与霍尔距离基值
static int MagnetDistance[1001];//磁铁距离数组,1001大小是为了可能要后后期分析
static UINT32 DistancePointer=11;//磁铁距离数组指针
static int MagnetSpeed[1001];//磁铁速度数组
static UINT32 SpeedPointer=11;//磁铁速度数组指针
static int Proportion,Integration,Differentiation,Result;//比例,积分,微分,运算结果
DistancePointer++;
SpeedPointer++;
MagnetDistance[DistancePointer%1000] =(DistanceBias- adc1+adc2);//求两霍尔差值得到距离,原来这里给弄错了。
if(MagnetDistance[DistancePointer%1000]<0)MagnetDistance[DistancePointer%1000]= 0;
MagnetSpeed[SpeedPointer%1000] = MagnetDistance[DistancePointer%1000]
- MagnetDistance[(DistancePointer-4)%1000];//求四毫秒间平均速度
Proportion = ( MagnetDistance[DistancePointer%1000]
+MagnetDistance[(DistancePointer-1)%1000]
+MagnetDistance[(DistancePointer-2)%1000]
+MagnetDistance[(DistancePointer-3)%1000]
)/4;//求四毫秒间平均距离,为了去除噪音
// if(Proportion > DistanceBias)Proportion=DistanceBias;
Proportion = Proportion*35;//距离减去距离基值乘以P参数7,得到比例调整值
//,括号里的Proportion在上面求得了平均距离
Differentiation = MagnetSpeed[SpeedPointer%1000]*200;//速度乘以D参数220,得到微分调整值
Integration = 0;//不需要积分项
Result = PWMBias + Proportion + Differentiation + Integration;//求和
if(Result>4096) Result=0;
if(Result<0) Result=0;
PWMVALUE = Result;//把结果给PWM
//以下为PC监视服务程序
ADCtoPC_Protocol(MagnetDistance[DistancePointer%1000], 1 , DataBeTrans);//将得到的AD值转换为PC协议可接收的数组
//监视距离
InsertDataToTxGroup(USART1,DataBeTrans[0]);//发送第一字节,高8位
InsertDataToTxGroup(USART1,DataBeTrans[1]);//发送第二字节,低8位
}
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ |
|