分享我的學習筆記和例程:
/*學習筆記:
(1)正反轉一般用的是高精度的“四相單雙八拍”工作方式,即A-AB-B-BC-C-CD-D-DA,每個脈沖電機轉動的角度叫步距角。
我使用的步進電機,參數如圖所示,步距角5.625度,但是減速電機,減速比為64,即,每個脈沖,電機外軸實際轉動角度為步距角的64分之一。
(2)表格數據的得來: A B C D
1 0 0 0 (0xf8)
1 1 0 0 (0xfc)
0 1 0 0 (0xf4)
0 1 1 0 (0xf6)
0 0 1 0 (0xf2)
0 0 1 1 (0xf3)
0 0 0 1 (0xf1)
1 0 0 1 (0xf9)
此ABCD對應電機驅動板(達林頓管IC芯片ULN2003A)中的輸入端IN1~IN4,它又對應著單片機
IO口,本實例對應的是P2口的低四位;若想換IO口或位,此數據要調整。
(3)步進電機轉動不能太快,是因為:
保持轉矩————步進電機通電但沒有轉動時,定子鎖住轉子的力矩。
它是步進電機最重要的參數之一,
通常步進電機在低速時的力矩接近保持轉矩。由于步進電機的輸出力矩隨速度的增大而不斷
衰減,輸出功率也隨速度的增大而變化,所以保持轉矩就成了衡量步進電機最重要參數之一。
按自購步進電機的參數,則知:最好最小延時為0.002s,即本程序中i=285,可保持轉矩。
(4)自購步進電機的步距角為5.625度,減速比為1:64。可見,要讓眼睛看到的軸轉180度,則
提供的脈沖次數為n=180*64/5.625=2048=256*8個。但有誤差,轉動持續一段時間,就會有
失調角。
(5)由于想顯示轉動的角度,而顯示程序要用時間,所以本程序有些不對,現在還沒有好辦法讓
電機轉動更快些。另:k5、k6讓電機轉動特定角度程序,還有點問題,按下后,再按,要重
新計算初值。可以用變量控制,但太繁瑣,暫時沒管它,只要按下后等待轉停就好
(6)程序功能:開機時,步進電機按正常速度(中速)正向轉動,最多轉動5圈;
按獨立鍵k1:正向快轉;
按獨立鍵k2:反向快轉;
按獨立鍵k3:每按一次,減速一次,從最快到最慢需按四次,以后按鍵無效;
按獨立鍵k4:每按一次,加速一次,從最慢到最快需按四次,以后按鍵無效;
按獨立鍵k5:中速正向轉動90度;
按獨立鍵k6:中速反向轉動180度;
*/
#include <reg51.h>
#define Rotation P2 //定義電機轉動相數據的輸入控制口,本例是P2口的低四位。
unsigned char code F_Rotation[8]={0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1,0xf9};//正轉(逆時針)表格
unsigned char code B_Rotation[8]={0xf9,0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8};//反轉(順時針)表格
sbit k1=P3^7; //以下六個為獨立鍵盤
sbit k2=P3^6;
sbit k3=P3^5;
sbit k4=P3^4;
sbit k5=P3^3;
sbit k6=P3^2;
unsigned int Time;
unsigned int jd;
bit k=0;
void Delay10ms(unsigned int c)//10ms延時程序
{
unsigned char a,b;
for(c;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void Delay(unsigned int i)//延時7us
{
while (--i);
}
void Motor() //電機旋轉子函數
{
unsigned char i;
for(i=0;(i<8);i++)
{
if (jd==0)
{
Rotation=0xf0;
break;
}
if (k==0)
{
Rotation=(F_Rotation);
}
else
{
Rotation=(B_Rotation);
}
Delay(Time);
jd--;
}
}
void main()
{
unsigned char m; //松鍵時消抖用變量
m=0;
Time=250;
jd=20480;
while(1) //總循環
{
if(k1==0) //掃描法判斷獨立按鍵k1是否按下
{
Delay10ms(1); //消抖
if(k1==0) //再次判斷k1是否按下
{
Time=150;
k=0;
jd=20480;
while((m<50)&&(k1==0))
{
Delay10ms(1);
m++;
}
m=0;
}
}
if(k2==0) //掃描獨立鍵盤k2
{
Delay10ms(1);
if(k2==0)
{
Time=150;
k=1;
jd=20480;
while((m<50)&&(k2==0))
{
Delay10ms(1);
m++;
}
m=0;
}
}
if(k3==0) //掃描獨立鍵盤k3
{
Delay10ms(1);
if(k3==0)
{
Time=Time+100;
if (Time>500)
{
Time=500;
}
jd=20480;
while((m<50)&&(k3==0))
{
Delay10ms(1);
m++;
}
m=0;
}
}
if(k4==0) //掃描獨立鍵盤k4
{
Delay10ms(1);
if(k4==0)
{
Time=Time-100;
if (Time<150)
{
Time=150;
}
jd=20480;
while((m<50)&&(k4==0))
{
Delay10ms(1);
m++;
}
m=0;
}
}
if(k5==0) //掃描獨立鍵盤k5
{
Delay10ms(1);
if(k5==0)
{
Time=250;
k=0;
jd=1024; //只轉90度
while((m<50)&&(k5==0))
{
Delay10ms(1);
m++;
}
m=0;
}
}
if(k6==0)
{
Delay10ms(1);
if(k6==0)
{
Time=250;
k=1;
jd=2048;
while((m<50)&&(k6==0))
{
Delay10ms(1);
m++;
}
m=0;
}
}
Motor();//調用電機轉動子程序
}
}
另外,本例程是我本人在學習單片機初期的成果,沒有用定時器來控制轉速,你可以自己修改。
我的學習心得可是好東西哦。呵呵
|