最近學習步進電機的驅動原理,照著教材自己實踐了一下用ULN2003驅動28BYJ-48兩相5線步進電機,可以正常轉動。手頭有一個舊光碟機,拆開發現裡面有三個電機,其中有一個控制雷射頭尋跡的兩相四線步進電機,我就用51的單片機讓它也轉起來。一開始照葫蘆畫瓢用ULN2003驅動,結果發現無論如何也不行。原來ULN2003基本沒輸出電流,只能驅動有公共端的兩相五線、兩相六線步進電機,不能驅動2相4線步進電機。然後改用L293D驅動,可以轉動。
通過按鈕控制正反轉時發現,按鍵釋放後,電機迅速發熱,燙手。用萬用表測量,發現電機A,A-或B,B-直接存在電位差!應該是按鍵釋放時,IN1-IN4沒有歸零。找到問題,就容易解決了。修改程序,可以完美運行,鍵1按下正轉,釋放停下,鍵2按下反轉,釋放停下。IN1-IN4分別接P1口的低四位。工作方式選用8拍。
附上源程序,僅供參考。
#include
#define uint unsigned int
#define uchar unsigned char
sbit K3=P2^5;
sbit K4=P2^4;
//k3正轉。k4反轉。釋放停止
uchar code step_table[]={0x8,0xa,0x2,0x6,0x4,0x5,0x1,0x9};
void delay(unsigned int m)
{
unsigned int i,j;
for(i=m;i>0;i--)
for(j=110;j>0;j--);
}
void xp()//x軸正轉
{
while(!K3)
{
uint i;
for(i=0;i<8;i++)
{
P1=step_table[ i];
delay(10);
}
}
P1=0;//按鍵釋放時,反轉P1停在table某處,導致電機有電壓從而使電機發熱,需要歸零。
}
void xn()//x軸反轉
{
uint i;
while(!K4)
{
for(i=8;i>0;i--)
{
P1=step_table[ i];
delay(10);
}
}
P1=0;//按鍵釋放時,反轉P1停在table某處,導致電機有電壓從而使電機發熱,需要歸零。
}
void main()
{
while(1)
{
if(K3==0)
{
delay(20);
if(K3==0)
{
// LED1=0;
xp();
}
}
if(K4==0)
{
delay(20);
if(K4==0)
{
// LED1=0;
xn();
}
}
}
}
為了方便大家更好的學習,您還可以關注暢學電子和EDA的公眾號,每天推送相關知識,希望能對你的學習有所幫助!