『壹』 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自帶續流二極體
單片機(Microcontrollers)是一種集成電路晶元,是採用超大規模集成電路技術把具有數據處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統、定時器/計數器等功能(可能還包括顯示驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器等電路)集成到一塊矽片上構成的一個小而完善的微型計算機系統,在工業控制領域廣泛應用。從上世紀80年代,由當時的4位、8位單片機,發展到現在的300M的高速單片機
『伍』 如何用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來計數。