找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2184|回复: 5
收起左侧

单片机步进电机程序问题

[复制链接]
ID:880867 发表于 2021-3-2 12:34 | 显示全部楼层 |阅读模式
请问这里unsigned int MotorDelay,Speed=1,TIM,CT;中的TIM和CT分别代表什么意思?还有A = 0;        //0xf1
b = 1;
C = 1;
D = 1;
A=0,B=1表示什么意思?0XF1是怎么来的求求大神

单片机源程序如下:
  1. /*************************************************************************************
  2. *  标题:  步进电机试验一                                                                                                                         *
  3. *                                                                                                                                                                          *
  4. *    通过本例程了解步进马达使用及驱动程序编写                                                                                 *
  5. *;   单双八拍工作方式:                                                                    *
  6. *;   A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)                                                                       *
  7. *    J14短路冒需断开                                                                       *
  8. *  请学员一定要消化掉本例程                                                                    *
  9.                                                                                                                                *
  10. **************************************************************************************/  
  11. #include "reg52.h"
  12. //Motor
  13. sbit A = P1^0;          //定义管脚
  14. sbit b = P1^1;
  15. sbit C = P1^2;
  16. sbit D = P1^3;

  17. ///////////////////////////////////////
  18. //步进电机驱动
  19. unsigned char MotorStep=0;
  20. unsigned int  MotorTimer = 0;
  21. unsigned int  MotorDelay,Speed=1,TIM,CT;

  22. #define speed 8   // 调整速度 数值不要设的太低 低了会引起震动。

  23. /*****************************************************
  24. *            初始化马达                                                                 *
  25. ******************************************************/
  26. void InitMotor()
  27. {
  28.   A = 1;
  29.   b = 1;
  30.   C = 1;
  31.   D = 1;
  32. }



  33. void SetMotor()
  34. {
  35.   //  if(Speed == 0) return;

  36.     MotorDelay=Speed;        //调整速度
  37.     switch(MotorStep)
  38.     {
  39.        case 0:
  40.           if(TIM)   // A
  41.           {                                    
  42.             A = 0;                    //0xf1  
  43.             b = 1;
  44.                         C = 1;
  45.             D = 1;
  46.             MotorStep = 1;
  47.                         TIM=0;
  48.           }
  49.        break;

  50.        case 1:                 // AB
  51.          if(TIM)
  52.           {        
  53.             A = 0;                   //0xf3
  54.             b = 0;
  55.                    C = 1;
  56.             D = 1;
  57.             MotorStep = 2;
  58.                         TIM=0;
  59.           }
  60.        break;

  61.        case 2:           //B
  62.          if(TIM)
  63.           {
  64.            
  65.                   A = 1;
  66.             b = 0;                  //0xf2
  67.             C = 1;
  68.             D = 1;
  69.            
  70.             MotorStep = 3;
  71.                         TIM=0;
  72.           }
  73.        break;


  74.        case 3:                //BC
  75.          if(TIM)
  76.           {        
  77.             A = 1;
  78.             b = 0;                    //0xf6
  79.             C = 0;
  80.             D = 1;
  81.             MotorStep = 4;
  82.                         TIM=0;
  83.           }
  84.        break;
  85.      case 4:                 //C
  86.          if(TIM)
  87.           {        
  88.             A = 1;
  89.             b = 1;                    //0xf4
  90.             C = 0;
  91.             D = 1;
  92.             MotorStep = 5;
  93.                         TIM=0;
  94.            }
  95.        break;
  96.         case 5:                          //CD
  97.          if(TIM)
  98.           {        
  99.             A = 1;
  100.             b = 1;                    //0xfc
  101.             C = 0;
  102.             D = 0;
  103.             MotorStep = 6;
  104.                         TIM=0;
  105.           }
  106.        break;
  107.         case 6:                          //D
  108.          if(TIM)
  109.           {        
  110.             A = 1;
  111.             b = 1;                    //0xf8
  112.             C = 1;
  113.             D = 0;
  114.             MotorStep = 7;
  115.                         TIM=0;
  116.           }
  117.        break;
  118.         case 7:                        //DA
  119.          if(TIM)
  120.           {        
  121.             A = 0;
  122.             b = 1;                    //0xf9
  123.             C = 1;
  124.             D = 0;
  125.             MotorStep = 0;
  126.                         TIM=0;
  127.           }
  128.        break;
  129.         
  130.         }

  131. }


  132. void system_Ini()
  133. {
  134.     TMOD|= 0x11;
  135.     TH0=0xDC; //11.0592M
  136.     TL0=0x00;        
  137.         IE = 0x8A;        
  138.     TR0  = 1;


  139. }

  140. main()
  141. { system_Ini();
  142.    InitMotor();
  143.     while(1)
  144.         {
  145.          SetMotor();

  146.          }



  147.   }

  148. /************************************************
  149. *                                                                                                *
  150. *              定时中断延时                                                    *
  151. ************************************************/
  152.   void Tzd(void) interrupt 1
  153. {
  154.    TH0 = 0xfe;    //11.0592
  155.          TL0 = 0x33;

  156.         if( CT++==speed)
  157.           {TIM=1;
  158.            CT=0;
  159.           }
  160. }
复制代码





回复

使用道具 举报

ID:887875 发表于 2021-3-3 09:04 | 显示全部楼层
首先你要理解四线两相步进电机控制原理哈。ABCD代表四线,一般AB为1相,CD为2相。分别按顺序置位A-AB-B-BC-C-CD-D-DA,一共八步骤位。这是背景。
然后看回代码第13行,ABCD分别对应P1端口的0~3bit,而4~7bit并没用。
再看代码39行整个SetMotor函数
步骤1置位A:  则是P1口:11110001,转为16进制就是0xF1
步骤2置位AB:则是P1口:11110011,转为16进制就是0xF3
步骤3置位B:  则是P1口:11110010,转为16进制就是0xF2
后面如此类推。


而TIM只是一个标志位,=1:可以控制电机执行下一个步骤位  =0:不允许执行
CT则是记录时间用的,>speed:可以置位TIM1,<speed:未可以置位TIM
也就是说,CT和speed控制了电机步骤位转移的频率,TIM决定电机在while循环里是否可以转到下一步骤位。
回复

使用道具 举报

ID:487569 发表于 2021-3-3 09:46 | 显示全部楼层
TIM是你自己定义的变量,就是用来计时的,每speed个中断TIM=1;电机就走一步 MotorStep步数+1,8步走完。 A-AB-B-BC-C-CD-D-DA 。一共ABCD,4根线,按照这个顺序,你程序写的第一步A就是只有A=0(低电平),BCD没写出来的就是1(高电平),此时P1=11111110=0xfe才对。 至于后面备注了0xf1则是因为,步进电机初始化为P1=0xF0,这个时候第一步就是A写1,即P1=11110001=0xf1。实际上后面的备注与你的程序并不符合
回复

使用道具 举报

ID:798631 发表于 2021-3-3 09:50 | 显示全部楼层
楼上解答的非常好,做单片机系统需要对被控对象很熟悉的,我一直认为单片机系统开发的重点在硬件  程序是处理事情的C语言具现     所以 还是  回过头来再补学 一些基础的好,重来一次手边有实物容易太多了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:213173 发表于 2021-3-3 11:20 | 显示全部楼层
A、B、C、D已被定义为P1口的低4位,只要按A-AB-B-BC-C-CD-D-DA顺序输出驱动信号即可。由于IO口与电机之间有驱动管反相放大,当P1口的低4位输出1110,经反相就成0001,原作者只是用16进制的方式注释表示电机端的电平状态。其高4位的实际状态是0或f不必过于纠结。其余7个注释同理不赘述。
回复

使用道具 举报

ID:451718 发表于 2021-3-3 12:03 | 显示全部楼层
步进电机驱动的问题。关于步进电机的驱动可以简单分为两类。
1,通过控制芯片驱动,这时,只用对驱动芯片发送脉冲信号(脉冲的快慢决定电机的运行速度,当然还要看你的细分),发送方向信号dir,发送使能信号en,控制芯片就会给步进电机功率驱动信号。 这个功率驱动信号的原型,就是你程序中的a,b,c,d对应的电平逻辑值。
2,通过单片机io口和放大电路驱动。 步进电机的驱动是需要节拍的, 你程序中switch(MotoStep)语句,就是在产生节拍, 然后通过定时器控制CT自加来控制产生节拍的速度。这种驱动方式是很早期的,现在基本上不用了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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