找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4380|回复: 1
打印 上一主题 下一主题
收起左侧

单片机步进电机控制器的设计-电子系统设计创新实验报告+仿真+源码

[复制链接]
跳转到指定楼层
楼主
电子系统设计创新实验报告
题目步进电机控制器的设计

设计要求:
  • 步进电机是用电脉冲信号进行控制,将电脉冲信号转换成相应的角位移或线位移的微电动机,它突出的优点是可以在宽广的频率范围内通过改变脉冲频率来实现调速,快速启停,正反转控制及制动等

摘要
   通过制作步进电机控制器的设计,加深对数字电路和模拟电路的理解以及了解它们在现实生活中的应用,提高动手能力。

  • 系统总体设计
步进电机控制器的设计设计框图如图所示,系统由按键电路、单片机电路、脉冲放大电路、步进电机等部分组成。时钟电路产生一个时钟信号,
  • 系统的按键电路
     步进电机按键电路如图1所示
     
图1
              该按键电路由六个按键开关组成,第一个按钮为运行状态控制,运行电机的启动与关闭;第二个按钮为转速控制,控制电机的转速;第三个按钮为步进数预制,可以设置电机的圈数使其自动停止;第四个按钮为模式调节,可以控制电机的模式;第五个与第六个按钮为前三个按钮的参数调节,可以调节它们的参数。
(2)时钟电路
此系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。MCS-51内部有一个用于构成振荡器的高增益反相放大器。这个放大器外接晶体谐振器以及电容CX1和CX2构成并联谐振电路,接在放大器的反馈回路中构成时钟电路。时钟频率越高,单片机控制器的控制节拍越快,运算速度也就越快。
图2
  • 系统软件设计
整个系统工作的流程图如下图所示:图需要用VISIO绘制

              对流程图进行描述,如:
              系统上电初始化,然后进入等待按键状态,如果无按键按下,则继续等待,如有按键按下,则判断是哪一个按键,然后执行相应的功能。
还可以再细点
四、系统测试及调试(仿真)——如果是实物制作,则写系统测试及调试,如果是仿真,则写系统测试与仿真
图3 …….

在protues软件中绘制系统原理图,如下图所示:

(整个系统的原理图)

仿真过程中,记录了7个不同的仿真波形,如图3所示,…….然后对图中内容进行说明,可以看出来它们的速度进行调节会越来越快。


仿真中如还有其它现象则写进来!



五、结论
系统在仿真过程中比较顺利,没有出现什么大问题,只是在运行中显示当前步进数的时候,LCD1602刷新步数不是很连续。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "lcd.h"

  3. sbit RUN_LED = P2^3;
  4. sbit ON_OFF = P2^4;
  5. sbit SPEED = P2^5;
  6. sbit STEP = P2^6;
  7. sbit MOD = P2^7;
  8. sbit UP = P3^0;
  9. sbit DOWN = P3^1;
  10. sbit M1 = P3^2;
  11. sbit M2 = P3^3;
  12. sbit M3 = P3^4;

  13. #define ui unsigned int
  14. #define uc unsigned char

  15. uc ON_OFF_DATA = 0;//开为1,关为0
  16. unsigned char SPEED_DATA = 5;//默认速度为20,即1.5度为1800r/s,3.0度为600r/s,范围为1-10
  17. unsigned long STEP_RECORD = 0;//步进圈速
  18. unsigned long STEP_PRESET = 0;//步进预置数
  19. uc MOD_STEP = 0;  //正反转,正转为0,反转为1
  20. uc MOD_PHASE = 0;//相位控制,3.0度为0,1.5度为1
  21. uc SetOrNonSetNumberStartUp ;//置数与非置数模式启动判断,0为非置数模式,为1为指数模式
  22. char STATE=0;//此变量存储线圈通电状态,在中断3中switch语句中对应
  23. uc ControlState=0;

  24. code uc Disp[]=" STARTING UP ";

  25. int Button();
  26. void Timer1Init();
  27. void control(uc button);

  28. void aaaa()
  29. {
  30.         uc i;
  31.         LcdInit();
  32.         for(i=0;i<13;i++)
  33.         {
  34.                 LcdWriteData(Disp[i]);
  35.         }
  36. }

  37. void main()
  38. {
  39.         M1 = 0;
  40.         M2 = 0;
  41.         M3 = 0;
  42.         
  43.         RUN_LED = 0;
  44.         LcdInit();
  45.         Timer1Init();
  46.         aaaa();
  47.         
  48.         while(1)
  49.         {
  50.                
  51.                 control(Button());
  52.         }
  53. }

  54. int Button()
  55. {
  56.         static char CACHE_ON_OFF=1,
  57.                                 CACHE_SPEED=1,
  58.                                 CACHE_STEP=1,
  59.                                 CACHE_MOD=1,
  60.                                 CACHE_UP=1,
  61.                                 CACHE_DOWN=1;        
  62.         //////////////////////////////////////////////
  63.         if(ON_OFF == 0)
  64.         {
  65.                 //delay(10);
  66.                 if( CACHE_ON_OFF != ON_OFF ) // 按键消抖逻辑与上,上一次存入CACHE_ON_OFF的ON_OFF状态     
  67.                 {
  68.                         CACHE_ON_OFF = ON_OFF;//将这一次ON_OFF的状态存入CACHE_ON_OFF中
  69.                         return 1;
  70.                 }
  71.         }
  72.         else        //将这一次ON_OFF的状态存入CACHE_ON_OFF中
  73.         {
  74.                 CACHE_ON_OFF = 1;
  75.         }
  76.         /////////////////////////////////////////////
  77.         if(SPEED == 0)
  78.         {
  79.                 //delay(10);
  80.                 if( CACHE_SPEED != SPEED ) // 按键消抖逻辑与上,上一次存入CACHE_SPEED的SPEED状态     
  81.                 {
  82.                         CACHE_SPEED = SPEED ;//将这一次SPEED的状态存入CACHE_SPEED中
  83.                         return 2;
  84.                 }
  85.         }
  86.         else        //将这一次SPEED的状态存入CACHE_SPEED中
  87.         {
  88.                 CACHE_SPEED = 1;
  89.         }
  90.         /////////////////////////////////////////////
  91.         if(STEP == 0)
  92.         {
  93.                 //delay(10);
  94.                 if( CACHE_STEP != STEP ) // 按键消抖逻辑与上,上一次存入CACHE_STEP的STEP状态     
  95.                 {
  96.                         CACHE_STEP = STEP;//将这一次STEP的状态存入CACHE_STEP中
  97.                         return 3;
  98.                 }
  99.         }
  100.         else        //将这一次STEP的状态存入CACHE_STEP中
  101.         {
  102.                 CACHE_STEP = 1;
  103.         }
  104.         //////////////////////////////////////////////
  105.         if(MOD == 0)
  106.         {
  107.                 //delay(10);
  108.                 if( CACHE_MOD != MOD ) // 按键消抖逻辑与上,上一次存入CACHE_MOD的MOD状态     
  109.                 {
  110.                         CACHE_MOD = MOD;//将这一次MOD的状态存入CACHE_MOD中
  111.                         return 4;
  112.                 }
  113.         }
  114.         else        //将这一次MOD的状态存入CACHE_MOD中
  115.         {
  116.                 CACHE_MOD = 1;
  117.         }
  118.         //////////////////////////////////////////////
  119.         if(UP == 0)
  120.         {
  121.                 //delay(10);
  122.                 if( CACHE_UP != UP )   
  123.                 {
  124.                         CACHE_UP = UP;
  125.                         return 5;
  126.                 }
  127.         }
  128.         else        
  129.         {
  130.                 CACHE_UP = 1;
  131.         }
  132.         //////////////////////////////////////////////
  133.         if(DOWN == 0)
  134.         {
  135.                 //delay(10);
  136.                 if( CACHE_DOWN != DOWN )   
  137.                 {
  138.                         CACHE_DOWN = DOWN;
  139.                         return 6;
  140.                 }
  141.         }
  142.         else        
  143.         {
  144.                 CACHE_DOWN = 1;
  145.         }

  146.         return 0;
  147. }











  148. void control(uc button)
  149. {
  150.         static uc d=0;
  151.         static STEP_RECORD_COMPARE;
  152.         if(button == 2 || button == 3 || button == 4)
  153.         {
  154.                 ControlState = button;//保存当前控制界面
  155.         }
  156.         if (button == 0)
  157.         {
  158.                 if( ControlState == 3 )
  159.                 {
  160.                         if( STEP_RECORD_COMPARE != STEP_RECORD)
  161.                         {
  162.                                 LcdStep();
  163.                                 STEP_RECORD_COMPARE = STEP_RECORD;
  164.                         }
  165.                 }
  166.         }
  167.         else if(button == 1)
  168.         {
  169.                 if( (button != 5) && (button != 6) ) //进入此if语句不能为上下键
  170.                 {
  171.                         ON_OFF_DATA = !ON_OFF_DATA;
  172.                         RUN_LED = ON_OFF_DATA;
  173.                 }
  174.                 if(ON_OFF_DATA == 0)//关闭
  175.                 {
  176.                         EA = 0;//关闭中断
  177.                         M1 = 0;
  178.                         M2 = 0;
  179.                         M3 = 0;
  180.                         SetOrNonSetNumberStartUp = 0;//置数与非置数模式置位为非置数模式
  181.                         if( ControlState == 3 )
  182.                         {
  183.                                 LcdStep();
  184.                         }

  185.                 }
  186.                 else if(ON_OFF_DATA == 1)
  187.                 {
  188.                         SetOrNonSetNumberStartUp = STEP_PRESET;
  189.                         EA = 1;//打开总中断
  190.                         STATE=0;
  191.                 }
  192.         }
  193.         //判断运行状态为运行还是关闭,1运行则无法修改,if(b == 0)
  194.         
  195.         else if(ControlState == 2)//speed参数调整
  196.         {
  197.                 if(ON_OFF_DATA == 0)
  198.                 {
  199.                         if( (button == 5) && ( SPEED_DATA < 10 ) )
  200.                         {
  201.                                 SPEED_DATA++;
  202.                         }
  203.                         else if( (button == 6) && (SPEED_DATA > 1) )
  204.                         {
  205.                                 SPEED_DATA--;
  206.                         }
  207.                 }
  208.                 LcdSpeed();
  209.                 ///////////////////////////////////////////////////////////////
  210.         }
  211.         else if (ControlState == 3)//STEP,运行圈速预置
  212.         {
  213.                 if( (ON_OFF_DATA == 0) != (button == 3))//进入此if语句不得为运行状态,切必须为上下键
  214.                  {
  215.                         if(button == 5)
  216.                         {
  217.                                 STEP_PRESET++;
  218.                         }
  219.                         else if( (button == 6) && (STEP_PRESET != 0) )
  220.                         {
  221.                                 STEP_PRESET--;
  222.                         }
  223.                 }
  224.                 else if(ON_OFF_DATA == 0)
  225.                 {
  226.                         STEP_PRESET = 0;
  227.                         STEP_RECORD = 0;
  228.                         //步数和步速置数清零
  229.                 }        
  230.                 LcdStep();//更新显示命令               
  231.         }
  232.         else if (ControlState == 4)//mod,模式预置
  233.         {
  234.                 if( (button != 5) && (button != 6) )
  235.                 {
  236.                         d = !d;
  237.                 }
  238.                 if(d == 0)
  239.                 {
  240.                                 if(button == 5)
  241.                                 {
  242.                                         if ((MOD_STEP != 1) && (ON_OFF_DATA == 0) )
  243.                                         {
  244.                                                 MOD_STEP++;
  245.                                         }
  246.                                 }
  247.                                 else if(button == 6)
  248.                                 {
  249.                                         if((MOD_STEP != 0)  && (ON_OFF_DATA == 0) )
  250.                                         {
  251.                                                 MOD_STEP--;
  252.                                         }
  253.                                 }
  254.                                 LcdModStep();//更新正反转显示命令
  255.                 }
  256.                 else if(d != 0)
  257.                 {
  258.                                 if(button == 5)
  259.                                 {
  260.                                         if ( (MOD_PHASE != 1) && (ON_OFF_DATA == 0) )
  261.                                         {
  262.                                                 MOD_PHASE++;
  263.                                         }
  264.                                 }
  265.                                 else if(button == 6)
  266.                                 {
  267.                                         if ( (MOD_PHASE != 0)  && (ON_OFF_DATA == 0) )
  268.                                         {
  269.                                                 MOD_PHASE--;
  270.                                         }
  271.                                 }
  272.                                 LcdModPhase();//更新相位显示命令
  273.                 }
  274.         }
  275. }




  276. void Timer1Init()//定时器初始化
  277. {
  278.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

  279.         TH0=0XFC;        //给定时器赋初值,定时8.33ms
  280.         TL0=0X18;        
  281.         ET0=1;//打开定时器1中断允许
  282.         TR0=1;//打开定时器        


  283.         EA=0;//打开总中断

  284. }



  285. void Timer0() interrupt 1
  286. {
  287.         static ui b=0;
  288.         
  289.         TH0=0XFC;        //给定时器赋初值,定时8.33ms
  290.         TL0=0X18;
  291.         //if(SetOrNonSetNumberStartUp == 0)
  292.         if( b >= (11 - SPEED_DATA) )
  293.         {
  294.                 b = 0;
  295.                 if( (MOD_STEP == 0) && (MOD_PHASE == 0) ) //正转3
  296.                 {
  297.                         STATE++;
  298.                         STATE++;
  299.                         if( STATE > 4 )
  300.                         {
  301.                                 STATE = 0;
  302.                         }
  303.                 }
  304.                 else if( (MOD_STEP == 0) && (MOD_PHASE == 1) ) //正转1.5
  305.                 {
  306.                         STATE++;
  307.                         if( STATE > 5 )
  308.                         {
  309.                                 STATE = 0;
  310.                         }
  311.                 }
  312.                 else if( (MOD_STEP == 1) && (MOD_PHASE == 0) ) //反转3
  313.                 {
  314.                         STATE--;
  315.                         STATE--;
  316.                         if( STATE < 0 )
  317.                         {
  318.                                 STATE = 4;
  319.                         }
  320.                 }
  321.                 else if( (MOD_STEP == 1) && (MOD_PHASE == 1) ) //反转1.5
  322.                 {
  323.                         STATE--;
  324.                         if( STATE < 0 )
  325.                         {
  326.                                 STATE = 5;
  327.                         }
  328.                 }
  329.                 switch(STATE)
  330.                 {
  331.                         case 0:
  332.                                 M1 = 1;
  333.                                 M2 = 0;
  334.                                 M3 = 0;
  335.                                 break;
  336.                         case 1:
  337.                                 M1 = 1;
  338.                                 M2 = 1;
  339.                                 M3 = 0;
  340.                                 break;
  341.                         case 2:
  342.                                 M1 = 0;
  343. ……………………

  344. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
步进电机控制器的设计.7z (230.14 KB, 下载次数: 105)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-10-20 15:46 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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