《自控系统实验指导书》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黑下载附件…………
复制代码
所有资料51hei提供下载: |