找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于步进电机正反转控制的问题

[复制链接]
跳转到指定楼层
楼主
ID:353085 发表于 2018-6-26 23:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
15黑币
正转正常,而反转按90度反转正常,按了反转再按圈数对应的按键无法实现,出现无限正转,请问问题所在?


  1. #include<reg52.h>

  2. sbit key_in1=P2^4;
  3. sbit key_in2=P2^5;
  4. sbit key_in3=P2^6;
  5. sbit key_in4=P2^7;
  6. sbit key_out1=P2^0;
  7. sbit key_out2=P2^1;
  8. sbit key_out3=P2^2;
  9. sbit key_out4=P2^3;
  10. bit dirmotor=0;
  11. unsigned char code keymap[4][4]={
  12.         {0x28,0x27,0x26,0x25},
  13.         {0x0D,0x39,0x36,0x33},
  14.         {0x1B,0x38,0x35,0x32},
  15.         {0x30,0x37,0x34,0x31}};
  16. unsigned char keysta[4][4]={
  17.         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};

  18. signed long beats;
  19.         void keyDriver();
  20.         
  21.         void main()
  22.         {
  23.                 EA=1;
  24.                 TMOD=0x01;
  25.                 TH0=0xFC;
  26.                 TL0=0x67;
  27.                 ET0=1;
  28.                 TR0=1;
  29.                
  30.                 while(1)
  31.                 {
  32.                         keyDriver();
  33.                 }
  34.         }
  35.         void starmotor(signed long angle)
  36.         {
  37.                 EA=0;
  38.                 beats= ( angle * 4076 ) / 360;
  39.                 EA=1;
  40.         }
  41.         void keyaction(unsigned int keycode)
  42.         {
  43.    static bit dirmotor=0;
  44.         if((keycode>=0x30)&&(keycode<=0x39))
  45.                         {
  46.                                 if(dirmotor==0)
  47.                                 
  48.                                         starmotor((keycode-0x30)*360);
  49.                                 
  50.                                         else
  51.             starmotor((keycode-0x30)*360*);
  52.                                        
  53.                                        
  54.                                 }
  55.         else if(keycode==0x0D)
  56.         {
  57.   dirmotor=1;
  58.         }
  59.   else if(keycode==0x26)
  60.         {
  61.   dirmotor=0;
  62.         }
  63.   else if(keycode==0x28)
  64.         {
  65.                
  66. starmotor(90);
  67.                
  68.         }
  69.   else if(keycode==0x27)
  70.         {
  71. starmotor(-90);
  72.         }
  73.   else if(keycode==0x1B)
  74.         {
  75.   EA=0;
  76.                 beats=0;
  77.                 EA=1;
  78.         }
  79. }        
  80.                                        
  81.         void keyDriver()
  82.         {
  83.         static          unsigned char backup[4][4]={
  84.                         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
  85.                
  86.                 unsigned char j=0;
  87.                 unsigned char k=0;
  88.                 for(j=0;j<4;j++)
  89.                   {
  90.                                 for(k=0;k<4;k++)
  91.                                 {
  92.                                         if(keysta[j][k]!=backup[j][k])
  93.                                         {
  94.                                                 if(backup[j][k]==0)
  95.                                                 {
  96.                                                         keyaction(keymap[j][k]);
  97.                                                 }
  98.                                         backup[j][k]=keysta[j][k];
  99.                                                 
  100.                                         }
  101.                                 }
  102.                         }
  103.                 }
  104.                
  105. void keyscan()
  106. {
  107.         static unsigned char keybuf[4][4]={
  108.                 {0xFF,0xFF,0xFF,0xFF},
  109.                 {0xFF,0xFF,0xFF,0xFF},
  110.                 {0xFF,0xFF,0xFF,0xFF},
  111.                 {0xFF,0xFF,0xFF,0xFF}};
  112.         unsigned char i=0;
  113. static unsigned char cnt=0;
  114.         
  115. keybuf[cnt][0]=(keybuf[cnt][0]<<1)|key_in1;        
  116. keybuf[cnt][1]=(keybuf[cnt][1]<<1)|key_in2;        
  117. keybuf[cnt][2]=(keybuf[cnt][2]<<1)|key_in3;        
  118. keybuf[cnt][3]=(keybuf[cnt][3]<<1)|key_in4;        
  119. for(i=0;i<4;i++)
  120. {
  121. if((keybuf[cnt][i]&0x0F)==0x0F)
  122. {
  123.   keysta[cnt][i]=1;
  124. }
  125. else if ((keybuf[cnt][i]&0x00)==0x00)
  126. {
  127.         keysta[cnt][i]=0;
  128. }
  129. }
  130. cnt++;
  131. cnt=cnt&0x03;
  132. switch(cnt)
  133. {
  134.         case 0 : key_out4=1;key_out1=0;break;
  135.         case 1 : key_out1=1;key_out2=0;break;
  136.         case 2 : key_out2=1;key_out3=0;break;
  137.         case 3 : key_out3=1;key_out4=0;break;
  138.         default: break;
  139. }
  140. }

  141.                
  142.                
  143.                
  144. void turnmotor()
  145. {
  146.         unsigned char tmp;
  147.         unsigned char code beatscode[8]={
  148.                 0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6};
  149.         static signed  char index=0;
  150.         
  151.         if(beats>0)
  152.         {
  153.                 tmp=P1;
  154.                 tmp=index&0xF0;
  155.                 tmp=tmp|beatscode[index];
  156.                 P1=tmp;
  157.                 index++;
  158.                 index=index&0x07;
  159.                 beats--;
  160.         }
  161.         else if (beats<0)
  162.         {
  163.                 tmp=P1;
  164.                 tmp=index&0xF0;
  165.                 tmp=tmp|beatscode[index];
  166.                 P1=tmp;
  167.                 index--;
  168.                 if(index<0)
  169.                 {
  170.                         index=7;
  171.                 }
  172.                 beats++;
  173.         }
  174.         else
  175.         {
  176.                 P1=P1|0x0F;
  177.         }
  178. }
  179.         
  180. void interrupttimer0() interrupt 1
  181. {
  182.         static bit div=0;
  183.          TH0=0xFC;
  184.          TL0=0x67;
  185.         keyscan();
  186.         div=~div;
  187.         if(div==1)
  188.         {
  189.                 turnmotor();
  190.         }
  191. }
复制代码


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

使用道具 举报

沙发
ID:320306 发表于 2018-6-27 08:28 | 只看该作者
正传和反正的通电顺序不同的,代码要结合原理图才能看出来,你可以自己查找!!!!!!!!!!!!!

评分

参与人数 1黑币 +8 收起 理由
figo88130 + 8 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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