⑴ 基於單片機的pwm小功率直流電機調速
直流調速器就是調節直流電動機速度的設備,上端和交流電源連接,下端和直流電動機連接,直流調速器將交流電轉化成兩路輸出直流電源,一路輸入給直流電機礪磁(定子),一路輸入給直流電機電樞(轉子),直流調速器通過控制電樞直流電壓來調節直流電動機轉速。同時直流電動機給調速器一個反饋電流,調速器根據反饋電流來判斷直流電機的轉速情況,必要時修正電樞電壓輸出,以此來再次調節電機的轉速。
直流電機的調速方案一般有下列3種方式:
1、改變電樞電壓;
2、改變激磁繞組電壓;
3、改變電樞迴路電阻。
使用單片機來控制直流電機的變速,一般採用調節電樞電壓的方式,通過單片機控制PWM1,PWM2,產生可變的脈沖,這樣電機上的電壓也為寬度可變的脈沖電壓。根據公式
U=aVCC
其中:U為電樞電壓;a為脈沖的占空比(0<a<1);VCC直流電壓源,這里為5V。
電動機的電樞電壓受單片機輸出脈沖控制,實現了利用脈沖寬度調制技術(PWM)進行直流電機的變速。
因為在H橋電路中,只有PWM1與PWM2電平互為相反時電機才能驅動,也就是PWM1與PWM2同為高電平或同為低電平時,都不能工作,所以上圖中的實際脈沖寬度為B,
我們把PWM波的周期定為1ms,占空比分100級可調(每級級差為10%),這樣定時器T0每0.01ms產生一次定時中斷,每100次後進入下一個PWM波的周期。上圖中,占空比是60%,即輸出脈沖的為0.6ms,斷開脈沖為0.4ms,這樣電樞電壓為5*60%=3V。
我們討論的是可以正轉反轉的,如果只按一個方向轉,我們就只要把PWM1置為高電平或低電平,只改變另一個PWM2電平的脈沖變化即可,,如下圖(Q4導通,Q3閉合,電機只能順時針調整轉動速度)
C語言代碼:
#include<AT89X52.h>
#define uchar unsigned char
#define uint unsigned int
sbit K5=P1^4;
sbit K6=P1^5;
sbit PWM1=P1^0;
sbit PWM2=P1^1;
sbit FMQ=P3^6;
uchar ZKB1,ZKB2;
void delaynms(uint aa)
{
uchar bb;
while(aa--)
{
for(bb=0;bb<115;bb++) //1ms基準延時程序
{
;
}
}
}
void delay500us(void)
{
int j;
for(j=0;j<57;j++)
{
;
}
}
void beep(void)
{
uchar t;
for(t=0;t<100;t++)
{
delay500us();
FMQ=!FMQ; //產生脈沖
}
FMQ=1; //關閉蜂鳴器
delaynms(300);
}
void main(void)
{
TR0=0; //關閉定時器0
TMOD=0x01; //定時器0,工作方式1
TH0=(65526-100)/256;
TL0=(65526-100)%256; //100us即0.01ms中斷一次
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器T0
ZKB1=50; //占空比初值設定
ZKB2=50; //占空比初值設定
while(1)
{
if(!K5)
{
delaynms(15); //消抖
if(!K5) //確定按鍵按下
{
beep();
ZKB1++; //增加ZKB1
ZKB2=100-ZKB1; //相應的ZKB2就減少
}
}
if(!K6)
{
delaynms(15); //消抖
if(!K6) //確定按鍵按下
{
beep();
ZKB1--; //減少ZKB1
ZKB2=100-ZKB1; //相應的ZKB2增加
}
}
if(ZKB1>99)
ZKB1=1;
if(ZKB1<1)
ZKB1=99;
}
}
void time0(void) interrupt 1
{
static uchar N=0;
TH0=(65526-100)/256;
TL0=(65526-100)%256;
N++;
if(N>100)
N=0;
if(N<=ZKB1)
PWM1=0;
else
PWM1=1;
if(N<=ZKB2)
PWM2=0;
else
PWM2=1;
}
//顯現:電機轉速到最高後,也就是N為1或99時,再按一下,就變到99或1,
//電機反方向旋轉以最高速度
⑵ 基於單片機實現直流電機PWM調速系統
這個已經調試成功 ,你自己改下埠就可以了 O(∩_∩)O哈哈~
/******************************************************************************
* *
*關於頻率和占空比的確定,對於12M晶振,假定PWM輸出頻率為1KHZ,這樣定時中斷次數 *
*設定為C=10,即0.01MS中斷一次,則TH0=FF,TL0=F6;由於設定中斷時間為0.01ms,這樣*
*可以設定占空比可從1-100變化。即0.01ms*100=1ms *
******************************************************************************/
#include <REGX51.H>
#define uchar unsigned char
/*****************************************************************************
* TH0和TL0是計數器0的高8位和低8位計數器,計算辦法:TL0=(65536-C)%256; *
* TH0=(65536-C)/256,其中C為所要計數的次數即多長時間產生一次中斷;TMOD是計數器*
* 工作模式選擇,0X01表示選用模式1,它有16位計數器,最大計數脈沖為65536,最長時 *
* 間為1ms*65536=65.536ms *
******************************************************************************/
#define V_TH0 0XFF
#define V_TL0 0XF6
#define V_TMOD 0X01
void init_sys(void); /*系統初始化函數*/
void Delay5Ms(void);
unsigned char ZKB1,ZKB2;
void main (void)
{
init_sys();
ZKB1=40; /*占空比初始值設定*/
ZKB2=70; /*占空比初始值設定*/
while(1)
{
if (!P1_4) //如果按了+鍵,增加占空比
{
Delay5Ms();
if (!P1_4)
{
ZKB1++;
ZKB2=100-ZKB1;
}
}
if (!P1_5) //如果按了-鍵,減少佔空比
{
Delay5Ms();
if (!P1_5)
{
ZKB1--;
ZKB2=100-ZKB1;
}
}
/*對占空比值限定范圍*/
if (ZKB1>99) ZKB1=1;
if (ZKB1<1) ZKB1=99;
}
}
/******************************************************
*函數功能:對系統進行初始化,包括定時器初始化和變數初始化*/
void init_sys(void) /*系統初始化函數*/
{
/*定時器初始化*/
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
}
//延時
void Delay5Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}
/*中斷函數*/
void timer0(void) interrupt 1 using 2
{
static uchar click=0; /*中斷次數計數器變數*/
TH0=V_TH0; /*恢復定時器初始值*/
TL0=V_TL0;
++click;
if (click>=100) click=0;
if (click<=ZKB1) /*當小於占空比值時輸出低電平,高於時是高電平,從而實現占空比的調整*/
P1_0=0;
else
P1_0=1;
if (click<=ZKB2)
P1_1=0;
else
P1_1=1;
}
⑶ 51單片機實現直流電機PWM調速,為什麼要用定時器
直流電機的PWM調速,就是改變在一個周期里的通電時間,通電時間和斷電時間就是一個周期,這都是用時間來決定的,所以必須要用定時器。
51單片機是對所有兼容Intel
8031指令系統的單片機的統稱。該系列單片機的始祖是Intel的8031單片機,後來隨著Flash
rom技術的發展,8031單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列。
⑷ 單片機直流電機調速系統的設計
單片機控制的直流電機調速系統
摘要:本文採用AT89C52作為主控晶元,設計了一種直流電機高速系統。AT89C52產生單極性工作制的定頻PWM脈沖,配合驅動能力強大的L298,從而實現控制和調整直流電機轉速和轉向的功能。利用軟體編程,能夠設置多個占空比不同的脈沖,使得電機轉速可以逐步增大或減小,同時在LCD上顯示電機的工作狀態,易於觀察和識別。本設計主要由電機調速控制模塊和LCD顯示模塊組成,具有電路簡單,可靠性高,運行穩定的特點,是對於小型直流電機調速裝置的一種探究。
關鍵詞:AT89C52 定頻PWM LCD 直流電機
目 錄
1 緒論... 1
2 方案設計... 1
2.1 功能要求... 1
2.2 方案論證... 1
3 系統硬體的設計... 3
3.1 電機調速控制模塊... 3
3.2 LCD顯示模塊... 6
3.3 硬體設計總原理圖... 11
4 系統軟體的設計... 12
4.1 主程序... 12
5 調試及性能分析... 14
5.1 調試與測試... 14
6 結論... 15
7 致謝... 15
參考文獻... 17
附錄... 18
⑸ 求單片機直流電機調速系統的設計的方案和意義
一.電機調速模塊. 我們的設計思路是先產生占空比可調的方波(方法有多種,一是用555構成多諧振盪器.二可以利用單片機產生PWM方波)+4功率器件構成的H橋電路,用以驅動直流電機轉動.當然還許多驅動方案,比如三極體-電阻作柵極驅動\低壓驅動電路的簡易柵極驅動,還有可以直接用個MCU產生PWM外加一個MOS管驅動也可以. 1.1直流電機驅動電路的設計目標 在直流電機驅動電路的設計中,主要考慮一下幾點: 1. 功能:電機是單向還是雙向轉動?需不需要調速?對於單向的電機驅動,只要用一個大功率三極體或場效應管或繼電器直接帶動電機即可,當電機需要雙向轉動時,可以使用由4個功率元件組成的H橋電路或者使用一個雙刀雙擲的繼電器。如果不需要調速,只要使用繼電器即可;但如果需要調速,可以使用三極體,場效應管等開關元件實現PWM(脈沖寬度調制)調速。 2. 性能:對於PWM調速的電機驅動電路,主要有以下性能指標。 1)輸出電流和電壓范圍,它決定著電路能驅動多大功率的電機。 2)效率,高的效率不僅意味著節省電源,也會減少驅動電路的發熱。要提高電路的效率,可以從保證功率器件的開關工作狀態和防止共態導通(H橋或推挽電路可能出現的一個問題,即兩個功率器件同時導通使電源短路)入手。 3)對控制輸入端的影響。功率電路對其輸入端應有良好的信號隔離,防止有高電壓大電流進入主控電路,這可以用高的輸入阻抗或者光電耦合器實現隔離。 4)對電源的影響。共態導通可以引起電源電壓的瞬間下降造成高頻電源污染;大的電流可能導致地線電位浮動。 5)可靠性。電機驅動電路應該盡可能做到,無論加上何種控制信號,何種無源負載,電路都是安全的。 考慮到以上的因素我們採用555多諧振盪器產生占空比可調的方波+4功率器件構成的H橋來驅動直流電機.電路圖如下: 1.2、電機調速模塊的電路圖功能分析 555通過可調電阻可以實現占空比可調的方波,即組成占空比可調的多諧振盪器。 多諧振盪器實現占空比可調的方波的功能分析: 電源接通瞬間,電容C2上的初始電壓為0,施密特觸發器輸出電壓為U為高電平,與此同時由於集電極開路輸出端(7腳)對地斷開,電源通過R5、R7開始對電容C充電,電路進入暫穩態I狀態。此後電路按下列四個階段周而復始地循環,產生周期性的輸出脈沖。 (1) 暫穩態I階段,VCC通過R5。R7向電容C充電,電容C的電壓Uc按指數上升,在UC高於2/3VCC之前,定時器暫時維持『1』的狀態,輸出為高電位。 (2) 翻轉I階段,電容C繼續充電,當Uc高於2/3VCC後,定時器翻轉為『0』的狀態,輸出為低電位。此時,集電極開路輸出端(7腳)由對地斷開變為導通。 (3) 暫穩態II階段,電容C開始經歷R7、R6對地(7腳)放電,Uc按照指數下降,在Uc低於1/3VCC之前,定時器依然維持『0』的狀態。輸出為低電位。 (4) 翻轉II階段,電容C繼續放電,當Uc低於1/3VCC後,定時器翻轉為『1』狀態,輸出為高電位。此時,集電極開路輸出端(7腳)由對地導通變為對地斷開。此後,振盪器又回復到暫穩態I狀態。 (5) 可以通過調節R6的大小來調節定時器輸出方波的占空比。 Uln2003晶元是16腳七路電機驅動晶元,這塊晶元在這里可以看作是七非門晶元,作用是保證10腳和14腳的輸出SINGLE1和SINGLE2的輸出為一高一低。晶元中的二極體起到分流的作用。電路圖的右部分的作用是通過調節電機的正轉與反轉來調節電機的轉速,當SINGLE1為高 SINGLE2為低時,三極體Q2,Q3,Q5導通,Q1,Q4,Q6截止,電機1端通過Q5接地,Vcc通過Q2直接押在電機2端,此時電機2端電位高於1端,電機反轉;當SINGLE1為低SINGLE2為高時,電機正轉。當某一時刻占空比大於50%時,電機呈現正轉加速或是反轉減速狀態;某一時刻占空比小於50%時,電機呈現正轉減速或是反轉加速狀態。電機就是通過矩形波占空比的不同來調節轉速的,電機呈現出來的轉速是平均速度。 二.電機測速模塊電路以及功能分析 我們的設計思路是利用光電隔離器件以及BCD計數器實現直流電機測速模塊電路.利用電機轉動時帶動紙片遮擋光耦,使其發光二極體發出的紅外光被其中的光敏三極體所接收,通過BCD計數器最後將在單位時間內轉動的轉數給顯示出來.電路圖如下: 1.3、電機測速模塊整個電路以及其他功能分析 1.3.1晶元功能分析 CD40192: 可預置BCD加/減計數器(雙時鍾) NSC\TI///J1J2J3J4是可以預設數字的輸入,Q1Q2Q3Q4是加減計數的輸出。C0是進位端接高位的UP(加計數器)。BO是借位端圖上不接,為空腳。ENABLE是使能端。VSS接地,VCC接電源。DOWN是減計數器。 CD4511 BCD鎖存、7段解碼,驅動器: //A、B、C、D分別接BCD加減計數器的輸出端,鎖存數字。再7段解碼將其輸出到數碼管。 CD40106 六施密特觸發器: NSC\TI //輸入信號為A,輸出信號為A反,對輸入的脈沖進行整形並取反,使高位計數器的加計數能夠計數。 1.4、接受板子整個電路圖功能分析 光電耦合器OPTOISO1,當其接受到光信號,LED放光,三極體飽和導通,晶體管Q1導通,因為電阻R3 為47K,大部分的電壓分壓在電阻上了,A為低電平。若沒有接受到光的話,A為一高點平,這樣在A端形成了一個負脈沖,再經過CD40106 六施密特觸發器對脈沖進行整形並且取反,得到A的非為一正脈沖(指的是沒有光的時候為低電平,有光信號的時候為高電平)。 經過六施密特觸發器的脈沖信號再接到CD40192的UP端使BCD計數器件1為加計數器。又兩個CD40192ENABLE是使能端一起接在enable信號上。 REST信號也相連一起通過按鍵S1接VCC高電平/通過R9 10K接地。這樣只要按S1就可以實現REST重置清零。不按S1的就照常計數。 Enable使能信號的產生:是通過按鍵S1和555晶元以及相應的RC電路,實現一定時間的延時,也就是意味著一按S1,在定時T(由RC值確定)的時間內,計數器在計數,將光電耦合器接受到的恆定脈沖個人給計數,定時時間到的話就停止.這樣的話可以將電機的速度給測出來.定時時間為0.5S~1.0S. 驅動CD40192工作,我們對照圖2來分析這個定時器的功能。 當一上電的時候, 3 (OUT)腳輸出一個高電平,
⑹ 如何用單片機控制直流電機
通過與單片機相連的按鍵控制直流電機停啟的電路如下圖所示,通過P3.6口按鍵觸發啟動直流電機,P3.7口的按鍵觸發停止直流電機的運行。由圖可知,當P1.0輸出高電平「1」時,NPN型三極體導通,直流電機得電轉動;當P1.0輸出低電平「0」時,NPN型三極體截止,直流電機停止轉動。
通過單片機產生PWM波控制直流電機程序
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[10]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰數碼管顯示碼(0-9)
sbitxiaoshudian=P0^7;
sbitwei1=P2^4;//數碼管位選定義
sbitwei2=P2^5;
sbitwei3=P2^6;
sbitwei4=P2^7;
sbitbeep=P2^3;//蜂鳴器控制端
sbitmotor=P1^0;//電機控制
sbits1_jiasu=P1^4;//加速按鍵
sbits2_jiansu=P1^5;//減速按鍵
sbits3_jiting=P1^6;//停止/開始按鍵
uintpulse_count;//INT0接收到的脈沖數
uintnum=0;//num相當於占空比調節的精度
ucharspeed[3];//四位速度值存儲
floatbianhuasu;//當前速度(理論計算值)
floatreallyspeed;//實際測得的速度
floatvv_min=0.0;vv_max=250.0;
floatvi_Ref=60.0;//給定值
floatvi_PreError,vi_PreDerror;
uintpwm=100;//相當於占空比標志變數
intsample_time=0;//采樣標志
floatv_kp=1.2,v_ki=0.6,v_kd=0.2;//比例,積分,微分常數
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=20;y>0;y--);
}
voidtime_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;//開總中斷
}
voidkeyscan()
{
floatj;
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);
}
floatv_PIDCalc(floatvi_Ref,floatvi_SpeedBack)
{
registerfloaterror1,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);
}
voidv_Display()
{
uintsu;
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;
}
voidBEEP()
{
if((reallyspeed)>=vi_Ref+5||(reallyspeed
{
beep=~beep;
delay(4);
}
}
voidmain()
{
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);
}
voidtimer0()interrupt1
{
}
voidtimer1()interrupt3
{
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單片機直流電機調速測速模擬原理
基於51單片機直流電機調速測速模擬原理是以STC90C52RC單片機為主控晶元,利用PWM的原理,通過按鍵對直流電機進行調速,實現正反轉;採用霍爾感測器對直流電機的轉動進行計數,並通過主控晶元將採集到的計數值轉化為直流電機的當前速度值;利用LCD1602顯示模塊將計算得到的值進行實時顯示。