找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6696|回复: 9
收起左侧

单片机+TB6600+42步进电机测试通过 附程序

  [复制链接]
ID:626079 发表于 2020-2-23 16:01 | 显示全部楼层 |阅读模式
     经过年前到年后几个月,终于搞清我这个步进电机的性能。感谢CCC888在24小时必答区解答了我的问题,也把这个程序分享给大家。
附件程序测试连接42步进电机运行正常通过。
    发现电机对时间要求很高,如果主程序里的WHILE(1)里如果执行程序如果占用太多过长,会38影响步进电机的运行,还是新手没办法对时间进行很好的把控啊。

程序说明:
特色:程序是电机自动正反转120度(回到初始的地方)

主程序while(1)只是扫描一个按键,这个时间很快。对步进电机运行没有问题。
本想加一个TM1638模块,用它的按键,但是发现加了后电机工作会有失步的情况。为哈这个电机这么娇气啊??
http://www.51hei.com/bbs/dpj-180026-1.html

附件程序是对步进电机用了1细分, 细分多了,满足不了我的需求,转速会慢,STC52的端口输出频率太低了。
程序是电机自动正反转120度(回到初始的地方), 我最开始的想法是做一个自动手摇扇子,就是大炮打蚊子了,比较符合了。期间不能快递没办法做成品了。
中断里的时间是调试过无数次,有个简单的加速减速的过程,只是时间有点短,有胜于无吧,中断里用了DELAY函数来对电机在反转时进行一个延时短停来保护一下电机的冲击,这个时间远远少于进入中断的时间,所以也不会影响步进电机的脉冲产生时间得。

回复

使用道具 举报

ID:626079 发表于 2020-2-23 16:05 | 显示全部楼层

TB6600+42步进电机测试通过

42motorTB6600FB120自动正反可用单片机源程序如下:
  1. #include<reg52.h>

  2. //电机控制引脚
  3. sbit CLK  = P1^0;          //PUL-
  4. sbit ENA  = P1^1;           //ENA-
  5. sbit DIR  = P1^2;          //DIR-
  6.                   
  7. //按键控制端
  8. sbit speedup = P3^2;         //调速+
  9. sbit speeddown = P3^0;         //调速-
  10. sbit StopStart  = P3^1;           //停止与启动
  11. unsigned int count=0;
  12. unsigned int Tspeed[5]={250,500,1000,2500,3000};               
  13. //调速等级表,5个档位。1细分, 200脉冲一圈。         一个脉冲是1.8度。
  14. //计算:
  15. //4000,8ms一个脉冲(高电平4MS,低电平4MS,共是8MS)。 200个脉冲就是:1.6秒, 即1.6秒步进电机走一圈。37.5圈/分
  16. //4000 起步会失步在1细分的情况下。
  17. //3000        6ms                                                                                                                        1.2                                                          50圈/分
  18. //2000, 4ms一个脉冲(高电平2MS,低电平2MS,共是4MS)。 200个脉冲就是:0.8秒, 即0.8秒步进电机走一圈。75圈/分
  19. //1000,就是0.4秒/圈, 150圈/分。
  20. //500       0.2秒/圈,  300圈/分
  21. //250       0.1秒/圈   600圈/分。  500US一个脉冲。1S就是2000个脉冲,IO输出就是2MHZ.在STC89C52的范围内。
  22. //再细分下去,超出C52的范围。

  23. //我这步进最佳最快有效是600转/分。最快1000圈/分

  24. bit Run_Status=1;                                                   //默认是电机启动状态
  25. unsigned int SPEED=0;                                   //脉冲频率初始6ms
  26. unsigned int counttemp=0;                                   //暂存停止前的COUNT计数


  27. void Init_time();
  28. void Key_scan();
  29. void delay(unsigned int hehe);                           //延时hehe毫秒                          

  30. void main()
  31. {
  32.         CLK=0;
  33.         ENA=1;                                 //ENA-接的控制口,但一样的,如果ENA=0,步进电机卡起
  34.         DIR=1;                                 //DIR-接的控制口。初始化电机        低电平有效,测试,DIR=1,是正转, DIR=0反转。
  35.         SPEED=Tspeed[4];
  36.         P2=0X00;
  37.         delay(2000);                            //延时2秒等待系统稳定。
  38.         P2=0XFF;
  39.        
  40.         Init_time();                 //初始化定时器       
  41.        
  42.         while(1)
  43.         {
  44.                 Key_scan();
  45.          
  46.          }       
  47. }
  48. void Init_time()                                 //初始化定时器
  49. {
  50.         TMOD |= 0x01;
  51.         TH0=(65536-SPEED)/256;                  //给time0装初值
  52.         TL0=(65536-SPEED)%256;
  53.     IE = 0x82;
  54.         TR0=0;                       //开启中断产生脉冲信号
  55.         EA=0;

  56. }
  57. void Enter_Timer0() interrupt 1         //进入定时器中断
  58. {

  59.         TH0=(65536-SPEED)/256;
  60.         TL0=(65536-SPEED)%256;
  61.         CLK=~CLK;                                          //发送脉冲……
  62.         count++;
  63.         if(count<100)
  64.         SPEED=3000;                                          //如果调到2000失控   1细分
  65.         if(count<200)
  66.         SPEED=2000;
  67.         else                              
  68.         SPEED=3000;
  69.         if(count==300)        //计数2次为一个脉冲周期          所以180度为计数200.如果计数100只有90度
  70.                         {
  71.                                
  72.                                 DIR=~DIR;
  73.                                 count=0;
  74.                                 CLK=0;
  75.                                 TR0=0;                       //开启中断产生脉冲信号
  76.                                 EA=0;
  77.                                 delay(300);
  78.                                 CLK=0;
  79.                                 TR0=1;
  80.                                 EA=1;


  81.                         }       

  82. }

  83. void delay(unsigned int n)                           //delay几个毫秒,入口参数为几个毫秒
  84.                                                                           //正反转切换时速度太快了。延时保护电机
  85. {
  86. unsigned int i,y;

  87. for(i=n;i>0;i--)

  88. for(y=114;y>0;y--);                                  
  89. }


  90. void Key_scan()                                             
  91. {
  92.         if(StopStart==0)
  93.         {
  94.                 delay(10);
  95.                 if(StopStart==0)
  96.                 {
  97.                        
  98.                         Run_Status=~Run_Status;
  99.                         if(Run_Status)
  100.                         {
  101.                                 count=counttemp;
  102.                                 TR0=1;                       //开启中断产生脉冲信号
  103.                     EA=1;
  104.                                
  105.                         }
  106.                         else
  107.                         {
  108.                                 counttemp=count;
  109.                                     TR0=0;                       //关闭中断停止脉冲信号
  110.                       EA=0;
  111.                         }
  112.                 } while(!StopStart);
  113.         }
  114. }
  115. /**********************************
  116.         static char i=0;
  117.         static char j=4;

  118.         if(speedup==0)                                   //加速
  119.         {
  120.                 delay(10);                       
  121.                 if(speedup==0)
  122.             {
  123.                
  124.                         j--;
  125.                         if(j<1)
  126.                         j=0;
  127.                         SPEED=Tspeed[j];               
  128.                 }
  129.         }          while(!speedup);
  130.         if(speeddown==0)                                   //减速
  131.         {
  132.                 delay(10);
  133.                 if(speeddown==0)
  134.                 {
  135.                        
  136.                         i++;
  137.                         if(i>4)
  138.                         i=4;
  139.                         SPEED=Tspeed[i];
  140.                 }
  141.         } while(!speeddown);


  142. }
  143.    *************************************/       
复制代码

评分

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

查看全部评分

回复

使用道具 举报

ID:626079 发表于 2020-2-23 19:05 来自手机 | 显示全部楼层
是270度哈,中断初始化是没有开的,按一下键就开啦
回复

使用道具 举报

ID:626079 发表于 2020-2-23 19:07 来自手机 | 显示全部楼层
这些都可以自行改得。。
回复

使用道具 举报

ID:712831 发表于 2020-4-21 10:56 | 显示全部楼层
请问用32单片机控制TB6600驱动42步进电机转动与停止 ,如果按下一个确认按键,电机转动,还要用定时器或外部中断不
回复

使用道具 举报

ID:917021 发表于 2021-9-21 22:32 | 显示全部楼层
为什么我的会抖动,我是初学者,能教一下吗
回复

使用道具 举报

ID:1005267 发表于 2022-2-15 14:43 | 显示全部楼层
为什么定时器初始化中的TH0和TL0中的speed直接用数字带入,电机的转速要快的多?若将键盘扫描中的delay全部取消,速度依然为什么?
回复

使用道具 举报

ID:324780 发表于 2022-5-31 15:50 | 显示全部楼层
简单看了一下,下载下来学习研究,
回复

使用道具 举报

ID:1037586 发表于 2022-6-30 14:08 | 显示全部楼层
附程序下载到普中A2开发板电机不转,不知什么原因
回复

使用道具 举报

ID:262 发表于 2022-7-6 16:27 | 显示全部楼层
楼上的 最好不要在开发板上做,io连了其他设备可能驱动能力不够 自己焊接一个最小系统个就好了,再就是楼主设置了1细分  这个你也要在模块上设置一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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