A. 單片機直流電機驅動電路
電機電流小於1A用8050和8550搭H橋是最便宜的方案,電路也非常簡單,
B. 單片機驅動直流電機的方案有哪些
單片機驅動直流電機一般有兩種方案。
第一,無須佔用單片機資源,直接選擇有PWM功能的單片機,可以實現精確調速。
第二,可以由軟體模擬PWM輸出調制,單片機型號的選擇餘地較大,但是需要佔用單片機資源,難以精確調速。
C. 單片機驅動直流電動機
你用的是12V電源,也就應該使用這個電路了。
問題是單片機輸出高電平,提供的電流有限,雖經過8050放大,也難以達到使電機轉動的需求。
可以再加一級放大,用8550即可,見圖。
原來的1K電阻可以適當的減小,680~470歐姆左右即可。
此時,單片機輸出低電平時,電機轉動。
--------------------------
加那兩個電阻,是進行電流限制,以免燒壞三極體和單片機引腳。
3.3K電阻,是控制8550的基極電流,在1mA左右就基本夠用;
減小到1K也可,這時,電流將近5mA了,還可以的。
1K電阻,是控制8050的基極電流的,減小到470歐姆,基極電流就能達到8~10mA,電流再增大,8050有危險。
D. AT89C52單片機與直流電機
直流電機驅動晶元UM2003,單片機程序產生pwm信號調節轉速
E. 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否則晶元可能不能正常工作。
F. 用單片機怎麼使直流電機正反轉
單片機控制直流電機正反轉,最簡單的方法是 兩個I/O口 控制兩個繼電器(一組常開、常閉)的就可以,電機 兩個極 接 兩個繼電器 的 動觸點,兩個繼電器 的 常開點接+(電機電源),兩個常閉點接-,就可以了。
單片機控制接通一個繼電器 是正轉,控制接通另一個繼電器 是反轉,兩個繼電器都不接通(或者都接通)電機不轉。
G. 單片機帶動直流電機
1、不用單片機,你直接加電,電機是否運行正常?並測驅動電流是否小於1A。
2、如果正常,建議兩級8050放大以達到第二極最大300mA基極,1.5A發射極的效果。
H. 直流電機對單片機的影響
我對單片機也是個新手,具體電機轉的情況得看你的驅動信號,還有就是電源電壓(包括直流電機的電壓)是不是準的,你看一下吧。
I. 單片機如何控制直流電機的速度
基於模糊PID的直流力矩電機轉速控制。
在分析模糊控制和PID控制結合方式的基礎上,設計一個二維模糊PID控制演算法,該演算法根據誤差信號是否達到閾值來決定何時在模糊控制與PID控制之間切換.採用編碼器、80196KC單片機、16位D/A轉換器和直流力矩電並結合上述控制演算法構成直流力矩電機的模糊PID穩速控制系統.通過對標准PID和模糊PID實測數據分析比較說明,模糊PID控制可以達到無超調輸出,其調節時間小於標准PID控制的調節時間,穩態誤差小於萬分之四.
J. 如何用單片機控制直流電機
通過與單片機相連的按鍵控制直流電機停啟的電路如下圖所示,通過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;
}
}