[转载]利用PID算法控制输出波形(atmega16,AD反馈)

标签:
转载 |
分类: 学术研究 |
原文地址:利用PID算法控制输出波形(atmega16,AD反馈)作者:牛肉拉面
主函数
http://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gif http://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gif
#include<iom16v.h>
#include<macros.h>
#include"1602.h"
#include "ad.h"
#include"pid.h"
#define uchar unsigned char
#define uint unsigned int
void actuator(double rDelta) // Dummy Actuator Function
{
uchar b[4];
uint i,ad;
DDRD|=0X30;
TCCR1A=0X63;
TCCR1B=0X13;//相位修正PWM,周期为对应快速PWM的2倍,64分频
OCR1A=600;//决定输出的频率
OCR1B=100+rDelta;
while(PINC|~BIT(2))
//AD显示
{
GotoXY(0,0);
ad=ad2543work(0);
b[0]=ad/1000;
b[1]=ad/100;
b[2]=ad/10;
b[3]=ad;
for(i=0;i<4;i++)
{
write_dat(b[i]+0x30);
}
delay(100);
}
}
void main(void)
{ uchar b[4];
uint i,ad;
PID sPID; // PID Control Structure
double rOut; // PID Response (Output)
double rIn; // PID Feedback (Input)
lcd1602_init();
ad_init();
PIDInit ( &sPID ); // Initialize Structure
sPID.Proportion =0.00003; // Set PID Coefficients
sPID.Integral =0.00006;
sPID.Derivative =0.00001;
sPID.SetPoint =800; // Set PID Setpoint
DDRD|=0X30;
TCCR1A=0X63;
TCCR1B=0X13;//相位修正PWM,周期为对应快速PWM的2倍,64分频
OCR1A=600;//决定输出的频率
OCR1B=100;
while(1)
{
while(PINC|~BIT(2))
//AD显示
{
GotoXY(0,0);
ad=ad2543work(0);
b[0]=ad/1000;
b[1]=ad/100;
b[2]=ad/10;
b[3]=ad;
for(i=0;i<4;i++)
{
write_dat(b[i]+0x30);
}
delay(100);
rIn=ad2543work(0);
// Mock Up of PID Processing
rOut = PIDCalc ( &sPID,rIn ); //
Perform PID Interation
if(sPID.SetPoint-rIn>30)
OCR1B+=rOut;
if(rIn-sPID.SetPoint>30)
OCR1B-=rOut;
}
}
}
http://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gif http://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gif
PID控制(PID.h)
#ifndef _PID_h //如果到目前为止还没有定义过“_feed_dog_h”这个宏
#define _PID_h //则定义“_feed_dog_h”这个宏
#include <string.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;
http://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gif http://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gif
#include<iom16v.h>
#include<macros.h>
#include"1602.h"
#include "ad.h"
#include"pid.h"
#define uchar unsigned
#define uint unsigned int
void actuator(double rDelta) // Dummy Actuator Function
{
void main(void)
{ uchar b[4];
PID sPID; // PID Control Structure
double rOut; // PID Response (Output)
double rIn; // PID Feedback (Input)
lcd1602_init();
PIDInit ( &sPID ); // Initialize Structure
sPID.Proportion =0.00003; // Set PID Coefficients
sPID.Integral =0.00006;
sPID.Derivative =0.00001;
sPID.SetPoint =800; // Set PID Setpoint
{
}
http://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gif http://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gifhttp://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gif
PID控制(PID.h)
#ifndef _PID_h //如果到目前为止还没有定义过“_feed_dog_h”这个宏
#define _PID_h //则定义“_feed_dog_h”这个宏
#include <string.h>
typedef struct PID {
double SetPoint;
double Proportion;
double Integral;
double Derivative;
double LastError;
double PrevError;