|
5黑幣
請(qǐng)教一下,我想51單片機(jī)利用步進(jìn)電機(jī)驅(qū)動(dòng)器DM422控制一個(gè)兩相四線步進(jìn)電機(jī)(42CM08),選擇的是共陽(yáng)極接法,24V電源。先要實(shí)現(xiàn)按一個(gè)按鍵,轉(zhuǎn)動(dòng)一個(gè)預(yù)設(shè)角度。程序中m=7,對(duì)應(yīng)數(shù)組里200個(gè)脈沖,在不細(xì)分時(shí)是轉(zhuǎn)360度,但是總是會(huì)有偏差幾度或者幾十度,請(qǐng)問(wèn)程序是哪出問(wèn)題了?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint num,turepluse,doubltruepl,m; //num為進(jìn)入中斷次數(shù),turepluse為脈沖數(shù),m為數(shù)組標(biāo)號(hào)
uint Angle[]={25,50,75,100,125,150,175,200}; //對(duì)應(yīng)45,90,135,180,225,270,315,360度 不細(xì)分,步距角為1.8度
//電機(jī)控制引腳
sbit PUL = P1^0; //脈沖
sbit ENA = P1^1; //使能
sbit DIR = P1^2; //方向
//sbit Foreward = P3^4; //正轉(zhuǎn)控制端
//sbit Backward = P3^5; //正轉(zhuǎn)控制端
sbit OneAngle = P3^6; //固定角度控制
bit DJ_status=0; //標(biāo)志位
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) //固定角度轉(zhuǎn)動(dòng)
{
turepluse=doubltruepl;
ENA=1; //驅(qū)動(dòng)器使能
TR0=1; //打開(kāi)定時(shí)器0
DJ_status=1; //進(jìn)入一次固定角度轉(zhuǎn)動(dòng),置1
num=0;
}
void main()
{
ENA=0;
PUL=1;
DIR=0;
Init_time(); //初始化定時(shí)器
m=7; //轉(zhuǎn)動(dòng)360度
while(1)
{
Key_scan();
}
}
void Init_time() //初始化定時(shí)器
{
TMOD |= 0x01;
TH0=(65536-800)/256; //給time0裝初值 800,這個(gè)800影響步進(jìn)電機(jī)的轉(zhuǎn)速,不知道影不影響脈沖數(shù)
TL0=(65536-800)%256;
EA=1; //打開(kāi)總中斷
TR0=1; //打開(kāi)定時(shí)器0
ET0=1;
}
void Enter_Timer0() interrupt 1 //進(jìn)入定時(shí)器中斷
{
TH0=(65536-800)/256;
TL0=(65536-800)%256;
PUL=~PUL; //取反,產(chǎn)生脈沖,2次中斷產(chǎn)生一個(gè)完整脈沖
num++; //中斷個(gè)數(shù) 實(shí)際脈沖(truepluse)*2=num
// if(num==50) { num=0; ENA=0; TR0=0; }//50/2=25個(gè)脈沖 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]);
}
}
|
|