标题:
单片机+TB6600+42步进电机测试通过 附程序
[打印本页]
作者:
xmfjfhcel
时间:
2020-2-23 16:01
标题:
单片机+TB6600+42步进电机测试通过 附程序
经过年前到年后几个月,终于搞清我这个步进电机的性能。感谢CCC888在24小时必答区解答了我的问题,也把这个程序分享给大家。
附件程序测试连接42步进电机运行正常通过。
发现电机对时间要求很高,如果主程序里的WHILE(1)里如果执行程序如果占用太多过长,会38影响步进电机的运行,还是新手没办法对时间进行很好的把控啊。
程序说明:
特色:程序是电机自动正反转120度(回到初始的地方)
主程序while(1)只是扫描一个按键,这个时间很快。对步进电机运行没有问题。
本想加一个TM1638模块,用它的按键,但是发现加了后电机工作会有失步的情况。为哈这个电机这么娇气啊??
http://www.51hei.com/bbs/dpj-180026-1.html
附件程序是对步进电机用了1细分, 细分多了,满足不了我的需求,转速会慢,STC52的端口输出频率太低了。
程序是电机自动正反转120度(回到初始的地方), 我最开始的想法是做一个自动手摇扇子,就是大炮打蚊子了,比较符合了。期间不能快递没办法做成品了。
中断里的时间是调试过无数次,有个简单的加速减速的过程,只是时间有点短,有胜于无吧,中断里用了DELAY函数来对电机在反转时进行一个延时短停来保护一下电机的冲击,这个时间远远少于进入中断的时间,所以也不会影响步进电机的脉冲产生时间得。
作者:
xmfjfhcel
时间:
2020-2-23 16:05
标题:
TB6600+42步进电机测试通过
42motorTB6600FB120自动正反可用单片机源程序如下:
#include<reg52.h>
//电机控制引脚
sbit CLK = P1^0; //PUL-
sbit ENA = P1^1; //ENA-
sbit DIR = P1^2; //DIR-
//按键控制端
sbit speedup = P3^2; //调速+
sbit speeddown = P3^0; //调速-
sbit StopStart = P3^1; //停止与启动
unsigned int count=0;
unsigned int Tspeed[5]={250,500,1000,2500,3000};
//调速等级表,5个档位。1细分, 200脉冲一圈。 一个脉冲是1.8度。
//计算:
//4000,8ms一个脉冲(高电平4MS,低电平4MS,共是8MS)。 200个脉冲就是:1.6秒, 即1.6秒步进电机走一圈。37.5圈/分
//4000 起步会失步在1细分的情况下。
//3000 6ms 1.2 50圈/分
//2000, 4ms一个脉冲(高电平2MS,低电平2MS,共是4MS)。 200个脉冲就是:0.8秒, 即0.8秒步进电机走一圈。75圈/分
//1000,就是0.4秒/圈, 150圈/分。
//500 0.2秒/圈, 300圈/分
//250 0.1秒/圈 600圈/分。 500US一个脉冲。1S就是2000个脉冲,IO输出就是2MHZ.在STC89C52的范围内。
//再细分下去,超出C52的范围。
//我这步进最佳最快有效是600转/分。最快1000圈/分
bit Run_Status=1; //默认是电机启动状态
unsigned int SPEED=0; //脉冲频率初始6ms
unsigned int counttemp=0; //暂存停止前的COUNT计数
void Init_time();
void Key_scan();
void delay(unsigned int hehe); //延时hehe毫秒
void main()
{
CLK=0;
ENA=1; //ENA-接的控制口,但一样的,如果ENA=0,步进电机卡起
DIR=1; //DIR-接的控制口。初始化电机 低电平有效,测试,DIR=1,是正转, DIR=0反转。
SPEED=Tspeed[4];
P2=0X00;
delay(2000); //延时2秒等待系统稳定。
P2=0XFF;
Init_time(); //初始化定时器
while(1)
{
Key_scan();
}
}
void Init_time() //初始化定时器
{
TMOD |= 0x01;
TH0=(65536-SPEED)/256; //给time0装初值
TL0=(65536-SPEED)%256;
IE = 0x82;
TR0=0; //开启中断产生脉冲信号
EA=0;
}
void Enter_Timer0() interrupt 1 //进入定时器中断
{
TH0=(65536-SPEED)/256;
TL0=(65536-SPEED)%256;
CLK=~CLK; //发送脉冲……
count++;
if(count<100)
SPEED=3000; //如果调到2000失控 1细分
if(count<200)
SPEED=2000;
else
SPEED=3000;
if(count==300) //计数2次为一个脉冲周期 所以180度为计数200.如果计数100只有90度
{
DIR=~DIR;
count=0;
CLK=0;
TR0=0; //开启中断产生脉冲信号
EA=0;
delay(300);
CLK=0;
TR0=1;
EA=1;
}
}
void delay(unsigned int n) //delay几个毫秒,入口参数为几个毫秒
//正反转切换时速度太快了。延时保护电机
{
unsigned int i,y;
for(i=n;i>0;i--)
for(y=114;y>0;y--);
}
void Key_scan()
{
if(StopStart==0)
{
delay(10);
if(StopStart==0)
{
Run_Status=~Run_Status;
if(Run_Status)
{
count=counttemp;
TR0=1; //开启中断产生脉冲信号
EA=1;
}
else
{
counttemp=count;
TR0=0; //关闭中断停止脉冲信号
EA=0;
}
} while(!StopStart);
}
}
/**********************************
static char i=0;
static char j=4;
if(speedup==0) //加速
{
delay(10);
if(speedup==0)
{
j--;
if(j<1)
j=0;
SPEED=Tspeed[j];
}
} while(!speedup);
if(speeddown==0) //减速
{
delay(10);
if(speeddown==0)
{
i++;
if(i>4)
i=4;
SPEED=Tspeed[i];
}
} while(!speeddown);
}
*************************************/
复制代码
作者:
xmfjfhcel
时间:
2020-2-23 19:05
是270度哈,中断初始化是没有开的,按一下键就开啦
作者:
xmfjfhcel
时间:
2020-2-23 19:07
这些都可以自行改得。。
作者:
WOAIDIANZIXINXI
时间:
2020-4-21 10:56
请问用32单片机控制TB6600驱动42步进电机转动与停止 ,如果按下一个确认按键,电机转动,还要用定时器或外部中断不
作者:
恒心6
时间:
2021-9-21 22:32
为什么我的会抖动,我是初学者,能教一下吗
作者:
山顶任风吹
时间:
2022-2-15 14:43
为什么定时器初始化中的TH0和TL0中的speed直接用数字带入,电机的转速要快的多?若将键盘扫描中的delay全部取消,速度依然为什么?
作者:
13480828805
时间:
2022-5-31 15:50
简单看了一下,下载下来学习研究,
作者:
1905527329
时间:
2022-6-30 14:08
附程序下载到普中A2开发板电机不转,不知什么原因
作者:
heicad
时间:
2022-7-6 16:27
楼上的 最好不要在开发板上做,io连了其他设备可能驱动能力不够 自己焊接一个最小系统个就好了,再就是楼主设置了1细分 这个你也要在模块上设置一下
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1