找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6463|回复: 1
收起左侧

直流电机角度控制电路与单片机源程序

[复制链接]
ID:142127 发表于 2017-12-11 21:27 | 显示全部楼层 |阅读模式
《自控系统实验指导书》2017
实验二、直流电机角度控制
一、实验目的
  • 掌握直流电机角度控制电路的组成。
  • 学习直流电机角度控制系统的设计。

二、实验要求
    在Proteus软件平台上,设计模拟控制电路实现对直流伺服电机(MOTOR-SERVO)的角度控制,角度控制在-100到+100度之间阶跃,设计PID控制器,并调试参数使控制性能达到:阶跃响应超调≤5%。

三、控制对象
直流伺服电机(MOTOR-SERVO)及其线性功率放大电路如下,其中伺服电机含有角度检测电位器,在反馈电位器加5V电源后,它就可以将角度转换为0~5V电压信号,H桥驱动电机进行转动,伺服电机的角度范围应修改为±179度,电机转速分别设置为60、120、180转/分,其他参数不能改。
四、设计提示
用示波器观察反馈电压、控制电压和给定电压波形,来测定控制系统的性能指标。

  • 实验结果

实验小结
通过本次试验,我学习到了直流电机角度控制电路的组成。以及如何设计直流电机角度控制系统,本次实验较难,经过课后努力基本解决了问题。

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char  
  4. #define tim2 (-50000)
  5. #define LCD_COM              0  // Command
  6. #define LCD_DAT  1  // Data
  7. #define LCD1602_DATA P0                                            

  8. sbit LcdRS=P2^0;
  9. sbit LcdRW=P2^1;
  10. sbit LcdEN=P2^2;

  11. sbit DAT = P3^2;
  12. sbit CLK = P3^3;
  13. sbit CS = P3^4;
  14. sbit SW1 = P3^0;
  15. sbit SW2 = P3^1;
  16. sbit LED = P3^7;
  17. sbit IN1 = P1^7;
  18. sbit IN2 = P1^6;
  19. sbit ENA = P1^5;
  20. bit PWM;
  21. uint PWMA,PWMB;
  22. int pos,set,e0,er;
  23. long speed=0;

  24. void DELAY(unsigned int t)
  25. {
  26.   unsigned int i,j ;
  27.   for(i=0;i<t;i++)
  28.               for(j=0;j<50;j++);
  29. }

  30. void LCD_WRITE(unsigned char x,bit WS)
  31. {
  32.   LCD1602_DATA=x;
  33.   LcdRW=0;
  34.   LcdRS=WS;
  35.   LcdEN=1;
  36.   DELAY(1);
  37.   LcdEN=0;
  38. }

  39. void LCD_Initial()
  40. {
  41.   LCD_WRITE(0x38,LCD_COM);   DELAY(5);
  42.   LCD_WRITE(0x38,LCD_COM);   DELAY(5);
  43.   LCD_WRITE(0x01,LCD_COM);   DELAY(5);
  44.   LCD_WRITE(0x06,LCD_COM);   DELAY(5);
  45.   LCD_WRITE(0x0c,LCD_COM);   DELAY(5);
  46. }

  47. void GotoXY(unsigned char x,unsigned char y)
  48. {
  49.   unsigned char code table[4]={0x00,0x40,0x10,0x50};
  50.   LCD_WRITE(0x80+table[x]+y, LCD_COM);
  51. }

  52. void PutCh(char m)
  53. {
  54.   LCD_WRITE(m,LCD_DAT);
  55. }

  56. void Print(unsigned char *str)
  57. {
  58.               while(*str!='\0')
  59.               {
  60.                             PutCh(*str);
  61.                             str++;
  62.               }
  63. }



  64. void Timer2() interrupt 5
  65. {
  66.   static uchar ms;
  67.   TF2=0;
  68.   if(++ms>2)
  69.   {
  70.               er=set-pos;
  71.     speed+=er*15+(er-e0)*2;
  72.     e0=er; ms=0;
  73.               if(speed>833) speed=833;
  74.               if(speed<-833) speed=-833;
  75.   }
  76. }



  77. void Timer0() interrupt 1
  78. {
  79.   ENA=PWM;
  80.   if(PWM)
  81. {TH0=PWMA>>8; TL0=PWMA&0XFF;}
  82.   else
  83.     {TH0=PWMB>>8; TL0=PWMB&0XFF;}
  84.   PWM=!PWM;
  85. }


  86. uint LTC1292(void)
  87. {
  88.               uint i,x;
  89.               CLK=0;DAT=1;CS=0;
  90.               for(i=0;i<14;i++)
  91.               {
  92.                             CLK=1;
  93.                             x<<=1;
  94.                             if(DAT==1) x++;
  95.                             CLK=0;
  96.               }
  97.               CS=1;
  98.               return(x&0xfff);
  99. }

  100.   if(speed>0) {IN1=1; IN2=0;}
  101.   else if(speed<0) {IN1=0; IN2=1;}
  102.   else {IN1=0; IN2=0;}
  103.   if(s<0) s=-s;
  104.   if(s>50000) s=50000;
  105.   PWMA=-s; PWMB=-(50010-s);
  106. }

  107. void main()
  108. {
  109.   int w;
  110.   LCD_Initial();
  111.   GotoXY(1,0); Print("Angle=0000");
  112.   GotoXY(0,0); Print("Set=0000");
  113.   IE=0x87; IT0=1; IT1=1;
  114.   TMOD=0X21; TR0=1;            
  115.   RCAP2H=tim2>>8; RCAP2L=tim2&0xff;
  116.   TH2=tim2>>8; TL2=tim2&0xff;     
  117.   ET2=1;  TR2=1;
  118.   IN2=0;  IN1=0;            
  119.   while(1)
  120.   {            
  121.               if(SW1==1)
  122.                             set=100;
  123.               if(SW2==1)
  124.                             set=-100;
  125.               w=(int)(-(double)LTC1292()*0.088+180);
  126.               pos=w;
  127.     SetPwm(speed);
  128.                 if(set>=0)
  129.      {
  130.                 GotoXY(0,4);
  131.                 PutCh('+');
  132.                    PutCh(set/100+'0');
  133.                 PutCh((set/10)%10+'0');
  134.                 PutCh(set%10+'0');
  135.               }
  136.               else
  137.               {
  138.                 GotoXY(0,4);
  139.                 PutCh('-');
  140.                    PutCh(-set/100+'0');
  141.                 PutCh((-set/10)%10+'0');
  142.                 PutCh(-set%10+'0');
  143. ……………………

  144. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:
《自控系统实验指导书》2017.rar (80.58 KB, 下载次数: 97)
回复

使用道具 举报

ID:326699 发表于 2018-5-16 10:43 | 显示全部楼层
楼主你的,电路附件可以发一分完整的吗,压缩包里不全
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表