導航:首頁 > 操作系統 > 51單片機控制直流電機

51單片機控制直流電機

發布時間:2022-01-31 12:33:01

『壹』 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;

}

(1)51單片機控制直流電機擴展閱讀

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

『貳』 如何利用51系列單片機控制電機

小功率電機,玩具車上的,可用單片機接三極體來驅動。

『叄』 51單片機如何驅動12v直流電機

從現象看,接兩個電機時,應該是電源不夠提供所需的功率,所以電壓被拉低了。也可以這么說,負載越多,電源輸出的電流越大,那麼電源內阻的壓降就越大,輸出電壓自然被低了,電壓太低,單片機也就可能運行不正常了。你可以用兩個電源分別給電機和單片機供電,或改用輸出功率更大的電源。

『肆』 如何用51單片機控制4個直流電機電機

倆L298N,一共4個H橋,能控制4個直流電機正反轉,且能調速

如果只需要正轉或者反轉,用uln2003一片即可

注意一點:用298N的時候需要加續流二極體保護晶元,uln2003自帶續流二極體

『伍』 如何用at89c51單片機控制直流電機轉速(三個檔),越詳細越好,求c語言程序,還有直流電機要用什麼信號

不知道你怎麼控制電機轉速的,是靠直流電壓還是PWM來控制,前者很簡單,跟上條回答一樣處理就可以,後者的話你設定三個占寬比的PWM就可以了。

『陸』 51單片機控制直流電機的速度

不知道你說的295是什麼東西,猜想可能是成品PWM晶元吧,但可以不用,理論上,使用89C52或者89C51,應用里邊的定時器,可以產生PWM波,從而控制點檢轉速,但目前51類型的單片機,有許多比較新的型號,價格也很低廉,內部帶有PWM輸出,例如STC12C5408,這樣實現起來也比較簡單。

『柒』 51單片機可以直接控制直流電機嗎 在IO口上接個直流電機

不可以,電機工作電流很大,遠遠超過單片機的允許范圍,直接控制,很容易燒壞單片機或者使系統無法正常工作,其他的問題還有一大把。

『捌』 用51單片機控制直流電機的轉動

電路圖就簡單了,只要按照程序去連接就不會有問題。這里需要用到一個H橋電路,注意橋電路中Q1和Q3是PNP型三極體,負電導通。Q2和Q4是NPN型三極體,正電導通。Q1和Q4導通是正傳,Q3和Q2導通是反轉。

#include<stc.h>

#defineucharunsigndechar

#defineuintunsigndeint

sbitzheng=P3^0;//按鍵正轉

sbitfan=P3^1; //按鍵反轉

sbitting=P3^2;//按鍵停

sbitQ1=P3^4;//定義4個IO控制橋電路

sbitQ2=P3^5;

sbitQ3=P3^6;

sbutQ4=P3^7;

sbitled1=P0^0; //定義3個LED燈

sbitled2=P0^1;

sbitled3=P0^2;

voiddaley(ucharz);//延時函數

voidmain()

{

while()

{

if(zheng==0) //電機正轉

{

delay(10);

if(zheng==0);

{

Q2=0;

Q3=1;//這兩句是把反轉關掉

Q1=0;

Q4=1;//這兩句是打開正轉

led1=0;//紅燈亮

led2=1;//其他等關閉

led3=1;//其他等關閉

}

}

if(fan==0) //電機反轉

{

delay(10);

if(fan==0)

{

Q1=1;

Q4=0;//把正轉關掉

Q2=1;

Q3=0;//開反轉

led1=1;//其他等關閉

led2=0;//綠燈亮

led3=1;//其他等關閉

}

}

if(ting==0) //關掉電機

{

delay(10);

if(ting==0)

{

Q1=1;

Q2=0;

Q3=1;

Q4=0;

led1=1;//其他等關閉

led2=1;//其他等關閉

led3=0;//黃燈亮

}

}

}

}

voiddaley(ucharz) //延時函數

{

uintx,y;

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

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

}

『玖』 怎樣用c51編寫單片機控制直流電機

我有一程序,用STC5410單片機,可20檔調光並用液晶屏顯示級數,當然也可以控制直流電機用發光二極體試驗過可正常工作液晶屏顯示程序完全可以去掉
STC單片機單/雙鍵控制LED亮度PWM調光程序 原創WanNengGong 2010/09/20
參考程序: 杜洋工作室PWM功能程序模塊
輸出口為P3.7(PWM0)
*************************************************/
#include<STC12C54.H>
#define uchar unsigned char
#define uint unsigned int
uchar vx=10;//vx=10 在上電時為半亮度狀態,可根據自己的用途及要求任意設定 vx=20為最亮

sbit rw=P1^4;
sbit rs=P1^3;
sbit lcden=P1^5;
sbit s2=P3^2;
sbit s3=P3^3;
sbit led=P3^7;//可以不要
#define db P2

void Delay1ms(uint i) //1ms延時程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}

void write_com(uchar com) //向LCD1602寫命令
{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10);
lcden=1;
Delay1ms(10);
lcden=0;
}
void write_date(uchar date)//向LCD1602寫數據
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(10);
lcden=1;
Delay1ms(10);
lcden=0;
}
void init2()//液晶屏初始化
{
rw=0;
write_com(0x38);
Delay1ms(10);
write_com(0x0f);
Delay1ms(10);
write_com(0x06);
Delay1ms(10);
write_com(0x01);
Delay1ms(10);
}

void display_brightness (uchar temp1) //顯示程序 顯示當前調光工作級數
{
uchar A1,A2;
init2();
A1=temp1/10;
A2=temp1%10;
write_com(0x80);
Delay1ms(10);
write_date(0x30+A1);
write_com(0x81);
Delay1ms(10);
write_date(0x30+A2);
}

/*******************************************************************************/
void PWM_init (void){//PWM初始化函數
CMOD=0x02; //設置PCA定時器
CL=0x00;
CH=0x00;
CCAPM0=0x42; //PWM1設置PCA工作方式為PWM方式(0100 0010)
CCAP0L=0x00; //設置PWM1初始值與CCAP0H相同
CCAP0H=0x00; // PWM1初始時為0
CR=1; //啟動PCA定時器
}
/******************************************************************************/
void PWM1_set (uchar a){//PWM1占空比設置函數
CCAP0L=a; //設置值直接寫入CCAP1L
CCAP0H=a; //設置值直接寫入CCAP1H
}
/*****************************************************************************/
void DelayM(unsigned int a){//延時函數 1mS/次(用於1T單片機)
unsigned char n,i,j;
while(--a!=0){
for(n=1;n>0;n--)
for(j=222;j>0;j--)
for(i=12;i>0;i--);
} }
/****************************************************************************/
void main(void)
{
s2= 1;
s3 = 1;
PWM_init ();
display_brightness (vx);
while(1)
{
PWM1_set(vx*12);//數字12是配合vx調試取得的,此時vx的賦值范圍約為1-20對應最暗-最亮
if (s2 == 0 )//--------減調整---------//
{
DelayM(20); //延時20毫秒消抖動
if(s2 == 0) //如果20MS後 s2還是0狀態則確認下調鍵是按下的
{
vx--;
if(vx<1) //如果設定vx=20,將語句改為if(vx<1){vx=10;}則為單按鍵循環控制,則可去除加調整控制部分
{
vx=10;
}
}
display_brightness (vx);
while(s2 == 0);//等待鍵松開
}
if (s3== 0 )//--------加調整---------//
{
DelayM(20);
if(s3 == 0)
{
vx++;
if(vx>20)
{
vx=10;
}
}
display_brightness (vx);
while(s3 == 0);
}
}
}

『拾』 用51單片機控制14路24V直流電機

關鍵看你的輸入信號(也就是控制信號)。
如果是通過邏輯及數學運算得到的話,那就要用晶元控制;如果你有14個信號的話,那就不用晶元。
如果用晶元控制,那就用擴展IO口,或者用兩塊51晶元;
如果不用晶元控制,那就直接用H橋驅動馬達(正反轉);
至於要精確控制馬達,那就得用到晶元,而直流電機和步進電機都能做到。如果用直流電機的話要加霍爾感應開關如A44E來計數。

閱讀全文

與51單片機控制直流電機相關的資料

熱點內容
編譯內核找不到工具鏈 瀏覽:447
java常見模式 瀏覽:500
典欣空調壓縮機 瀏覽:421
app如何認定許可權 瀏覽:849
兩個復數相除的角度計演算法則 瀏覽:584
電商類app開發怎麼收費 瀏覽:300
打造電子書反編譯工具 瀏覽:74
壓縮比115 瀏覽:558
pdf怎麼摳圖 瀏覽:864
霍妮pdf 瀏覽:808
反編譯VMP 瀏覽:49
hello編譯器 瀏覽:771
apk程序加密 瀏覽:595
如何給app重命名 瀏覽:603
怎麼幽默調侃程序員 瀏覽:285
忘記密碼解壓視頻 瀏覽:912
運城機場春運加密 瀏覽:287
安卓手機如何關閉app後台 瀏覽:154
安卓數字密碼忘記怎麼破解 瀏覽:253
pythonzmq模式 瀏覽:182