今天练习了一下步进电机,看过资料后开始进行编程测试,编程后能顺利让电机转动起来,并且数度可调,但是当我想让电机只转一圈时问题来了。
这款步进电机的减速比为1:64,步进角为5.625/64度。那么要转一圈需要的脉冲多少呢,我自己算了算。
一个脉冲转5.625/64=0.087890625度,所以要转360度需要的脉冲数为360/(5.625/64)=4096个,由于电机为8拍所以对于8拍的循环要执行4096/8=512次,这样电机能转一圈停下。
在编程过程中我把两个变量全设置成了char型(把大部分数据设置成char这是我的一个习惯,个人认为不好),写好程序以后进行下载运行结果电机就转了一点,这与目的不符。首先我想到的是参数错误,网上搜一下的确对于转一圈的脉冲个数有的人说4096,有的说64,挨着试了一下发现都不对,这下迷茫了就开始试着换参数,换成300转了一点,换了200转了大半圈,300不行200差不多这不应该,就在这时我想起了前几天编写DS18B20温度传感器时对于数据类型运用时犯下的错误于是果断把char改成了int,编译下载后运行结果与预期相符转了一圈听了下来。
调试成功后我开始想为什么刚开始500不行,查阅书籍后发现有符号字符型变量取值范围为-128到+127无符号的范围为0到255.这也就是300不转200转了大半圈的原因。经过这次练习后发现还是自己的基础知识不牢固有些甚至不理解,这对以后的发展危害极大。下定决心一定要把那些最基础的东西学好,这样才能更上一城楼。
#include <reg51.h> //51芯片管脚定义头文件
#define uchar unsigned char
#define uint unsigned int
uchar i,j;
//uint j;
uchar code FFW[8]={0x01,0x03,0x02,0x06,
0x04,0x0c,0x08,0x09}; //四相八拍正转编码
uchar code REV[8]={0x09,0x08,0x0c,0x04,
0x06,0x02,0x03,0x01}; 四相八拍反转编码
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
for(j=200;j>0;j--)
{
for(i=0;i<8;i++)
{
P1=FFW[i];
delay(10);
}
}
while(1);
}