單片機中PWM的原理與控制程序

2021-01-18 單片機與嵌入式

PWM 在單片機中的應用是非常廣泛的,它的基本原理很簡單,但往往應用於不同場合上意義也不完全一樣,這裡我先把基本概念和基本原理給大家介紹一下,後邊遇到用的時候起碼知道是個什麼東西。

PWM 是 Pulse Width Modulation 的縮寫,它的中文名字是脈衝寬度調製,一種說法是它利用微處理器的數字輸出來對模擬電路進行控制的一種有效的技術,其實就是使用數位訊號達到一個模擬信號的效果。這是個什麼概念呢?我們一步步來介紹。

首先從它的名字來看,脈衝寬度調製,就是改變脈衝寬度來實現不同的效果。我們先來看三組不同的脈衝信號,如圖 10-1 所示。


圖 10-1  PWM 波形


這是一個周期是 10ms,即頻率是 100Hz 的波形,但是每個周期內,高低電平脈衝寬度各不相同,這就是 PWM 的本質。在這裡大家要記住一個概念,叫做「佔空比」。佔空比是指高電平的時間佔整個周期的比例。比如第一部分波形的佔空比是 40%,第二部分波形佔空比是 60%,第三部分波形佔空比是 80%,這就是 PWM 的解釋。
那為何它能對模擬電路進行控制呢?大家想一想,我們數字電路裡,只有 0 和 1 兩種狀態,比如我們第 2 章學會的點亮 LED 小燈那個程序,當我們寫一個 LED = 0;小燈就會長亮,當我們寫一個 LED = 1;小燈就會滅掉。當我們讓小燈亮和滅間隔運行的時候,小燈是閃爍。

如果我們把這個間隔不斷的減小,減小到我們的肉眼分辨不出來,也就是 100Hz 以上的頻率,這個時候小燈表現出來的現象就是既保持亮的狀態,但亮度又沒有 LED = 0;時的亮度高。那我們不斷改變時間參數,讓 LED = 0;的時間大於或者小於 LED = 1;的時間,會發現亮度都不一樣,這就是模擬電路的感覺了,不再是純粹的 0 和 1,還有亮度不斷變化。大家會發現,如果我們用 100Hz 的信號,如圖 10-1 所示,假如高電平熄滅小燈,低電平點亮小燈的話,第一部分波形熄滅 4ms,點亮 6ms,亮度最高,第二部分熄滅 6ms,點亮 4ms,亮度次之,第三部分熄滅 8ms,點亮 2ms,亮度最低。那麼用程序驗證一下我們的理論,我們用定時器T0 定時改變 P0.0 的輸出來實現 PWM,與純定時不同的是,這裡我們每周期內都要重載兩次定時器初值,即用兩個不同的初值來控制高低電平的不同持續時間。為了使亮度的變化更加明顯,程序中使用的佔空比差距更大。

#include <reg52.h>

sbit PWMOUT = P0^0;

sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;


unsigned char HighRH = 0;

unsigned char HighRL = 0;

unsigned char LowRH = 0;

unsigned char LowRL = 0;


void ConfigPWM(unsigned int fr, unsigned char dc);

void ClosePWM();


void main(){

unsigned int i;

EA = 1;

ENLED = 0;

ADDR3 = 1;

ADDR2 = 1;

ADDR1 = 1;

ADDR0 = 0;


while (1){

ConfigPWM(100, 10);

for (i=0; i<40000; i++);

ClosePWM();

ConfigPWM(100, 40);

for (i=0; i<40000; i++);

ClosePWM();

ConfigPWM(100, 90);

for (i=0; i<40000; i++);

ClosePWM();

for (i=0; i<40000; i++);

}

}

void ConfigPWM(unsigned int fr, unsigned char dc){

unsigned int high, low;

unsigned long tmp;


tmp = (11059200/12) / fr;

high = (tmp*dc) / 100;

low = tmp - high;

high = 65536 - high + 12;

low = 65536 - low + 12;


HighRH = (unsigned char)(high>>8);

HighRL = (unsigned char)high;

LowRH = (unsigned char)(low>>8);

LowRL = (unsigned char)low;


TMOD &= 0xF0;

TMOD |= 0x01;

TH0 = HighRH;

TL0 = HighRL;

ET0 = 1;

TR0 = 1;

PWMOUT = 1;

}

void ClosePWM(){

TR0 = 0;

ET0 = 0;

PWMOUT = 1;

}

void InterruptTimer0() interrupt 1{

if (PWMOUT == 1){

TH0 = LowRH;

TL0 = LowRL;

PWMOUT = 0;

}else{

TH0 = HighRH;

TL0 = HighRL;

PWMOUT = 1;

}

}

需要提醒大家的是,由於標準 51 單片機中沒有專門的 PWM 模塊,所以我們用定時器加中斷的方式來產生 PWM,而現在有很多的單片機都會集成硬體的 PWM 模塊,這種情況下需要我們做的就僅僅是計算一下周期計數值和佔空比計數值然後配置到相關的 SFR 中即可,既使程序得到了簡化又確保了 PWM 的輸出品質(因為消除了中斷延時的影響)。

大家編譯下載程序後,會發現小燈從最亮到滅一共 4 個亮度等級。如果我們讓亮度等級更多,並且讓亮度等級連續起來,會產生一個小燈漸變的效果,與呼吸有點類似,所以我們習慣上稱之為呼吸燈,程序代碼如下,這個程序用了 2 個定時器 2 個中斷,這是我們第一次這樣用,大家可以學習一下。我們來試試這個程序,試完了大家一定要能自己把程序寫出來,切記。

純文本複製

#include <reg52.h>

sbit PWMOUT = P0^0;

sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;


unsigned long PeriodCnt = 0;

unsigned char HighRH = 0;

unsigned char HighRL = 0;

unsigned char LowRH = 0;

unsigned char LowRL = 0;

unsigned char T1RH = 0;

unsigned char T1RL = 0;


void ConfigTimer1(unsigned int ms);

void ConfigPWM(unsigned int fr, unsigned char dc);


void main(){

EA = 1;

ENLED = 0;

ADDR3 = 1;

ADDR2 = 1;

ADDR1 = 1;

ADDR0 = 0;


ConfigPWM(100, 10);

ConfigTimer1(50);

while (1);

}

void ConfigTimer1(unsigned int ms){

unsigned long tmp;

tmp = 11059200 / 12;

tmp = (tmp * ms) / 1000;

tmp = 65536 - tmp;

tmp = tmp + 12;

T1RH = (unsigned char)(tmp>>8);

T1RL = (unsigned char)tmp;

TMOD &= 0x0F;

TMOD |= 0x10;

TH1 = T1RH;

TL1 = T1RL;

ET1 = 1;

TR1 = 1;

}

void ConfigPWM(unsigned int fr, unsigned char dc){

unsigned int high, low;

PeriodCnt = (11059200/12) / fr;

high = (PeriodCnt*dc) / 100;

low = PeriodCnt - high;

high = 65536 - high + 12;

low = 65536 - low + 12;

HighRH = (unsigned char)(high>>8);

HighRL = (unsigned char)high;

LowRH = (unsigned char)(low>>8);

LowRL = (unsigned char)low;


TMOD &= 0xF0;

TMOD |= 0x01;

TH0 = HighRH;

TL0 = HighRL;

ET0 = 1;

TR0 = 1;

PWMOUT = 1;

}

void AdjustDutyCycle(unsigned char dc){

unsigned int high, low;

high = (PeriodCnt*dc) / 100;

low = PeriodCnt - high;

high = 65536 - high + 12;

low = 65536 - low + 12;


HighRH = (unsigned char)(high>>8);

HighRL = (unsigned char)high;

LowRH = (unsigned char)(low>>8);

LowRL = (unsigned char)low;

}

void InterruptTimer0() interrupt 1{

if (PWMOUT == 1){

TH0 = LowRH;

TL0 = LowRL;

PWMOUT = 0;

}else{

TH0 = HighRH;

TL0 = HighRL;

PWMOUT = 1;

}

}

void InterruptTimer1() interrupt 3{

static bit dir = 0;

static unsigned char index = 0;

unsigned char code table[13] = {

5, 18, 30, 41, 51, 60, 68, 75, 81, 86, 90, 93, 95

};


TH1 = T1RH;

TL1 = T1RL;

AdjustDutyCycle(table[index]);

if (dir == 0){

index++;

if (index >= 12){

dir = 1;

}

}else{

index--;

if (index == 0){

dir = 0;

}

}

}

本文轉自網絡,版權歸原作者,如果您覺得不好,請聯繫我們刪除!

廣告

關於立創商城

立創商城(WWW.SZLCSC.COM)成立於2011年,致力於為客戶提供一站式電子元器件線上採購服務,4小時閃電發貨。擁有10000多平方米現代化元器件倉庫,現貨庫存超160000種,集團電子全產業鏈自營服務涵蓋:在線EDA(LCEDA)+行業領先的PCB打樣/中小批量+元器件商城+鋼網製造+SMT貼片+電子設計教育及方案。作為一家品種齊全、自營庫存、質量有保障的電子元器件垂直商城,立創商城所有元器件均從原廠或代理商正規渠道採購,保證原裝正品,為您提供專業的一站式電子元器件採購服務。

相關焦點

  • PWM原理
    導讀:學過單片機的同學,對PWM應該不陌生,一般學習單片機的第二個例程就是用PWM技術調節佔空比來控制LED亮度。然而PWM控制技術在逆變電路中應用最廣,正是有賴於其在逆變電路中的應用,才確定了它在電力電子技術中的重要地位。因此本文主要介紹PWM原理,對電力電子感興趣的同學關注一下吧。。。
  • LED燈的51單片機pwm控制實例
    我們知道 51單片機本身是沒有pwm接口的,這個程序是通過軟體模擬pwm.在一定的頻率的方波中,調整高電平和低電平的佔空比,即可實現LED燈亮度控制
  • 單片機C語言編程實現對舵機控制
    在智能小車編程過程中,舵機是實現小車避障、循跡的基礎。單片機通過控制舵機實現小車的轉向。本文主要介紹如何使用51單片機實現對舵機進行偏轉角度控制。所使用舵機型號為MG996R,使用晶片為STC89C52。
  • 基於ATmega8的直流電機PWM調速控制系統設計與實現
    二、直流電機PWM調速原理直流電機轉速表達式為:式中:U—電樞端電壓;I—電樞電流;R—電樞電路總阻;—每極磁通量;K—電機結構參數。對直流電機的轉速控制方法可分為對勵磁磁通進行控制的勵磁控制法和對電樞電壓進行控制的電樞控制方法。
  • 單片機實現按鍵控制原理
    本文介紹通過單片機實現按鍵控制一個LED燈,教大家學習按鍵控制原理。下圖為按鍵連接原理,(PB0-PB3為單片機IO口),每個按鍵輸出端採用上拉電阻,目的是當按鍵斷開時,使單片機輸入埠(PB0-PB3)處於高電平狀態,只有當按鍵按下時才處於低電平。
  • 利用PWM原理,實現呼吸燈功能
    佔空比就是指在一個周期內, 信號處於高電平的時間佔據整個信號周期的百分比, 例如上圖中所示脈衝的佔空比就是25%。PWM波可以由GPIO口產生,通過GPIO口輸出高電平,延時,輸出低電平,延時來產生PWM波。還可以使用定時器,利用比較寄存器形成PWM。本實驗就是利用PWM信號這一特性控制LED產生不同亮度,從而實現呼吸燈的效果。
  • 用51單片機實現pwm專題及常見問題 - CSDN
    基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目一、前言1、基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目包括用Keil軟體編寫單片機C語言程序和用
  • PWM在ARM Linux中的原理和蜂鳴器驅動實例開發
    PWM(脈衝寬度調製)簡單的講是一種變頻技術之一,是靠改變脈衝寬度來控制輸出電壓,通過改變周期來控制其輸出頻率。如果還不是很清楚,好吧,來看看我們實際生活中的例子,我們的電風扇為什麼扭一下按扭,風扇的轉速就會發生變化;調一下收音機的聲音按鈕,聲音的大小就會發生變化;還有待會兒我們要講的蜂鳴器也會根據不同的輸入值而發出不同頻率的叫聲等等!!
  • 基於SHE-PWM控制的DC-AC電源
    Keyword:Selective Harmonic Eliminated-PWM control Bootstrap1 前言:以單片機和DSP為核心組成的控制電路的逆變電源,能實現電源的全數字控制,但系統較複雜,軟體工作量大,研製周期長。
  • PWM控制的基本原理
    PWM控制技術在逆變電路中應用最廣,應用的逆變電路絕大部分是PWM型,PWM控制技術正是有賴於在逆 變電路中的應用,才確定了它在電力電子技術中的重要地位。 理論基礎: 衝量相等而形狀不同的窄脈衝加在具有慣性的環節上時,其效果基本相同。衝量指窄脈衝的面積。
  • 脈寬調製原理- -PWM原理
    趕緊跟隨小編來了解一下脈寬調製原理吧~本文引用地址:http://www.eepw.com.cn/article/278262.htm一、脈寬調製原理- -簡介  脈寬調製技術,全稱為脈衝寬度調製,英文名稱為Pulse Width Modulation,簡寫為PWM,是一種利用微處理器來完成對模擬電路控制的一種技術,其具有操作簡單、靈活性好、反應速度快等諸多特點,現已在通信、測量、功率變換
  • PWM(脈寬調製)——LED特效呼吸燈設計
    ,百度盤群組分享連結更新時間:2016-03-06,失效請在文末留言,不要在後臺留言  簡述PWM  PWM——脈寬調製信號(Pulse Width Modulation),它利用微處理器的數字輸出來實現,是對模擬電路控制的一種非常有效的技術,廣泛應用於測量、通信、功率控制與變化等許多領域。
  • 51單片機PWM的控制
    通過對連接和斷開時間的控制,只要帶寬足夠,可以輸出任意不大於最大電壓值的模擬電壓。輸出電壓=(接通時間/脈衝時間)*最大二、51單片機的Timer作者用的單片機是STC89C52,其內部有3個16位Timer,分別為T/C0,T/C1,T/C2,通過配置相關寄存器即可實現Timer的功能控制
  • 你足夠了解pwm嗎?搞清楚pwm控制技術
    pwm是現代重要技術之一,在各種電子設備中,均存在pwm的身影。在往期文章中,小編對pwm原理、pwm佔空比、pwm頻率均有所介紹。為增進大家對pwm的認識,本文將對pwm控制技術予以闡述。如果你對pwm抑或本文即將介紹的內容具有興趣,不妨繼續往下閱讀哦。
  • 單片機控制的密碼鎖設計(含電路圖及源程序)
    單片機控制的密碼鎖設計。AT89S52單片機P1引腳外接獨立式按鍵S1-S8,分別代表數字鍵0-5、確定鍵、取消鍵。輸出信號的控制主要根據按鍵輸入與密碼的核對情況來決定。整體程序設計思想:程序分為主程序和中斷服務程序兩個主要部分,主程序完成變量和單片機特殊功能寄存器的初始化後,進入一個循環結構。在循環中,首先判斷有無按鍵按下,若有按鍵則判斷是否數字鍵還是功能鍵,根據按鍵的情況執行相應的功能。然後根據密碼是否正確的判斷情況,執行相應的操作。
  • 基於51單片機設計的簡易智慧機器人
    1.2 總體設計方案和框圖本設計以at89c5l單片機作為檢測和控制核心。採用紅外光電傳感器檢測路面黑線及障礙物,使用金屬傳感器檢測路面下金屬鐵片,應用光電碼盤測距,用光敏電阻檢測、判斷車庫位置,利用pwm(脈寬調製)技術動態控制電動機的轉動方向和轉速。通過軟體編程實現機器人行進、繞障、停止的精確控制以及檢測數據的存儲、顯示。
  • 基於雙PWM控制永磁直驅風電變流器的研究
    前者發展時間比較長,技術相對成熟,但存在發電機控制複雜、後期維護工作量大、齒輪箱等部件易出故障、維修不方便等缺點。後者具有控制簡單、風能利用率高、利於電網安全穩定運行等優點,因此,它更能代表未來風電機組的發展方向。永磁直驅風電機組併網變流器在國內的研究還時間不長,本文對永磁直驅風電機組雙pwm控制併網變流器的原理、拓撲結構、控制策略進行了研究,並進行搭建試驗平臺進行了相應的試驗,達到了預定的效果。
  • 單片機通信中的CRC算法原理及程序設計
    報文全部接收正確後,在緩衝區中合併所有的分組,形成一個完整的報文,傳輸給接收端的單片機,這樣就能減少傳輸的時間,提高系統的可靠性。  2 CRC算法的原理  國際電報電話諮詢委員會推薦的CRC—CCITT生成多項式(G(x))有多種,這裡選取約定的生成多項式G(x)=x16+x12+x5+1 來製造CRC校驗的參數表。
  • 【PWM】用於單相電機調速的單片PWM控制技術
    此要求可以在單片機PWM波的計算程序中加以考慮。然而這樣做往往會增加單片機的數據處理工作量,而且僅靠軟體實現上下橋臂開關管的互鎖和死區延遲也不可靠,因此,為保證電路的安全性,建議最好在硬體電路設計上充分考慮並實現此項要求。
  • 通過pwm方式控制電機-L298N-Java版本
    我們知道樹莓派提供一個硬體pwm引腳,可以通過脈衝寬度調製進行控制電機的速度。實際上在精度要求不是非常高的情況下,普通引腳也可以通過軟體模擬來控制電機,實現pwm一樣的功能。IN1;GUIO 02控制IN2;GPIO29控制ENA(A通道使能;通過使能接口接成pwm模式,控制速度)。