本帖最后由 ereerr 于 2021-5-30 00:44 編輯
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=0Angle[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]);
}
}
|