導航:首頁 > 操作系統 > 單片機驅動馬達

單片機驅動馬達

發布時間:2022-06-20 22:38:16

❶ 怎樣用單片機驅動手機里的馬達驅動電路

兄弟,你p2.0和pnp之間加限流電阻了嗎?不加限流沒燒單片機,你撿了個大便宜。
我告訴你應該怎麼接:p2.0串聯1k的限流電阻接在pnp的b,同時在b上加10k上拉電阻。pnp的e接電源,c接npn的b,npn的c接電機,e接地。電機另一邊接電源。
你的電路還有一個可能就是電機接錯了,用npn管子的時候記住一定把負載放在c上,不能放在e,這點和pnp的管子正好是相反的,也就是說電機放在電源的那一邊而不是地的那一邊。
哦,補充一點,在npn的c和e之間反向並連一個1n4007二極體,用來保護npn.

❷ 如何用單片機控制直流電機

通過與單片機相連的按鍵控制直流電機停啟的電路如下圖所示,通過P3.6口按鍵觸發啟動直流電機,P3.7口的按鍵觸發停止直流電機的運行。由圖可知,當P1.0輸出高電平「1」時,NPN型三極體導通,直流電機得電轉動;當P1.0輸出低電平「0」時,NPN型三極體截止,直流電機停止轉動。

(2)單片機驅動馬達擴展閱讀:

通過單片機產生PWM波控制直流電機程序

#include "reg52.h"


#define uchar unsigned char


#define uint unsigned int


uchar code table[10]={0x3f,0x06,0x5b,


0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰數碼管顯示碼(0-9)


sbit xiaoshudian=P0^7;


sbit wei1=P2^4; //數碼管位選定義


sbit wei2=P2^5;


sbit wei3=P2^6;


sbit wei4=P2^7;


sbit beep=P2^3; //蜂鳴器控制端


sbit motor = P1^0; //電機控制


sbit s1_jiasu = P1^4; //加速按鍵


sbit s2_jiansu= P1^5; //減速按鍵


sbit s3_jiting=P1^6; //停止/開始按鍵


uint pulse_count; //INT0接收到的脈沖數


uint num=0; //num相當於占空比調節的精度


uchar speed[3]; //四位速度值存儲


float bianhuasu; //當前速度(理論計算值)


float reallyspeed; //實際測得的速度


float vv_min=0.0;vv_max=250.0;


float vi_Ref=60.0; //給定值


float vi_PreError,vi_PreDerror;


uint pwm=100; //相當於占空比標志變數


int sample_time=0; //采樣標志


float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,積分,微分常數


void delay (uint z)


{


uint x,y;


for(x=z;x>0;x--)


for (y=20;y>0;y--);


}


void time_init()


{


ET1=1; //允許定時器T1中斷


ET0=1; //允許定時器T0中斷


TMOD = 0x15; //定時器0計數,模式1;定時器1定時,模式1


TH1 = (65536-100)/256; //定時器1值,負責PID中斷 ,0.1ms定時


TL1 = (65536-100)%6;


TR0 = 1; //開定時器


TR1 = 1;


IP=0X08; //定時器1為高優級


EA=1; //開總中斷


}


void keyscan()


{


float j;


if(s1_jiasu==0) //加速


{


delay(20);


if(s1_jiasu==0)


vi_Ref+=10;


j=vi_Ref;


}


while(s1_jiasu==0);


if(s2_jiansu==0) //減速


{


delay(20);


if(s2_jiansu==0)


vi_Ref-=10;


j=vi_Ref;


}


while(s2_jiansu==0);


if(s3_jiting==0)


{


delay(20);


motor=0;


P1=0X00;


P3=0X00;


P0=0x00;


}


while(s3_jiting==0);


}


float v_PIDCalc(float vi_Ref,float vi_SpeedBack)


{


register float error1,d_error,dd_error;


error1=vi_Ref-vi_SpeedBack; //偏差的計算


d_error=error1-vi_PreError; //誤差的偏差


dd_error=d_error-vi_PreDerror; //誤差變化率


vi_PreError=error1; //存儲當前偏差


vi_PreDerror=d_error;


bianhuasu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);


return (bianhuasu);


}


void v_Display()


{


uint su;


su=(int)(reallyspeed*10); //乘以10之後強制轉化成整型


speed[3]=su/1000; //百位


speed[2]=(su00)/100; //十位


speed[1]=(su0)/10; //個位


speed[0]=su; //小數點後一位


wei1=0; //第一位打開


P0=table[speed[3]];


delay(5);


wei1=1; //第一位關閉


wei2=0;


P0=table[speed[2]];


delay(5);


wei2=1;


wei3=0;


P0=table[speed[1]];


xiaoshudian=1;


delay(5);


wei3=1;


wei4=0;


P0=table[speed[0]];


delay(5);


wei4=1;


}


void BEEP()


{


if((reallyspeed)>=vi_Ref+5||(reallyspeed


{


beep=~beep;


delay(4);


}


}


void main()


{


time_init();


motor=0;


while(1)


{


v_Display();


BEEP();


}


if(s3_jiting==0) //對按鍵3進行掃描,增強急停效果


{


delay(20);


motor=0;


P1=0X00;


P3=0X00;


P0=0x00;


}


while(s3_jiting==0);


}


void timer0() interrupt 1


{


}


void timer1() interrupt 3


{


TH1 = (65536-100)/256; //1ms定時


TL1 = (65536-100)%6;


sample_time++;


if(sample_time==5000) //采樣時間0.1ms*5000=0.5s


{


TR0=0; //關閉定時器0


sample_time=0;


pulse_count=TH0*255+TL0; //保存當前脈沖數


keyscan(); //掃描按鍵


reallyspeed=pulse_count/(4*0.6); //計算速度


pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);


if(pwm


if(pwm>100)pwm=100;


TH0=TL0=0;


TR0=1; //開啟定時器0


}


num++;


if(num==pwm) //此處的num值,就是占空比


{


motor=0;


}


if(num==100) //100相當於占空比調節的精度


{


num=0;


motor=1;


}


}



❸ 51單片機驅動5v直流馬達應該用什麼驅動

控制轉速就用單管(mos場效應管可以直接驅動),如果是三極體驅動,需要2級放大;驅動程序就用最簡單的pwm控制原理吧。單片機內部程序可以固化一固定驅動頻率比如0.5k-1k,只需要手動按鈕調節占空比,或(占空比數組);最後最後在電機電源端並聯上100uf直流電容濾波效果會比較好哦;

❹ 單片機驅動小型馬達用什麼驅動電路

小型的馬達可以用三極體(不知道會不會小了點,不知道具體有多小,不好說,你試一下吧),達林頓管驅動稍大應該可以。
如果上面的都不行,那就用專門的電機驅動晶元吧,比如L298。

❺ 51單片機怎麼驅動直流電機c語言

51單片機驅動直流電機程序(用的是l298n晶元):

#include<reg51.h>

#include<math.h>

#define uint unsigned int

#define uchar unsigned char

#define N 100

sbits1=P1^0; //電機驅動口

sbit s2=P1^1; //電機驅動口

sbit s3=P1^2; //電機驅動口

sbit s4=P1^3; //電機驅動口

sbit en1=P1^4; //電機使能端

sbit en2=P1^5; //電機使能端

sbit LSEN=P2^0; //光電對管最左

sbit LSEN1=P2^1; //光電對管左1

sbit LSEN2=P2^2; //光電對管左2

sbit RSEN1=P2^3; //光電對管右1

sbit RSEN2=P2^4; //光電對管右2

sbit RSEN=P2^5; //光電對管最右

uint pwm1=0,pwm2=0,t=0;

void delay(uint xms)

{

uint a;

while(--xms)

{

for(a=123;a>0;a--);

}

}

void motor(uchar speed1,uchar speed2)

{

if(speed1>=-100&&speed1<=100)

{

pwm1=abs(speed1);

if(speed1>0)

{

s1=1;

s2=0;

}

if(speed1==0)

{

s1=1;

s2=1;

}

if(speed1<0)

{

s1=0;

s2=1;

}

}

if(speed2>=-100&&speed2<=100)

{

pwm2=abs(speed2);

if(speed2>0)

{

s3=1;

s4=0;

}

if(speed2==0)

{

s3=1;

s4=1;

}

if(speed2<0)

{

s3=0;

s4=1;

}

}

}

void go_forward(uint speed)

{

s1=1;

s2=0;

s3=1;

s4=0;

pwm1=speed;

pwm2=speed;

}

void go_back(uint speed)

{

s1=0;

s2=1;

s3=0;

s4=1;

pwm1=speed;

pwm2=speed;

}

void stop()

{

s1=1;

s2=1;

s3=1;

s4=1;

pwm1=0;

pwm2=0;

}

void turn_right(uint P1,uint P2) //右轉函數

{

s1=1;

s2=0;

s3=0;

s4=1;

pwm1=P1;

pwm2=P2;

}

void turn_left(uint P1,uint P2) //左轉函數

{

s1=0;

s2=1;

s3=1;

s4=0;

pwm1=P1;

pwm2=P2;

}

void tracking()

{

if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==0)) //沒有檢測到

{

go_forward(100);

}

if((LSEN1==1)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==0)) //左一檢測到

{

turn_left(40,80); //左轉 右輪 》左輪

delay(N);

}

if((LSEN1==0)&&(LSEN2==1)&&(RSEN1==0)&&(RSEN2==0)) //左二檢測到

{

turn_left(40,60); //左轉 右輪 》左輪

delay(N);

}

if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==1)&&(RSEN2==0)) //右一檢測到

{

turn_right(60,4); //右轉 左輪 》右輪

delay(N);

}

if((LSEN1==0)&&(LSEN2==0)&&(RSEN1==0)&&(RSEN2==1)) //右二檢測到

{

turn_right(80,40); //右轉 左輪 》右輪

delay(N);

}

if((LSEN1==1)&&(LSEN2==1))

{

turn_left(0,100);

delay(1000);

}

if((RSEN1==1)&&(RSEN2==1))

{

turn_right(100,0);

delay(1000);

}

}

void avoidance()

{

}

void init()

{

TMOD=0x02; //timer0 同時配置為模式2, 8自動重裝計數模式

TH0=156; //定時器初值設置100us中斷

TL0=156;

ET0=1;

EA=1;

TR0=1; //開啟總中斷

}

void main()

{

init();

while(1)

{

tracking();

}

}

void timer0() interrupt 1 //電機驅動 提供PWM信號

{

if(t<pwm1)

en1=1;

else

en1=0;

if(t<pwm2)

en2=1;

else

en2=0;

t++;

if(t>100)

t=0;

}

(5)單片機驅動馬達擴展閱讀

L298N 是一種雙H橋電機驅動晶元,其中每個H橋可以提供2A的電流,功率部分的供電電壓范圍是2.5-48v,邏輯部分5v供電,接受5vTTL電平。一般情況下,功率部分的電壓應大於6V否則晶元可能不能正常工作。

❻ 單片機驅動馬達

除非在程序反復的對i/o口寫"1",才能維持電機運轉,不是很正常.這說明給脈沖信號才可以運轉,請問你用的是什麼馬達,型號?

❼ 51單片機,L298N驅動小馬達,怎麼寫函數可以讓電機轉的慢一些

首先你想要通過單片機控制這個馬達就要首先明白為什麼控制或者說這個單片機是通過怎樣的方式來控制這個馬達的轉速的?

馬達工作的原理是因為給了它一個高電平,所以我們可以用pwm這個波來控制電動馬達的轉速。也就是占空比的大小,可以直接影響馬達的轉速。

你想要控制馬達的轉速就是控製程序上面的占空比。占空比越高,那麼馬達的轉速就會越快。反之占空比越低,馬達的轉速就會隨之減慢。你如果用程序函數控制的話,可以寫一個占空比。而用51單片機寫一個馬達轉速控制函數,可以使用定時器來,做一個真空比。

你可以通過一個按鍵來調節占空比的大小這樣你就可以通過按鍵調節電機的轉速,所以這樣來說比較好控制,而且現象更直觀,便於觀察。

❽ 用stc51單片機控制uln2003驅動直流馬達,為啥馬達只抖動一下代碼沒問題,在開發板能用

uln2003是達林頓驅動晶元,一路輸入一路輸出一一對應。如果確定程序沒有問題,建議使用單片機控制MOS管或三極體,看電機是否正常運轉,其原理和用2003一個樣。
如果用MOS管可以轉,則是2003的問題,如果也不轉,再檢查程序吧。

❾ 怎麼用單片機控制馬達

1、通過設置PWM波的占空比來控制直流電機的轉速,占空比越大,轉速越快,越小轉速越低.
2、當然單片機的I/O口是不能直接驅動電機的,所以你還需要用一個馬達驅動晶元.像LG9110、CMO825等.馬達驅動IC可以將單片機I/O輸出信號放大,這樣電機中流過的電流足夠大,電機才能轉起來.
3、你要是不清除PWM是怎麼回事呢,可以先作一些了解,再來知道有徵對性地提問就好了.

閱讀全文

與單片機驅動馬達相關的資料

熱點內容
精通編程入門 瀏覽:14
99單片機原理 瀏覽:59
linuxssh互信 瀏覽:286
支持128加密的瀏覽器 瀏覽:290
程序員下載器 瀏覽:48
退出雲伺服器代碼 瀏覽:900
軍狀如命令 瀏覽:263
如何安卓系統更新 瀏覽:74
linux命令在哪裡輸入 瀏覽:497
編程語言集合類怎麼選 瀏覽:93
如何將pdf轉化為word 瀏覽:11
邁克菲隔離區解壓密碼 瀏覽:785
怎麼用偉福編譯 瀏覽:867
計算機演算法專家 瀏覽:501
什麼app清理垃圾 瀏覽:643
android流媒體伺服器 瀏覽:183
各種演算法的時間復雜度是指 瀏覽:116
幫助高考生緩解壓力 瀏覽:850
自媒體聚合APP需要什麼資質 瀏覽:487
求標准體重的演算法 瀏覽:740