如何用51微控制器來產生pwm波來驅動5v的小電機

時間 2021-09-06 20:12:10

1樓:觀音斯坦

51沒有硬體的pwm,得全靠軟體模擬。

調速程式可以用定時器做,首先設定兩個定時用的全域性變數,一個代表高電平時間一個代表低電平時間。

先給定時器初值(既那兩個全域性變數中的一個),溢位後觸發中斷,在中斷裡設定另另一個初值並且取反pwm的輸出埠,兩個初值輪流給定時器,就可以任意調整佔空比,佔空比取決於兩個初值。

pwm輸出後,驅動三極體,後面接上電機就是了。

按鍵調速也不難,看你具體的按鍵處理程式了,通過獲得的鍵值控制上面說的兩個全域性變數就可以了。

測速可以用計數器做,得到計數值處理一下即可。

如果是自動調速,那需要做點簡單的演算法程式。

反正51有那麼多i/o口,再來一個轉速顯示什麼的也可以。

2樓:匿名使用者

你可以利用定時器來實現。打個比方:以一秒為單位,定時器設為50ms,這樣進中斷20次為一秒;設定兩個變數t和u,每進中斷一次t自加一,變數u由按鍵控制,每按一次鍵u自加一;在中斷裡,t和u相比較,當t小於u時,就叫微控制器pwm輸出埠為低電平,當t大於u時就叫微控制器pwm輸出口為高電平;同時當t自加到21時就置為0,u也是如此。

這樣你就可以通過按鍵來改變pwm波的佔空比,從而改變電機轉速,同時也可以根據u的值換算成電機轉速值。

3樓:

51系列的微控制器沒有自帶pwm

晶片用lm297就行了

調速程式可以用定時器做,還可以加一個轉速顯示什麼的。。。

程式網上有許多例程,可以看看串列埠除錯助手

4樓:

1 軟體延時法

利用軟體延時函式,控制電平持續的時間,達到模擬pwm的效果。

程式如下:

#include

sbit pwm=p1^0;

main()

}void delayus(uint x)

可見,用這種延時函式的方法就能簡單地模擬出pwm輸出。但是這種方法的缺點也相當明顯。當程式除了要輸出pwm波還要執行其他操作比如鍵盤掃描、顯示等操作時,需要佔用cpu一定的機器週期,這樣就會影響pwm的準確度。

現在很少會用到這種方法,接下來要介紹的是比較常用的方法。

2 定時器產生pwm

這種方法利用了定時器溢位中斷,在中斷服務程式改變電平的高低,在程式較複雜、多操作時仍能輸出較準確的pwm波形。

2.1 注意事項

2.2.1中斷服務程式的內容。

一般來說中斷服務程式只完成改變標誌位、轉換高低電平的功能,如果中斷服務程式中有太多的操作會影響pwm波的輸出,尤其是除法、取餘、浮點數運算會佔用大量的機器週期,應在中斷外完成運算。

2.2.2定時器裝入初值的問題。

裝入初值不能太接近於定時器的溢位值。如我們使用定時器方式1,最多能計65536個數,假設我們轉入的初值為65534,那麼定時器計兩個數就會進入中斷,這樣會使程式紊亂而其他功能無法正常地執行,所以一般要留50-100個數的裕量。

2.2 定時器工作方式

在定時器工作方式的選擇上,可以選擇定時器的工作方式0、1、2都可以,本文采用的是工作方式1,即16位定時器,這樣可以獲得較寬的調頻範圍。

2.3 定時器初值的計算

設佔空比為α,頻率為f

產生高電平時裝入定時器高8位的值應為

產生高電平時裝入定時器低8位的值應為

顯然,產生低電平時的公式只要把α換成(1-α)就行了。

然而在51微控制器中,浮點數運算需要消耗cpu很長的時間,為了提高程式效率,通常用100倍的佔空比來計算。同時,要注意資料型別,避免超出範圍,影響計算結果。

修改後的公式如下:

a為100倍佔空比,fr為0.01倍頻率

th0 = (65535-a*100/fr)/256;//高位初值

tl0 = (65535-a*100/fr)%256;

同樣,低電平的公式只需把a換成(100-a)即可。

注:t0_h , t0_l , t1_h , t1_l 均用於暫時儲存初值,進入中斷服務程式後直接給暫存器th0、tl0賦值,避免了在中斷中計算。

5樓:匿名使用者

恩,可以用達林頓電路的晶片來驅動,速度反饋可以用霍爾感測器來測速,至於程式嘛,很多**裡都提到了,這個還和你用的具體的電機有關係的,呵呵~~~

可以關注lm298和lm297晶片~~

6樓:匿名使用者

用一個9013型三極體進行訊號放大,或者用雙9013進行訊號的進一步放大

7樓:匿名使用者

用一片1836就行了

8樓:匿名使用者

軟體模擬pwm的**網上多了去了 lz隨便找找就好了 電路也都是經典的 方便一點麼加個298就好了

51微控制器通過pwm波控制直流電機進行調速是一定需要電機驅動嗎?如果沒有電機驅動,單純向電機使能引

9樓:匿名使用者

可以的,使能端輸入pwm是可以的.

你說的沒有電機驅動是啥意思,沒有驅動電路就沒有大電流啊

10樓:匿名使用者

可以,時英鍾電機或者手機震動電機這種超小電機就可以。

11樓:匿名使用者

你好!不能直接輸入驅動的

12樓:匿名使用者

單純從你的

抄問題上來講,應給回答:不能!因為你說的是微控制器直接驅動電機,大多數情況下的電機,靠微控制器是不能驅動的。

but!!!你可以用pwm功放,直接放大pwm訊號。t寶上有的是,同等電路強度(多少a)的**是帶功放的電機驅動板的幾分之一。這類pwm功放不能控制電機正反轉。

51微控制器怎樣輸出5v的pwm波,為什麼我輸出的pwm波是0~4v呢

13樓:帖學岺汝棋

用定時器t1/t2的工作方式2吧(我也忘記了,就是能自動重灌初始值的那個),在定時器程式裡,讓一個i/o口取反輸出(例如sbit

s=p1^0;s=~s;)通過改變定時時常就可以了

14樓:匿名使用者

首先,電源達5v。其次是你是否在io口接有負載,當有負載時會拉低io口的電壓,io口的高電平驅動能力只有幾百微安,低電平驅動能力最強的微控制器能達到20毫安,所以造成低電平能有0v,高電平卻達不到5v

15樓:匿名使用者

輸出要求5v,那就要佔空比100%,這是不可能的,pwm做到90%都差不多了

16樓:匿名使用者

你指什麼是4v?如果你用萬用表量,只有佔空比100%的才是5v,80%的會使4v。

51微控制器pwm直流電機怎麼實現調速和正反轉?

17樓:

如果要正反轉控制,驅動電路做個全橋的,控制佔空比。50%的話就停止了!

18樓:匿名使用者

調速 就 是調節脈衝的佔空比

//4級速度可調:0、1、2、3; 對應占空比:0、1/4、2/4、3/4

#include

sbit key=p3^6;

sbit motor=p2^4;

unsigned char key_scan(void);

void motor_set(unsigned char v) ;

void motor_init(void);

unsigned char pwm_h=0,n=0,i=0;

void main() }

}//電機轉動

void motor_run() interrupt 3//速度控制,4級速度可調:0、1、2、3; 對應占空比:0、1/4、2/4、3/4

void motor_set(unsigned char v)}//電機初始化

void motor_init(void)//掃描按鍵

unsigned char key_scan(void)} }

while(key==0);

return 1;}

51微控制器是如何產生pwm波的?

19樓:匿名使用者

主要通bai過一個定時器和一個io口來實現dupwm的輸zhi出。

在一個週期裡

dao面,首先讓io口輸出高電版平,並定時一定的時間然後再權將io口輸出低電平,定時一定的時間。

然後在while裡面迴圈輸出即可。

需要改變佔空比的話就改變高電平的時間與低電平的時間比。

20樓:鈍角111度

設定相應程式,控制相應頻率,輸出高低電平來控制開關管。調製輸出pwm波。

21樓:匿名使用者

可以用匯編指令nop來完成頻率設定。

計算好頻率後直接用io口輸出就可以了

22樓:匿名使用者

程式控制中斷和定時器來實現。

微控制器如何用PWM來測出方波頻率

上賊船莫怕死 脈寬調製 pwm 基本原理 控制方式就是對逆變電路開關器件的通斷進行控制,使輸出端得到一系列幅值相等的脈衝,用這些脈衝來代替正弦波或所需要的波形。也就是在輸出波形的半個週期中產生多個脈衝,使各脈衝的等值電壓為正弦波形,所獲得的輸出平滑且低次諧波少。按一定的規則對各脈衝的寬度進行調製,即...

如何用51微控制器控制舵機的??微控制器程式是怎麼寫的?希望你也能給我發編寫程式和電路圖

微控制器系統實現對舵機輸出轉角的控制,必須首先完成兩項任務 首先,產生基本的pwm週期訊號,即產生20ms的週期訊號 其次,調整脈寬,即微控制器調節pwm訊號的占空比。微控制器能使pwm訊號的脈衝寬度實現微秒級的變化,從而提高舵機的轉角精度。微控制器完成控制演算法,再將pwm訊號輸出到舵機。發乙個自...

微控制器中,如何使用計時器1來產生PWM波形。主要是和計時器

如果是用51微控制器 標頭檔案 include typedef unsigned char uint8 typedef unsigned int uint16 typedef long unsigned int uint32 uint16 time0 uint16 pulse width 0x300...