Ⅰ 51單片機,L298N驅動小馬達,怎麼寫函數可以讓電機轉的慢一些
首先你想要通過單片機控制這個馬達就要首先明白為什麼控制或者說這個單片機是通過怎樣的方式來控制這個馬達的轉速的?
馬達工作的原理是因為給了它一個高電平,所以我們可以用pwm這個波來控制電動馬達的轉速。也就是占空比的大小,可以直接影響馬達的轉速。
你想要控制馬達的轉速就是控製程序上面的占空比。占空比越高,那麼馬達的轉速就會越快。反之占空比越低,馬達的轉速就會隨之減慢。你如果用程序函數控制的話,可以寫一個占空比。而用51單片機寫一個馬達轉速控制函數,可以使用定時器來,做一個真空比。
你可以通過一個按鍵來調節占空比的大小這樣你就可以通過按鍵調節電機的轉速,所以這樣來說比較好控制,而且現象更直觀,便於觀察。
Ⅱ 單片機怎樣驅動電機
單片機的輸出電流只有20mA左右,所以不可以直接接到電機上驅動電機。必須使用電機驅動模塊(比如LN298)。
編程如下:
#include<reg52.h>
sbit IN0=P1^0;
sbit IN1=P1^1;
void main()
{
while(1)
{ //使電機正轉
IN0=0;
IN1=1;
//使電機反轉
// IN0=1;
//IN1=0;
}
}
Ⅲ 怎樣用單片機控制直流電動機
1,簡單的開關控制,用單片機引腳輸出高低電平,控制MOS管驅動電路。
2,正反轉控制,需要兩個單片機引腳,一個控制正反轉,一個控制啟動與否。
3,需要控制速度,(1)電壓控制,(2)PWM(脈寬)控制。
4,需要控制轉角,首先能夠控制速度,然後增加一個編碼器,單片機中加入PID控制,用以精確控制。
以上大概就是直流電機能夠控制的東西。
Ⅳ 我想用單片機控制馬達,來實現馬達的轉動,有沒有單片機的高手來幫忙我下!非常感謝!
直流電機正反轉
6.1子情境內容:用單片機AT89C51控制直流電機正反轉。在此將由89C51的P2.0,P2.1通過晶體管控制繼電器,當P2.0輸出低電平,P2.1輸出高電平時,三極體Q1導通,而三極體Q2截止,從而導致與Q1相連的繼電器吸合,電機因兩端產生電壓而轉動。由P3.0,P3.1,P3.2控制電機的正傳、反轉和停止。
6.2子情境目標:
(1)掌握趨動電機正反轉的電路
(2)用PROTEUS實現電機正反轉電路的設計,並進行實時交互模擬
6.3知識點鏈接
二極體保護電路:
在圖5-33中,在兩個繼電器的兩端都反相接了一個二極體,這個二極體非常重要,當使用電磁繼電器時必須接。原因如下:線圈通電正常工作時,二極體對電路不起作用。當繼電器線圈在斷電的一瞬間會產生一個很強的反向電動勢,在繼電器線圈兩端反相並聯二極體就是用來消耗這個反向電動勢的,通常這個二極體叫做消耗二極體,如果不加這個消耗二極體,反向電動勢就會直接作用在趨動三極體上,很容易將三極體燒毀。
6.4任務步驟
6.4.1步驟一:PROTEUS電路設計,實現用皮逗亮單片機AT89C51控制直流電機正反轉原理圖如圖5-33所示。
圖5-33直流電機正反轉原理圖
1、選取元器件
①單片機:AT89C51
②電阻:RES*
③直流電機:MOTOR
④按鈕:BUTTON
⑤三極體:NPN*
⑥繼電器:RELAY*
⑦二極體:DIODE*
2、放置元器件、放置電源和地、連線、元器件屬性設置
直流電機正反燃寬轉的原理圖如圖5-33所示,整個電路設計操作都在ISIS平台中進行。與子情景3相似,故不詳述。
(1)關於元器件屬性的設置在此實例中需要特別注意:
①三極體基極的限流電阻更改為1K歐姆
②雙擊電機圖標,彈出如圖5-34所示的電機屬性對話框,在NominalVoltage一欄中將默認值更改為5v
④ 雙擊繼電器圖標,在彈出的如圖5-35所示的繼電器屬性對話框中,在ComponentValue一欄中將默認值更改為5v
圖5-34更改電機屬性
圖5-35更改繼電器屬性
6.4.2步驟二:源程序設計與目標代碼文件生成
(1)程序流程圖
圖5-36電機正反轉流程圖
(2)源程序設計
#include<reg51.h>
sbitp20=P2^0;//P2^0的功能是控制三極體的導通和截止
sbitp21=P2^1;指埋//P2^1的功能是控制三極體的導通和截止
sbitp30=P3^0;//聲明直流電機的正傳位置
sbitp31=P3^1;//聲明直流電機的反轉位置
sbitp32=P3^2;//聲明直流電機的停止位置
voidmain()
{
while(1)//無窮循環
{
if(p30==0)//若按下p30
{
p20=1;//P2^0控制的三極體截止
p21=0;//P2^1控制的三極體導通,線圈吸合,兩者共同控制電機正轉
}
if(p31==0)//若按下p31
{
p20=0;//P2^0控制的三極體導通,線圈吸合
p21=1;//P2^1控制的三極體截止,兩者共同控制電機反轉
}
if(p32==0)//若按下p32
{
p20=1;//P2^0控制的三極體截止
p21=1;//P2^1控制的三極體截止,兩者共同控制電機停轉
}
}
}
Ⅳ 如何用單片機控制馬達
如果不需要控制轉速,一個三極體一個繼電器就可以控制馬達了。
Ⅵ 單片機驅動小型馬達用什麼驅動電路
小型的馬達可以用三極體(不知道會不會小了點,不知道具體有多小,不好說,你試一下吧),達林頓管驅動稍大應該可以。
如果上面的都不行,那就用專門的電機驅動晶元吧,比如L298。
Ⅶ 如何用單片機驅動振動電機
VCC-電機-三極體集電極-三極體發唯漏射極-GND
單片機的中芹某個端指培爛口用470~1K左右的電阻連接到三極體的基極。
然後就可以編程式控制制該振動電機了。
Ⅷ 如何用單片機控制直流電機
通過與單片機相連的按鍵控制直流電機停啟的電路如下圖所示,通過P3.6口按鍵觸發啟動直流電機,P3.7口的按鍵觸發停止直流電機的運行。由圖可知,當P1.0輸出高電平「1」時,NPN型三極體導通,直流電機得電轉動;當P1.0輸出低電平「0」時,NPN型三極體截止,直流電機停止轉動。
通過單片機產生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;
}
}
Ⅸ 怎麼用單片機控制馬達
1、通過設置PWM波的占空比來控制直流電機的轉速,占空比越大,轉速越快,越小轉速越低.
2、當然單片機的I/O口是不能直接驅動電機的,所以你還需要用一個馬達驅動晶元.像LG9110、CMO825等.馬達驅動IC可以將單片機I/O輸出信號放大,這樣電機中流過的電流足夠大,電機才能轉起來.
3、你要是不清除PWM是怎麼回事呢,可以先作一些了解,再來知道有徵對性地提問就好了.
Ⅹ 怎樣用單片機驅動手機里的馬達驅動電路
馬達是直接驅動的
如果是直流馬達指襪沖,那麼就加個三極體通過繼電器給馬達供電,外加電源最好是3V左右的
如果是步進馬達,那麼就加三極體驅動,外加的電源最好是3.5~3.7V左右。
馬達是通過模塊驅動的好前
那麼一般的模塊都是寬電壓輸入的,那麼就唯殲加三極體驅動。