前言:
好久之前就想分享出来,现在有点晚了,不过还是想简单的分享一下,在学校里一次做创新项目的机会,让我认识了步进电机,当时老师让我们用PLC发出脉冲的方式让步进电机动起来,可是我刚拿到步进电机时以为会像小马达一样,给正负直流电源就会跑,但是当我看到步进电机有四根颜色不同的线的时候,我就犯难了:“哎~,它怎么有四根线,什么鬼?难道要给两个正极,两个负极电源才会转吗?”于是我就开始了······
哈哈,后来通过实验发现步进电机并没有转,显然没有我理解的那么简单!天真!!!
要用PLC发射脉冲才行,后来玩起了arduino,就想着能不能用这个小家伙来控制步进电机的转动呢?因为一个工业PLC太贵啦!反正都是脉冲驱动!
目的:
1、简单认识arduino如何产生脉冲
2、如何用arduino发射脉冲控制步进电机
一、简单认识arduino如何产生脉冲
脉冲信号:简单说其实就是一个高电平和一个低电平组成的
1个脉冲信号:就是一个高电平和一个低电
补充知识点:1个脉冲信号的时间(这里的时间,可以是你自己定,可以是1微妙,2毫秒,2秒......都无所谓这个根据需求来,但是条件是高低的持续时间一定要一样),就是1个周期!
用arduino程序表现出来就是这样的:
void loop()//主程序
{
digitalWrite(引脚,HIGH);//高电平
delay(1000);//高电平持续时间1000毫秒=1秒
digitalWrite(引脚,LOW);//低电平
delay(1000);//低电平持续时间1000毫秒=1秒
}
那么上面的程序的脉冲就是下面这样的!然后脉冲信号就会不断延续下去了!
这下就明白啦,arduino是如何产生脉冲的了吧!
当你知道该如何利用arduino来发射脉冲,那么你就已经可以掌握很多步进电机的控制方法了!(举一反三嘛!)
二、如何用arduino发射脉冲控制步进电机
arduino可以发出脉冲信号了,但是步进电机可不是那么简单的控制就结束了!!!
要想控制步进电机,没有步进电机驱动器是不行的!
下面就是我在用的TB6600升级版驱动器:
这里面涉及到细分、和电流选择的问题!
首先来看一下这个细分的部分,细分是指将一个步进电机的每个步进角度进一步细分为更小的角度。这可以通过驱动器发送更多的电脉冲来实现。大白话就是细分越多,精度越高!
我这里就直接选择的是1细分,200脉冲转1圈的设定了!
然后就是这个电流的选择了!根据42步进电机的电流1.5A
我这里选择了额定电流为:1.5A,峰值为:1.7A的设定了
细分是S1、S2、S3这三个按钮;电流是S4、S5、S6这三个按钮
根据上面的细分设定和电流设定,所以我的开关拨动就是这样的!
接线部分:
PUL:脉冲
DIR:方向
ENA:使能(按需求可接可不接,我没接)
驱动器共有共阳、共阴两种接线方法
我用的就是共阴极接法!
好了,脉冲也明白了,拨码也拨好了,线也接好了,那就开始编程吧!
void setup() //子程序
{
pinMode(4,OUTPUT);//设置引脚4为方向引脚
pinMode(7,OUTPUT);//设置引脚7为发射脉冲引脚
}
void loop() //主程序
{
/*设定转动方向(这个看你的接线了,
我的是按照电机提示的线的颜色接
的,所以HIGH是逆时针,LOW是顺时针)*/
digitalWrite(4, HIGH);
//发送脉冲信号
/*这里我用了一个for循环来让这个脉冲
重复执行200遍就是200个脉冲转一圈*/
for (int i = 0; i <= 200; i++)
{
digitalWrite(7, HIGH);
delayMicroseconds(300); //设置高电平脉冲持续时间300微妙(us)
digitalWrite(7, LOW);
delayMicroseconds(300); //设置低电平脉冲间隔时间为300微妙(us)
}
delay(1000);//停顿1秒,再继续上面的操作,如果你需要让它连续转动,就不需要这1秒了,删了就好
}
程序当中有一个函数:delayMicroseconds()
/*这个函数用来设置时间单位为:微秒(us)*/
赶快去试试吧!
我在调试的时候遇到了下面的问题(如果你也遇到了,希望对你有所帮助吧):
问题:电机有响声,但是不转,有点像发电报的声音
解决办法:高低电平的持续时间各加多一点,如果加的过多步进电机会转的很慢,这一点要注意,但是高低电平的时间要保持一致!细分越少,你的时间就要越大!(实在不行,你还要检查一下你的拨码是否拨对了,线有没有都接好等等!)
问题:arduino的控制精度问题
由于arduino板并非是工业级别,所以它的控制精度并不会像PLC那样精度很高,通过实验是可以得出结论的,例如按照上面的程序,我让它转4圈,那么程序的这里就要这样写:
for (int i = 0; i <= 800; i++)
{
digitalWrite(7, HIGH);
delayMicroseconds(300); //设置高电平脉冲持续时间300微妙(us)
digitalWrite(7, LOW);
delayMicroseconds(300); //设置低电平脉冲间隔时间为300微妙(us)
}
可以看到上面的程序里面的i<=800是我改动过的地方,这意味着200个脉冲1圈,那800个脉冲就是旋转4圈停一秒了,然后执行程序一段时间后(1分钟不到),你会发现,每四圈停一次的角度一开始还是好好的,哪里开始转就在哪里结束,然后重复执行这样的操作,但是过一会就会有所偏差了,而且偏差会越来越离谱,这就是arduino主控板的问题了!精度就没有那么高了。
原因:由于arduino主板内部的时钟频率的精度并不高,所以它所产生的脉冲精度也就不会高了,举个例子:我们用delay(1000)来延时1秒,但是在arduino里面,有时候就不是1秒,有可能是1.2秒,0.9秒,1.3秒......可想而知这种精度虽然人眼不容易看出来,但是会出现“失之毫厘,差之千里”的情况。再次回到程序上面(看下面)
delayMicroseconds(300);
这样的300微妙的程序设置,就更不精准了。
解决办法:如果你是再做运动控制方面的项目,就需要额外的传感器来辅助你的运动控制的精度了!又或者你可以采用额外的更高精度的时钟频率来辅助你的arduino来产生更高精度的脉冲
想要TB6600升级版驱动器的说明书的朋友可以扫下面这个二维码!