树莓派模拟电路_9.树莓派3B+ PWM操作
前面的兩篇樹莓派的GPIO端口的輸入和輸出都實驗了。實驗使用的是樹莓派的硬件PWM,關于rpio庫的一些函數的使用、樹莓派寄存器的介紹、Node.js的語法這里并不會介紹,需要你具備相關的基礎知識。在操作樹莓派的PWM之前,先看看什么是PWM。
1.什么是PWM
脈沖寬度調制(PWM)是一種模擬控制方式,根據相應載荷的變化來調制晶體管基極或MOS管柵極的偏置,來實現晶體管或MOS管導通時間的改變,從而實現開關穩壓電源輸出的改變。這種方式能使電源的輸出電壓在工作條件變化時保持恒定,是利用微處理器的數字信號對模擬電路進行控制的一種非常有效的技術。脈沖寬度調制是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通信到功率控制與變換的許多領域中。脈沖寬度調制(PWM)是一種對模擬信號電平進行數字編碼的方法。通過高分辨率計數器的使用,方波的占空比被調制用來對一個具體模擬信號的電平進行編碼。PWM信號仍然是數字的,因為在給定的任何時刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復脈沖序列被加到模擬負載上去的。--- 來源 百度百科-PWM
在PWM中還有一個重要的概念是占空比。
2.什么是占空比
占空比是指在一個脈沖循環內,通電時間相對于總時間所占的比例。占空比(Duty Ratio)在電信領域中有如下含義:例如:脈沖寬度1μs,信號周期4μs的脈沖序列占空比為0.25。--- 來源 百度百科-PWM
在俗語中有句話:「三天打漁,兩天曬網」,是說一共三天,有一天是打漁,兩天是曬漁網。打漁的占空比為1/3。
通過這個圖就可以看出占空比:
實際上也就是高電平所占的比例。
3.樹莓派的PWM
樹莓派的PWM實際是樹莓派CPU自帶的硬件PWM。當然也有軟件PWM,在知道上面的兩個基本概念后,用軟件模擬實際也很簡單了。
PWM
Pulse Width Modulation (PWM) allows you to create analog output from the digital pins. This can be used, for example, to make an LED appear to pulse rather than be fully off or on.
The Broadcom chipset supports hardware PWM, i.e. you configure it with the appropriate values and it will generate the required pulse. This is much more efficient and accurate than emulating it in software (by setting pins high and low at particular times), but you are limited to only certain pins supporting hardware PWM:
26-pin models: pin 12
40-pin models: pins 12, 32, 33, 35
Hardware PWM also requires gpiomem: false and root privileges. .open() will call .init() with the appropriate values if you do not explicitly call it yourself.
To enable a PIN for PWM, use the rpio.PWM argument to open():
rpio.open(12, rpio.PWM); /* Use pin 12 */
Set the PWM refresh rate with pwmSetClockDivider(). This is a power-of-two divisor of the base 19.2MHz rate, with a maximum value of 4096 (4.6875kHz).
rpio.pwmSetClockDivider(64); ? ?/* Set PWM refresh rate to 300kHz */
Set the PWM range for a pin with pwmSetRange(). This determines the maximum pulse width.
rpio.pwmSetRange(12, 1024);
Finally, set the PWM width for a pin with pwmSetData().
rpio.pwmSetData(12, 512);
這是rpio庫中介紹的PWM,注意事項和相關操作函數。大致說來就是如下幾個:
1.樹莓派的CPU是支持硬件PWM的;
1.對于有26個排針管腳的樹莓派,第12引腳是硬件PWM管腳;
2.對于有40個排針管腳的樹莓派,第12、32、33、35引腳是硬件PWM管腳;
3.使用硬件PWM需要gpiomem: false
4.操作硬件PWM需要gpiomem: false 需要調用init()函數,且權限是在root用戶下;
5.rpio.pwmSetClockDivider(),是設置PWM時鐘分頻器的,數值從0開始,最大是4096,且必須是2的冪;
6.rpio.pwmSetRange(pin, 1024),是設置PWM最大脈沖寬度的;
7.rpio.pwmSetData(pin, 512),是設置高電平的寬度的。
4.操作樹莓派的PWM代碼
let rpio = require('rpio');let pwm_pin = 12; // 定義 排針的第12引腳為PWM輸出引腳 接LED正極let clockdiv = 64; // PWM時鐘分頻器 64 分頻let pwm_range = 10;// pwm初始化function pwmInit() { rpio.init({gpiomem: false}); /* Use /dev/mem for i2c/PWM/SPI */ rpio.open(pwm_pin, rpio.PWM); // 設置低12引腳為PWM功能引腳 rpio.pwmSetClockDivider(clockdiv); // 時鐘64分頻 rpio.pwmSetRange(pwm_pin, pwm_range);// 設置PWM輸出頻率 19.2 * 1000000 / 64 / 10 = 30KHz}let direction = 1;let data = 0;// PWM效果function pwmFunc(){ rpio.pwmSetData(pwm_pin, data); let interval = setInterval(function(){ if (direction === 1) { data ++; if (data >= pwm_range) { // 達到最大值換方向 direction = 0 data = pwm_range; } } else { data --; if (data <= 0) { // 達到最小值換方向 direction = 1 data = 0; } } rpio.pwmSetData(pwm_pin, data); },20) // 每20ms執行一次這個定時器}function main(){ pwmInit(); pwmFunc();}main();從上到下依次是:
1.第1行是引入rpio的包;
2.第3到第5行是定義基本變量,第12引腳,分頻器和最大脈沖寬度;
3.第8行開始的pwmInit()函數是初始化樹莓派的PWM;
4.第14和15行分別是定義基本的數值data加減方向和data的初始值;
5.第17行的pwmFunc()是實際實驗現象需要的操作方法;
6.最后的main()函數就好理解了,搞過C的同學都知道這個了。
這里有個最值得注意的就是關于PWM輸出頻率的設置問題,實際在rpio這個庫中只說了基礎時鐘頻率19.2MHZ,分頻器的最大設置是4096(此時最小時鐘頻率是4.6875kHz)。但是如果需要輸出1kHZ的頻率就沒法設置了。但是在這個庫的https://github.com/jperkin/node-rpio/issues/2#issuecomment-95536772,這里給出了實驗代碼、現象和計算公式:
jurafa commented on 23 Apr 2015
This is my code. I measure data on UniPi board and its Analog output. I will try to meassure it directly on pin. Raspberry Pi Details: Type: Model B+, Revision: 1.2 var rpio = require('rpio');var pin = 18;var range = 1024;var clockdiv = 2048;rpio.setFunction(pin, rpio.PWM); rpio.pwmSetClockDivider(clockdiv); rpio.pwmSetRange(pin, range);var data = 500; rpio.pwmSetData(pin, data);} |
jurafa commented on 23 Apr 2015
jperkin commented on 23 Apr 2015
Looks pretty accurate to me?
That's not exactly 9.149Hz as reported by your oscilloscope, but I'd guess that's either just rounding errors, or caused by your data value of 500 creating an uneven pulse - maybe changing it to 512 and a regular pulse will make it show 9.155? Either way, I still don't see a bug here, though I will happily admit to being far from an expert in this field. |
這一下有圖有真相了,我沒有示波器,如果有示波器的同學可以自己測試一下,再驗證正確與否。(還是外國友人比較壕,是泰克的示波器)
5.實驗電路圖
引腳對應關系:
序號 | 樹莓派 | LED |
1 | 12引腳 | LED正極 |
2 | 電源負極 | LED負極 |
6.實驗現象
上面的實驗代碼中,也可以分析出是先由暗到亮再由亮到暗的。剛好實驗現象也是一致的。
7.總結
關于PWM,需要知道什么是PWM和占空比,然后就是在rpio這個庫的基礎上怎么操作樹莓派的PWM和PWM頻率的計算方式。這里所操作的硬件不需要知道芯片的寄存器,都是在庫的基礎上操作。再回頭看以前讀書階段玩過的單片機,其實也都是這些操作。
總結
以上是生活随笔為你收集整理的树莓派模拟电路_9.树莓派3B+ PWM操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python函数分为_python 函数
- 下一篇: hadoop job 未跑满资源_map