请教一下,我想51单片机利用步进电机驱动器DM422控制一个两相四线步进电机(42CM08),选择的是共阳极接法,24V电源。先要实现按一个按键,转动一个预设角度。程序中m=7,对应数组里200个脉冲,在不细分时是转360度,但是总是会有偏差几度或者几十度,请问程序是哪出问题了?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint num,turepluse,doubltruepl,m; //num为进入中断次数,turepluse为脉冲数,m为数组标号
uint Angle[]={25,50,75,100,125,150,175,200}; //对应45,90,135,180,225,270,315,360度 不细分,步距角为1.8度
//电机控制引脚
sbit PUL = P1^0; //脉冲
sbit ENA = P1^1; //使能
sbit DIR = P1^2; //方向
//sbit Foreward = P3^4; //正转控制端
//sbit Backward = P3^5; //正转控制端
sbit OneAngle = P3^6; //固定角度控制
bit DJ_status=0; //标志位
void Init_time();
void Key_scan();
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void OneStep(uint doubltruepl) //固定角度转动
{
turepluse=doubltruepl;
ENA=1; //驱动器使能
TR0=1; //打开定时器0
DJ_status=1; //进入一次固定角度转动,置1
num=0;
}
void main()
{
ENA=0;
PUL=1;
DIR=0;
Init_time(); //初始化定时器
m=7; //转动360度
while(1)
{
Key_scan();
}
}
void Init_time() //初始化定时器
{
TMOD |= 0x01;
TH0=(65536-800)/256; //给time0装初值 800,这个800影响步进电机的转速,不知道影不影响脉冲数
TL0=(65536-800)%256;
EA=1; //打开总中断
TR0=1; //打开定时器0
ET0=1;
}
void Enter_Timer0() interrupt 1 //进入定时器中断
{
TH0=(65536-800)/256;
TL0=(65536-800)%256;
PUL=~PUL; //取反,产生脉冲,2次中断产生一个完整脉冲
num++; //中断个数 实际脉冲(truepluse)*2=num
// if(num==50) { num=0; ENA=0; TR0=0; }//50/2=25个脉冲 45度
if(num==(2*turepluse)&&DJ_status) //若m=0,Angle[m])=25=turepluse=1/2num
{
num=0;
TR0=0;
ENA=0;
}
}
void Key_scan()
{
if(OneAngle==0) //固定角度键按下
{
delay(10);
if(OneAngle==0)
{
while(!OneAngle);
OneStep(Angle[m]);
}
}
|