中级会员
 
- 积分
- 202
- 金钱
- 202
- 注册时间
- 2019-7-17
- 在线时间
- 40 小时
|
10金钱
头文件
#ifndef _PID_H_
#define _PID_H_
#include "stm32f10x.h"
typedef struct
{
float currdianya; //当前电压
float setdianya; //设定电压
// float currdianliu; //当前电流
// float setdianliu;
float P; //比例系数
float I; //积分
float D; //微分
float En; //当前误差
float En_1; //上次误差
float En_2; //前次误差
float Dout; //增量PID,增量值
int currpwm; //当前的pwm宽度
}PID;
void PIDParament_Init(void); //pid初始化
void pid_calc(void); //PID计算
#endif
.C文件
#include "PID.h"
#include "PWM.h"
#include "usart.h"
#include "TIMER.h"
#include "lcd.h"
PID pid; //全局变量,main里引用
//pid初始化
void PIDParament_Init()
{
pid.setdianya =5.0; //电压,初始值设定
// pid.setdianliu=0;
pid.currpwm=0; //当前占空比,当前占空比
pid.En=0.0;
pid.En_1=0.0;
pid.En_2=0.0;
pid.P=144; //比例系数42.63----50.2
pid.I=0.1;
pid.D=0.0;
}
//pid计算以及更新数据
void pid_calc()
{
pid.En=pid.setdianya-pid.currdianya; //本次电压误差
pid.Dout=pid.P*(pid.En-pid.En_1)+pid.I*pid.En+pid.D*(pid.En-2*pid.En_1+pid.En_2);//增量式PID
pid.currpwm=(int)(pid.currpwm+pid.Dout); //本次应该输出的PWM,
printf("\r\n\r\n%d\r\n\r\n",pid.currpwm);
if(pid.currpwm>2400)//限幅
{
pid.currpwm=2400;
}
if(pid.currpwm<1000)
{
pid.currpwm=1000;
}
TIM_SetCompare1(TIM5,pid.currpwm);//改变占空比
pid.En_2=pid.En_1;//更新
pid.En_1=pid.En;
}
主函数里不断采集电压,将采集的得到的电压送给: pid.currdianya=vol0; //更新pid当前数据
用定时器计数,计数50ms,在溢出中断里进行PID计算.
问题是不管怎么调节参数,输出一直为最大值????
|
|