《自控系統實驗指導書》2017 實驗二、直流電機角度控制 一、實驗目的 - 掌握直流電機角度控制電路的組成。
- 學習直流電機角度控制系統的設計。
二、實驗要求 在Proteus軟件平臺上,設計模擬控制電路實現對直流伺服電機(MOTOR-SERVO)的角度控制,角度控制在-100到+100度之間階躍,設計PID控制器,并調試參數使控制性能達到:階躍響應超調≤5%。
三、控制對象 直流伺服電機(MOTOR-SERVO)及其線性功率放大電路如下,其中伺服電機含有角度檢測電位器,在反饋電位器加5V電源后,它就可以將角度轉換為0~5V電壓信號,H橋驅動電機進行轉動,伺服電機的角度范圍應修改為±179度,電機轉速分別設置為60、120、180轉/分,其他參數不能改。 四、設計提示 用示波器觀察反饋電壓、控制電壓和給定電壓波形,來測定控制系統的性能指標。
實驗小結 通過本次試驗,我學習到了直流電機角度控制電路的組成。以及如何設計直流電機角度控制系統,本次實驗較難,經過課后努力基本解決了問題。
單片機源程序如下: - #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define tim2 (-50000)
- #define LCD_COM 0 // Command
- #define LCD_DAT 1 // Data
- #define LCD1602_DATA P0
-
- sbit LcdRS=P2^0;
- sbit LcdRW=P2^1;
- sbit LcdEN=P2^2;
-
- sbit DAT = P3^2;
- sbit CLK = P3^3;
- sbit CS = P3^4;
- sbit SW1 = P3^0;
- sbit SW2 = P3^1;
- sbit LED = P3^7;
- sbit IN1 = P1^7;
- sbit IN2 = P1^6;
- sbit ENA = P1^5;
- bit PWM;
- uint PWMA,PWMB;
- int pos,set,e0,er;
- long speed=0;
-
- void DELAY(unsigned int t)
- {
- unsigned int i,j ;
- for(i=0;i<t;i++)
- for(j=0;j<50;j++);
- }
-
- void LCD_WRITE(unsigned char x,bit WS)
- {
- LCD1602_DATA=x;
- LcdRW=0;
- LcdRS=WS;
- LcdEN=1;
- DELAY(1);
- LcdEN=0;
- }
-
- void LCD_Initial()
- {
- LCD_WRITE(0x38,LCD_COM); DELAY(5);
- LCD_WRITE(0x38,LCD_COM); DELAY(5);
- LCD_WRITE(0x01,LCD_COM); DELAY(5);
- LCD_WRITE(0x06,LCD_COM); DELAY(5);
- LCD_WRITE(0x0c,LCD_COM); DELAY(5);
- }
-
- void GotoXY(unsigned char x,unsigned char y)
- {
- unsigned char code table[4]={0x00,0x40,0x10,0x50};
- LCD_WRITE(0x80+table[x]+y, LCD_COM);
- }
-
- void PutCh(char m)
- {
- LCD_WRITE(m,LCD_DAT);
- }
-
- void Print(unsigned char *str)
- {
- while(*str!='\0')
- {
- PutCh(*str);
- str++;
- }
- }
-
-
-
- void Timer2() interrupt 5
- {
- static uchar ms;
- TF2=0;
- if(++ms>2)
- {
- er=set-pos;
- speed+=er*15+(er-e0)*2;
- e0=er; ms=0;
- if(speed>833) speed=833;
- if(speed<-833) speed=-833;
- }
- }
-
-
-
- void Timer0() interrupt 1
- {
- ENA=PWM;
- if(PWM)
- {TH0=PWMA>>8; TL0=PWMA&0XFF;}
- else
- {TH0=PWMB>>8; TL0=PWMB&0XFF;}
- PWM=!PWM;
- }
-
-
- uint LTC1292(void)
- {
- uint i,x;
- CLK=0;DAT=1;CS=0;
- for(i=0;i<14;i++)
- {
- CLK=1;
- x<<=1;
- if(DAT==1) x++;
- CLK=0;
- }
- CS=1;
- return(x&0xfff);
- }
-
- if(speed>0) {IN1=1; IN2=0;}
- else if(speed<0) {IN1=0; IN2=1;}
- else {IN1=0; IN2=0;}
- if(s<0) s=-s;
- if(s>50000) s=50000;
- PWMA=-s; PWMB=-(50010-s);
- }
-
- void main()
- {
- int w;
- LCD_Initial();
- GotoXY(1,0); Print("Angle=0000");
- GotoXY(0,0); Print("Set=0000");
- IE=0x87; IT0=1; IT1=1;
- TMOD=0X21; TR0=1;
- RCAP2H=tim2>>8; RCAP2L=tim2&0xff;
- TH2=tim2>>8; TL2=tim2&0xff;
- ET2=1; TR2=1;
- IN2=0; IN1=0;
- while(1)
- {
- if(SW1==1)
- set=100;
- if(SW2==1)
- set=-100;
- w=(int)(-(double)LTC1292()*0.088+180);
- pos=w;
- SetPwm(speed);
- if(set>=0)
- {
- GotoXY(0,4);
- PutCh('+');
- PutCh(set/100+'0');
- PutCh((set/10)%10+'0');
- PutCh(set%10+'0');
- }
- else
- {
- GotoXY(0,4);
- PutCh('-');
- PutCh(-set/100+'0');
- PutCh((-set/10)%10+'0');
- PutCh(-set%10+'0');
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (7.11 KB, 下載次數: 54)
下載附件
2017-12-11 21:26 上傳
所有資料51hei提供下載:
|