本帖最后由 bluebanboom 于 2016-7-23 19:27 编辑
步进电机用的是28BYJ-48,电机驱动板芯片是ULN2003。如下图所示:
通过驱动板驱动步进电机很容易,顺时针旋转的时候以IN4-IN3-IN2-IN1的顺序依次高电平,其它引脚低电平。
逆时针旋转的时候以IN1-IN2-IN3-IN4顺序依次高电平,其它引脚低电平。
完成这个顺序,步进电机就会旋转一定角度,如果要持续旋转就持续执行这个顺序。
按照这样的思路,我们先定义好顺时针和逆时针的时序输出,如下所示:
这里我们用的是M1的11,13,15,16号引脚分别与驱动板的IN1,IN2,IN3,IN4连接。
驱动版的VCC连接M1的2号,VND连接M1的9号。
注意我们用的是5V电压,驱动板的VM要和它旁边的VCC用跳线帽短接。
这样,我们的线路就搭建完成了。
我们来讲解一下顺时针旋转的函数。
主要是两个循环,外层的循环是完成转多少step,既然叫做步进电机(Step Monitor),那么这个“step(步)”就是电机最小的旋转角度。具体多少我们就不关心了。总之,很小的。跟人一步一步走路一样,假设我们走来迈一步的距离是固定的比如是1米,那么要走10米,就需要走十步。如果要走0.5米,那么我们办不到。
内层循环就是让步进电机迈出一步去,也就是完成一次IN4-IN3-IN2-IN1的输出。这个内循环在逆时针旋转的函数中是完成IN1-IN2-IN3-IN4的输出。
然后再来看一下write_pins函数。
又是一个循环,这个循环是依次向M1的引脚输出,也就是输出Clockwise和Anticlockwise中定义好的引脚输出值。
usleep是给电机一个响应时间,否则太快的话电机还没来得及响应,导致电机无法转动。同样的在run_clockwise中也有一个usleep,也是为了给电机一点响应时间,这个时间还可以作为电机的速度控制,比如想电机转的慢一点,这个值可以大一些,想要快一点,这个值可以小一些。
但是不能太小,也不能太大,太小的话容易导致电机无法响应,太大电机就转的太慢了。大家可以设置一下值体验一下。usleep的参数是微秒,所以1000表示等待1毫秒。
main函数中的流程是先初始化gpio,然后设置各个引脚的模式。
接着顺时针旋转200,释放线圈,然后等待,然后逆时针旋转200,OK结束。
释放线圈是为了让步进电机的线圈不导通,因为步进电机在不旋转的时候也是需要通电保持位置,释放线圈可以省电,但同时电机也无法保持位置了。
另外,我还写了一个Go语言版本的驱动。由于多数人还是对C熟悉,这里就不多说Go版本了。
但是在Go版本里实现了速度控制,也就是之前提到的usleep。
附上全部代码。
C语言版本用如下命令编译执行:
gcc stepper.c gpio.c -std=gnu99 -o stepper
sudo ./stepper
Go语言版本用如下命令执行:
sudo go run stepper.go
本帖最后由 bluebanboom 于 2016-7-23 19:27 编辑
步进电机用的是28BYJ-48,电机驱动板芯片是ULN2003。如下图所示:
通过驱动板驱动步进电机很容易,顺时针旋转的时候以IN4-IN3-IN2-IN1的顺序依次高电平,其它引脚低电平。
逆时针旋转的时候以IN1-IN2-IN3-IN4顺序依次高电平,其它引脚低电平。
完成这个顺序,步进电机就会旋转一定角度,如果要持续旋转就持续执行这个顺序。
按照这样的思路,我们先定义好顺时针和逆时针的时序输出,如下所示:
这里我们用的是M1的11,13,15,16号引脚分别与驱动板的IN1,IN2,IN3,IN4连接。
驱动版的VCC连接M1的2号,VND连接M1的9号。
注意我们用的是5V电压,驱动板的VM要和它旁边的VCC用跳线帽短接。
这样,我们的线路就搭建完成了。
我们来讲解一下顺时针旋转的函数。
主要是两个循环,外层的循环是完成转多少step,既然叫做步进电机(Step Monitor),那么这个“step(步)”就是电机最小的旋转角度。具体多少我们就不关心了。总之,很小的。跟人一步一步走路一样,假设我们走来迈一步的距离是固定的比如是1米,那么要走10米,就需要走十步。如果要走0.5米,那么我们办不到。
内层循环就是让步进电机迈出一步去,也就是完成一次IN4-IN3-IN2-IN1的输出。这个内循环在逆时针旋转的函数中是完成IN1-IN2-IN3-IN4的输出。
然后再来看一下write_pins函数。
又是一个循环,这个循环是依次向M1的引脚输出,也就是输出Clockwise和Anticlockwise中定义好的引脚输出值。
usleep是给电机一个响应时间,否则太快的话电机还没来得及响应,导致电机无法转动。同样的在run_clockwise中也有一个usleep,也是为了给电机一点响应时间,这个时间还可以作为电机的速度控制,比如想电机转的慢一点,这个值可以大一些,想要快一点,这个值可以小一些。
但是不能太小,也不能太大,太小的话容易导致电机无法响应,太大电机就转的太慢了。大家可以设置一下值体验一下。usleep的参数是微秒,所以1000表示等待1毫秒。
main函数中的流程是先初始化gpio,然后设置各个引脚的模式。
接着顺时针旋转200,释放线圈,然后等待,然后逆时针旋转200,OK结束。
释放线圈是为了让步进电机的线圈不导通,因为步进电机在不旋转的时候也是需要通电保持位置,释放线圈可以省电,但同时电机也无法保持位置了。
另外,我还写了一个Go语言版本的驱动。由于多数人还是对C熟悉,这里就不多说Go版本了。
但是在Go版本里实现了速度控制,也就是之前提到的usleep。
附上全部代码。
C语言版本用如下命令编译执行:
gcc stepper.c gpio.c -std=gnu99 -o stepper
sudo ./stepper
Go语言版本用如下命令执行:
sudo go run stepper.go