为了学习PID是怎么回事,特别做了此仿真,呵呵, 也可以说是<如何让PID的值转换成PWM的占空比>!
本人之前对PID一点都不懂,此贴主要是和大家分享学习经验!呵呵, 菜鸟贴, 不对的地方请大家拍砖!
此仿真采用的是PIC单片机, 由P1A引脚输出PWM,经过RC滤波后输出电压,AN0 ADC采样
先贴图吧!
PID算法是用的AVR: AVR221: Discrete PID controller 中的源码
//VFER = 2.048v, 10位分辨率(1024),设定稳压电压是1.024v
atmel_1.PNG (29.39 KB, 下载次数: 1)
下载附件
2013-10-26 10:56 上传
最后........
上源码:
ATMEL_ PWM_adc_pid_4.rar
(2.24 MB, 下载次数: 348)
2013-10-26 10:58 上传
点击文件名下载附件
#ifndef __PID_1_H
#define __PID_1_H
typedef struct PID
{
double SetPoint; // 设定目标 Desired Value
double Proportion; // 比例常数 Proportional Const
double Integral; // 积分常数 Integral Const
double Derivative; // 微分常数 Derivative Const
double LastError; // Error[-1]
double PrevError; // Error[-2]
double SumError; // Sums of Errors
}PID;
extern void PIDInit(PID *pp);
extern double PIDCalc(PID *pp, double NextPoint);
#endif
#include "pid_1.h"
#include <string.h>
void PIDInit(PID *pp)
{
memset(pp, 0, sizeof(PID));
}
double PIDCalc(PID *pp, double NextPoint)//这里是位置式算法
{
double dError, Error;
Error = pp->SetPoint - NextPoint; // 偏差, 偏差=设定值-返回值
pp->SumError += Error; // 积分项, 偏差和
dError = pp->LastError - pp->PrevError; // 微分项 上一次误差-上上一次误差
pp->PrevError = pp->LastError;
pp->LastError = Error;
return (pp->Proportion * Error // 比例项
+ pp->Integral * pp->SumError // 积分项
+ pp->Derivative * dError // 微分项
);
}
3.PNG (17.69 KB, 下载次数: 1)
下载附件
2013-10-26 11:30 上传
一周热门 更多>