郝云鵬
(鞍山師范學(xué)院物理科學(xué)與技術(shù)學(xué)院,遼寧鞍山114007)
PID是最常用的一種自動控制方式.PID是按偏差的比例(P)、積分(I)和微分(D)進(jìn)行自動控制的控制器.
比例環(huán)節(jié):即時成比例地反應(yīng)控制系統(tǒng)的偏差信號,偏差一旦產(chǎn)生,立即產(chǎn)生控制以減少偏差;
積分環(huán)節(jié):主要用于消除靜差,提高系統(tǒng)的無差度;
微分環(huán)節(jié):能反映偏差信號的變化趨勢(變化速率),并能在偏差信號的值變得太大之前,在系統(tǒng)中引入一個有效的早期修正信號,從而加快系統(tǒng)的動作速度,減少調(diào)節(jié)時間[1].
用單片機(jī)對直流電機(jī)的轉(zhuǎn)速進(jìn)行自動控制比起其它方法經(jīng)濟(jì)性好且系統(tǒng)簡單,而用AVR單片機(jī)比起51單片機(jī)對直流電機(jī)的轉(zhuǎn)速進(jìn)行自動控制更為簡便,因?yàn)锳VR單片機(jī)內(nèi)部有很好用的直接用TC產(chǎn)生PWM的方法.
調(diào)速的原理,取測速值與設(shè)定值的差值作為輸入值,用PWM的方法調(diào)節(jié)電壓的大小,使直流電機(jī)轉(zhuǎn)速趨近于設(shè)定值[2].
轉(zhuǎn)速自動調(diào)節(jié)的精度與Kp,Ki,Kd3個系數(shù)有很大的關(guān)系,需經(jīng)反復(fù)調(diào)試才能得出.
轉(zhuǎn)速的顯示,采用了4位的數(shù)碼管.速度的調(diào)試采用了外部中斷的技術(shù).PWM調(diào)速應(yīng)用了定時計(jì)數(shù)器的技術(shù).PID算式采用了增量型的PID算式[3].
系統(tǒng)框圖如圖1.
圖1 系統(tǒng)框圖
C程序如下:
#include < iom16v.h >[4]
#include < macros.h >[4]
#define F_CPU 8000000
unsigned char Duan[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char Data_Buffer[8]={0,0,0,0,0,0,0,0};
unsigned char i=0;
int e,e1,e2;
float uk;
int out=0;
unsigned int SpeedSet=150;
unsigned int Inpluse=0,num=0;
unsigned char time=0,bit=0;
#pragma interrupt_handler timer2_fun:5
void timer2_fun(void)
{
bit++;
time++;
if(bit>7)bit=0;
PORTA=0XFF;
PORTC=Duan[Data_Buffer[bit]];
switch(bit)
{
case 0:PORTA=0X7F;break;
case 1:PORTA=0XBF;break;
case 2:PORTA=0XDF;break;
case 3:PORTA=0XEF;break;
case 4:PORTA=0XF7;break;
case 5:PORTA=0XFB;break;
case 6:PORTA=0XFD;break;
case 7:PORTA=0XFE;break;
}
}
#pragma interrupt_handler int0_fun:2
void int0_fun(void)
{
Inpluse++;
}
void init()
{
DDRA=0XFF;PORTA=0X00;
DDRB=0X00;PORTB=0X00;
DDRC=0XfF;PORTC=0X00;
DDRD=0XF0;PORTD=0XFF;
TCCR1A=0XA3;
TCCR1B=0x0D;
TCCR0=0X6D;
TCCR2=0X05;
TCNT2=256-F_CPU/128/500;
TIMSK|=0X40;
MCUCR=0X02;
SEI();
GICR=0X40;
}
void PIDControl()
{
float Kp=50,Ki=30,Kd=3;
if(time==200)
{
time=0;
num=Inpluse*5;
Inpluse=0;
e=SpeedSet-num;
uk=uk+(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/50;
out=(int)uk;
e2=e1;
e1=e;
if(out>1022){ out=1022;
}
else if(out<0)
{
out=0;
}
OCR1A=out;
}
}
void SetSpeed()
{
if((PIND&0X01)==0)
{
SpeedSet+=10;
if(SpeedSet>1500)
{
SpeedSet=1500;
}
while(!(PIND&0X01));
}
if((PIND&0X02)==0)
{
SpeedSet-=10;
if(SpeedSet<0)
{
SpeedSet=0;
}
while(!(PIND&0X02))
;
}
}
void SegRefre()
{
Data_Buffer[0]=SpeedSet/1000;
Data_Buffer[1]=SpeedSet%1000/100;
Data_Buffer[2]=SpeedSet%100/10;
Data_Buffer[3]=SpeedSet%10;
Data_Buffer[4]=num/1000;
Data_Buffer[5]=num%1000/100;
Data_Buffer[6]=num%100/10;
Data_Buffer[7]=num%10;
}
void main(void)
{
init();
while(1)
{
SegRefre();
SetSpeed();
PIDControl();
}
}
調(diào)速的難點(diǎn)是精度和響應(yīng)快慢,本文是采用反復(fù)試驗(yàn)的方法,不斷調(diào)整Kp,Ki,Kd3個參數(shù),直到實(shí)現(xiàn)我們的要求.
本文先在Proteus仿真軟件上進(jìn)行了實(shí)驗(yàn),獲得通過后,又在實(shí)物上進(jìn)行了實(shí)驗(yàn).
[1]江海波.深入淺出AVR單片機(jī)[M].北京:中國電力出版社,2007.
[2]老楊.AVR單片機(jī)工程師是怎樣煉成的[M].北京:電子工業(yè)出版社,2012.
[3]張軍.AVR單片機(jī)應(yīng)用系統(tǒng)開發(fā)典型實(shí)例[M].北京:中國電力出版社,2005.
[4]ATMEL Corporation.AVR 單片機(jī) ATmega16中文說明書[M].USA:ATMEL Corporation,2001.