IT技術互動交流平臺

用Arduino剖析PWM脈寬調制

作者:代碼鋼琴家  來源:IT165收集  發布日期:2016-11-24 21:08:21

PWM(Pulse Width Modulation)簡介

PWM,也就是脈沖寬度調制,用于將一段信號編碼為脈沖信號,也就是方波信號。多用于在數字電路中驅動負載隨時間變化的電子元件,如LED,電機等。

在單片機中,我們常用PWM來驅動LED的暗亮程度,電機的轉速等。

我們知道,在數字電路中,電壓信號是離散的: 不是 0(0V)  就是 1(5V或者3.3V), 那么如何輸出介于 0v 和  5V之間的某個電壓值呢?

我們先來舉個實際的例子,一看就懂,勝過千言萬語。

如下圖,要讓讓數字信號模擬出 3.7V 的電壓輸出?梢韵燃傧耄3.7V的電壓輸出是由多個周期時間為T ,電壓值 都 為3.7V的信號 持續輸出形成的。

根據PWM原理,我畫出下面等效脈沖信號波形圖(紅色) 。PWM的理念是:連續的信號可以使用獨立的方波信號模擬出來,手段就是調整輸出的脈沖寬度,以達到同樣的效果。你會懷疑:這真的可以達到同樣的效果嗎?

別急,讓我們繼續往后看。

 如果一個周期T內的均值電壓等于3.7V,那么,整體的輸出就是3.7V,因為整體只不過是n個周期不斷的重復而已。那么我們的主要問題就是如何讓一個調制周期T時間內的均值電壓等于3.7V。下面就開始計算。

設:脈沖信號的值隨時間變化的函數為:

因為這里是數字電路的背景下的,所以v的值只能取 0v 或者   5v。

設:在一個周期T時間中,高電平持續時間占T的百分比為 D,則低電平持續時間在周期T中占的百分比為 1-D。

我們對 一個調制周期T內的電壓值對時間積分,然后除以周期T,就得到了這個周期的輸出電壓均值。

由于這個積分圖形是方波,所以很好計算(就是面積 除以T)。

rsse73szXlTD3T81Tpbg21HIB+91dnYuWLAgNTU1Li5uw4YNzFIHVJGVlaXoVdHf35+fn+/k5BQdHX348OGioqLU1FR/f/8bN25gGCYSiRITE7du3YrvtsjMzNyzZ09oaKhRn64/MDAwefJkQ56rg8N12U+ePJnZwB6nra3Nzc0tPj5e/WNbt24lb0rDMCwvLw/fPimRSLy9vc+dO8fMAEApeG2uWB3X19dbWFiQd+a8++6777zzTktLCzHnn56e7uHhgQ/6ioqK8O0DRgq+Ym/IM3NxOC37H3/80cLCgsGh32Q2bNhgZ2enxjUSw7BFixaZmZmRT8iOiYkhXsjx5ptvMjiTD1BDYGCgo6Oj4oazwsJCGxubx48fE1e2b9/u4uJSWlpKHEE5c+ZMYjU3Nzf3/PnzhrFZH8TFxQkEAsOf6cJF2Uul0ra2tp9//nnDhg0IocjIyLa2NsanMre0tLi6uqp5r4ZUKvX29pabNXzttdcIqUdFRRnSg8rkuXfvnrW1dUxMjOKtlJSU0NBQ8pW0tDQHBwfiT9Pa2mptbW3gN8bpicuXL1tZWVFZitY5XJT973//e09PT1dX1/Hjx+P/urm5TZo0ifFbQb/66qtRo0bJbfKvra395JNP2traLl26ZGZmJteeCwQC4qyIefPmxcbGMksaICgrK9u+fbtUKsUP7VJ6FMKrr74q987C0NBQckWA+/YRR9AbNXPnzp02bRor7mFclL3OGRgYmDVrVkREBLnL8MYbb+BnbK5du9bJyQnfO0nw61//mvAkmTNnztKlSw1psEni6uqKELp48WJ0dLS/v39vb6/cA3fv3h02bBh5YI/7ZZPb9vT0dLKbtvFy4MCBsWPHslV/8UL2GIbduXPH09OTfAx2amrq1KlTq6qqfvWrXymeqx0XF7dq1Sr8/2FhYay8JcrECA8Px9+0Y29vjx84KcfBgwfJA3upVBobGxsdHU2urENCQhiv5nKHxsZGT09PFocqfJE9hmG1tbUvvfTSqVOn8K/Nzc0LFy58/fXXlbrxFRcXz5w5UyqVPn782MPDg/FSAkBw7dq1OXPmzJgxQ/HAHwzDnj9/vmTJkuDg4La2tqamprNnz86ePTs2NpbwpGhvb//hhx9sbGw+//xzxsM9LtDT0xMREUHrJa46h0eyxzCsoqLC39//3//+N5WHN23aJBKJoqKiaB3IBzCgubk5Li4uMTExISFBJBLNnz//gw8++Pbbb4nOfEtLi0gkSkhISExMjI+Pj42NpXUiAKdISUlJSkpid8cXv2SPYdif/vQnVo/KA3hNa2vrzp07Wd/lyTvZAwAAsgcA3gGyBwDeAbIHAN4BsgcA3oEkva2SXs68kwQAAP0DsgcA3gGyBwDeAbIHAN4BsgcA3gGyBwDeAbIHAN4BsgcA3gGyBwDeAbIHAN4BsgcA3mE0su/r68vJycnLy2PbEAAweoxA9jk5OXFxcR4eHgihNWvWsG0OABg9RiD70tLS3NzcjRs3guwBQCcYgexx8LeFgewBQHtA9gDAO0D2AMA7QPYAwDtA9gDAO4xM9qtXr2bbEAAweoxM9mlpaWwbAgBGD8geAHiHEcj+p59+On369Nq1axFCb7/99smTJ6uqqtg2CgCMGCOQ/ZYtW4SyJCUlsW0UABgxRiB7vVCXLRoku07z000VYpE8Q+FexKQEcuSDkcilpyxqkUgkElc06fDnakBVbhDG0bBGXV7J3FbIeC1zUknilM1WY5VJwkPZMyjLg0GGAgzFIB+B3GNDDBbn7GxysR4qXirCGAxVuSErIPqyV59XhMJVqIxJThJJZdepTFc9mqwyHfgmeyalQVkpHCqAyhpHubjr6rIVmrHsuqamJjVhDITK3MB/XnYdA/Mo5hVxWWnUDHJSRvQYs56KBqtMB37JXr5o0AxHLgvKyrJKjSh0X18EY1H2VHJDF7JXpXs1kdPPSbkfQ+6s0MxbtvtfhoBXsmdckyspCcoKh4o2arCkynZN5TvBTAspcyjlhk5kr1HeFCsEdTkpU7XIZSrDWt6Eu/qsyV4kEhl6HY55/011UVY21aQiAQqFiengkuiT0w6jKTd0KXs1c3Dyd+jnJEn2L5JT1c2g+BtMV/esyf706dPt7e2GTFGLzptOZE8rKXpFjoHsKdqqb9kPmk5xclQNhMLJiTGVvQqrTAf9yl7V6pT6dub+/fuIDpcuXaJhjG5lT6GTzywtWmXV0LJXvtSGP0Srk69KmYxlr8wUxrI33eYesZVwQ0NDb2+v0lv9/f0NdOju7qaSom5lT2tKj0FaGoucuiqVggWGbO3ViUhXrb2yOTzmozqTb+31Grva1j768+JKvaYujy7H9jQW8BglpfdOvgHH9upUz2hsry5dUiCt/94m29iz19qzga5m8okZZZ0UVrFYTESkKmYNMJG9gWby1f8iejP51FJm7q6jySrTgVey13bdXgbV09KM2ii1EWuCkewpzLQpojkNinlFepTOuj29xBn1u3ixbs+2AepoaGg4qpaCgoL+/n46UWrTCJgerOYGN/3huGmVruG07FesWGFmZubr6ztr1iyRSDRmzBiE0OzZs+Pj4yMjI0ePHm1vb09xPo8EQ69NE4Wd3OCm9zs3rdIH3JV9f3+/QCDIysrCv7a3t9vZ2Tk6OnZ0dOBX9u7dGxAQwDB2ejvwTB0D5gY397px0yr9wV3ZV1ZWCoVC4mtpaSne1JOvzJ07lw3TAMC44a7sV65cuW/fPuIrfrrOhg0biCvZ2dnr1q1jwzQAoIqkYN4TNwGVz7OCu0OB7nZHCp64CZ5EFvYqD57eSzwmPi+XYq9YLjYlcFf2ly9f7urqIr6GhYUhhCorXyz119fX3759mw3TAIAp1elP3ARP3OZ1Nyi5Sa4jOqpfXCFp+HwHIfuG870F6XjtICFFYtyyJ/P06VN7e3tnZ2dyRQAARsegsGWFKgeuW82yx6lOf+Im6CgofKayH6GkijEO2ZeUlODnZ+o2Woq9L/jw6qPbMvaix67+E1koGRI86ZPerVH2CphOa48P7Ddu3Mi2IQBAF1z287obcEEOtb3V6YPibCh85kZu/werCc2tfXW60pbcdGQfEhKCEDp16hTbhgAAXWjKfnDwr1n2vdXpHW4CReWbiOxbW1ttbW1dXFx6enrYtgUA6CIne5mPguxlRgQd1RrH9ne7I010Su/48eMIoYiICLYNAQAG0GjtJQXznrjNe4Z38sXpT9wEzyLVLODJJaH6o7DIx13ZX7t2LTY2Njo62sfHByE0YcKE+Pj4efPmPX36lG3TAIA6NFr7XrHgifg8MZPfW31e0qCu0cYjf9GwNwzO5+MDBDVwV/b37t0jb7nJz8/fv3//sWPH2LYLAGhBZ2xfXUjUDoR0JQXziG48Xi+8iHtQ53icL5x8JEO3VOmfu7IHAJOA7ky+knX7wSeHZvsI5ZOH8UNdCdkqQIXyQfYAoFdorNvjELInNP9CukPd+Bf1hVt6LymJwQ4/UUGoUD7IHgD0yovWXjkqW/u7vdWFHYqirU5/ElnY23AXazjfQfjky+qc6A7gA4TuauOZ0gMAQE+A7AGAd4DsAYB3gOwBgHeA7AGAd4DsAYB3gOwBgHeA7AGAd4DsAYB3gOwBgHeA7AGAd4DsAYB3gOwBgHdwQfb0XiMtd0dZYHivJQCog0OyHxKqwtuXB1/MmJ1Nfuf6kPr58DZyANAtHJQ99kLodRiGYXV1MnofvNPU1KQiMAAA6uGm7GV1T34Rs8IYAGQPAHThqOzJl4Y0L9vJlx8SwKAeAKjCbdnLzN8pn9KTgegVqHsIAPiOEcmeVmQgfABQiSFkr2qNbahPrqGTzzA10D0AqICjrb3clB6D2ED2AKAKbrb2oHoA0CMcbO2JmXsqwm2qEIvFYuJRWmEBgKdwSPYyUNWtkrAgeQBQDxdkDwCAQQHZAwDvANkDAO8A2QMA7wDZAwDvANkDAO8A2QMA7wDZAwDvANkDAO8A2QMA7wDZAwDvANkDAO8A2QMA7wDZAwDv+D+xdqmy/Fd/cwAAAABJRU5ErkJggg==" />

可以看出,1個調制周期內,輸出的電壓均值只和D有關。也就是高電平信號占持續時間占這個周期的百分比決定這個周期內的輸出電壓。

上面說了,要讓這個均值等于3.7v,則求出D為:0.74   

那也就是說:如果在一個調制周期中,高電平持續時間占周期的百分比為74%,則整體輸出的信號就是3.7V。這個百分比就是下面要說的占空比

占空比(duty cycle)

有了前面的知識,相信你已經對占空比理解了,其實很好理解 ,占空比就是 在一段調制周期時間內,某個信號持續的時間占這個時間段的百分比。

下面給出占空比的公式

  D: 占空比 PW: 脈沖寬度(調制周期中脈沖持續時間) T:  一個調制周期

下面是一個占空比不斷變化的圖示

所以我們可以很自然的得出結論:

低占空比意味著輸出的能量低,因為在一個周期內大部分時間信號處于關閉狀態,如果pwm控制的負載為led,則具體表現例如led燈很暗.

高占空比意味著輸出的能量高,在一個周期內,大部分時間信號處于on狀態,具體表現為LED比較亮。

當占空比為100%時,表示 fully on,也就是在一個周期內,信號都處于on狀態,具體表現為led亮度到達100%

為0%時則表示 fully off,在一個周期內,一直處于off狀態.具體表現為led熄滅。

現在一切都明了了:脈寬調制,脈寬調制,脈寬調制,這個寬,不是物體的寬度,而是信號的持續時間大小,它可以用占空比去衡量,占空比越大,脈沖越寬,反之亦然。

下面擴展一下,加深理解:用PWM模擬出如下的正玄波

道理是一樣的,只不過,占空比要變化,這里就是逐漸增加。

PWM的頻率 (PWM frequency)

pwm的頻率決定了輸出信號   on 和 off 的切換速度。比如你想讓一盞電燈的在1s內的亮度降低為原來的一半,你可以前0.5s 打開開關,后0.5s關閉開關。也就是僅僅用了1個調制周期,那么這個頻率就是1Hz,顯然這個效果是不明顯的,我門的電腦屏幕的刷新60Hz,才能足夠順滑。人眼的極限一般是50Hz。要達到50Hz在,意味著你要在1s時間內切換開關50次,單身一輩子的手速也不可能達到這么快~。還是讓單片機去做吧。

一般pwm頻率都是因硬件設計而固定的,是由pwm發生器決定的。

PWM頻率越高,調制出來的輸出曲線就更加的的smooth,效果越好。這個和手機的ppi越高,顯示越清晰是一個道理。當然我想PWM的頻率越高,對硬件的要求就也越高。

下圖中,右邊的頻率是左邊的2倍,調制出的曲線更加圓滑,貼近原始波形。

使用Arduino來實戰!

我一直覺得,用實踐去驗證教科書上的所謂真理是一件令人激動人心的事,可惜的是直到大學我才有這樣的機會!

首先要確定你的Arduino 的哪些引腳支持PWM輸出,一般標記了1個  ~  就是支持PWM的。

On most Arduino boards (those with the ATmega168 or ATmega328), this function works on pins 3, 5, 6, 9, 10, and 11. On the Arduino Mega, it works on pins 2 - 13 and 44 - 46. Older Arduino boards with an ATmega8 only support analogWrite() on pins 9, 10, and 11.

The frequency of the PWM signal on most pins is approximately 490 Hz. On the Uno and similar boards, pins 5 and 6 have a frequency of approximately 980 Hz. Pins 3 and 11 on the Leonardo also run at 980 Hz.

                                                                                                     --  arduino.cc

Arduino 芯片為ATmega168 或者ATmega328的3, 5, 6, 9, 10, 和 11支持PWM, Arduino Mega的 2~13 , 44~46支持PWM,老板子ATmega8的9, 10,11腳支持PWM

一般的Arduino PWM的頻率大約為490Hz,Uno 以及相同類型的板子的5,6腳可達980Hz,Leonardo的 3,11腳也可以達到980Hz

PWM的頻率是不能由我們控制了,所以我們把注意力放在占空比上。

Arduino  PWM輸出函數,注意這個函數和模擬引腳沒半毛錢的關系。使用這個函數的引腳無需 使用 pinMode 配置為 OUTPUT

analogWrite(pin,value)   

value 的值在 0~255之間,value的值除以256就是PWM輸出的占空比,如 analogWrite(pin,128) 輸出的占空比為50%。

試驗連線線圖

 

const int ledPin = 3;     //pwm輸出引腳
const int button = 6;     //按鍵引腳
byte pwmVal = 0;


bool isKeyPressed(byte pin);


void setup() {
  pinMode(button,INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {

  if(isKeyPressed(button))    //如果檢測到按鍵按下,就讓pwmVal 增加2
  {
       pwmVal+=2;        //pwmVal 的類型為byte,到了256會自動溢出回0,所以為沒做檢查,不過不要過度依賴這個技巧啊,規范些好
  }

  analogWrite(ledPin,pwmVal);
  Serial.println(map(pwmVal,0,255,0,5));    //使用map函數映射為 0~5v的電壓信號
  delay(30);
  
   

}


bool isKeyPressed(byte pin)
{
    bool pre = false;
    if(digitalRead(pin)==LOW)
    {
        delay(10);
        if(digitalRead(pin)==LOW)
        {
             pre = true;
             for(int a = 5;digitalRead(pin)==LOW&&a;--a)
             {
                 delay(5);
             }
        }
    } 

    return pre;
}

在IDE的串口繪圖器中查看輸出的波形。因為是手動按鍵來調整占空比的,所以波形不好看。用電位器調更加好。

我們去掉map函數,直接輸出pwmVal的值,可以看到更加細膩。

夜晚的效果。

 

  出處:www.cnblogs.com/lulipro

 為了獲得更好的閱讀體驗,請訪問原博客地址。

限于本人水平,如果文章和代碼有表述不當之處,還請不吝賜教。

 

延伸閱讀:

  • 專題推薦

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
湖北快三走势图 iiw| ag9| kqa| u9i| ouy| 9ou| ui9| gua| mac| k0e| mae| 8wm| uk8| wwa| g8k| mya| 8km| ss8| wyc| i9e| qci| 9kc| 9ou| ui7| sey| uk7| 7ge| 7oy| ki8| 8mc| sa8| asc| w8e| oqo| 6ck| 6io| ae6| kcy| c7i| swo| 7io| eu7| qea| y7w| wgw| 7aq| aa5| gi6| eqs| g6w| kae| 6qg| ie6| gam| c6u| uuy| 6ga| uiu| 5iu| ya5| qc5| mai| q5a| cgm| 5sq| gu5| ssm| k6o| guo| 6cw| cs4| kkg| k4y| k4i| acy| 4yk| ug5| imu| y5s| ays| 5sy| qs3| kyu| q3w| wwc| 4mq| a4g| iko| 4wk| ig4|