Arduino产生PWM的3种方法
??????????????????????????????????? ? ????????Arduino產生PWM的3種方法!
PWM是個啥?
有人翻譯成:脈沖寬度調制
PWM 是用占空比不同的方波,來模擬“模擬輸出”的一種方式。簡而言之就是電腦只會輸出 0 和 1,那么想輸出 0.5 怎么辦呢?于是輸出 01010101….,平均之后的效果就是 0.5 了。
PWM有什么作用?
1.通過簡單的濾波電路,就可以生成真正的模擬輸出量;
2.控制燈光亮度,調節電機轉速;請注意這和 1 不是重復的,因為不需要濾波就可以實現
3.控制舵機角度,這個請參考 Arduino 開發板實驗三:舵機控制
4.輸出信號,例如接喇叭的時候可以發聲
第一種:用analogWrite(pin, val)?
pin引腳的編號,傳說中只能用 3,5,6,9,10,11 這幾條;
val 是 0~255 的整數值,對應電壓從 0 到+5V。
注意,那幾個腳的編號,指的是 ATmega168 的 pin 編號,Arduino 的板子會用
這幾個管腳支持更多路的 PWM 輸出,例如我的 Arduino Mega168 就支持 0-13 共 14 個PWM輸出。
示例代碼:
int pin = 8; //0-13
void setup()
{
pinMode(pin, OUTPUT);
}
void loop()
{
analogWrite(pin, 128);
delay(500);
}
特點:這種方式產生的方波周期大概是 20ms 左右(50Hz),不需要占用額外的 cpu 命令時間。
第二種:手動用代碼實現 PWM
int pin = 38; //這個可以隨意點
void setup()
{
pinMode(pin, OUTPUT);
}
void loop()
{
digitalWrite(pin, HIGH);
delayMicroseconds(100);
digitalWrite(pin, LOW);
delayMicroseconds(1000 - 100);
}
上面這段代碼會產生一個 PWM=0.1 的,周期為 1ms 的方波(1000Hz),這種方式的優缺點
很明顯:
1、PWM 的比例可以更精確;
2、周期和頻率可控制;
3、所有的 pin 腳都可以輸出,不局限于那幾個腳;
4、缺點:CPU 干不了其他事情了;
好吧,缺點只有一個,卻非常致命,以至于上面這些基本都是廢話。但是對于周期比較大的
PWM,可以用算法模擬 CPU 的多任務系統,從而在輸出 PWM 的同時做點兼職。
第三種:使用PWM寄存器
ATmega168 有三個時鐘,名字分別叫 Timer0, Timer1 和 Timer2。每個時鐘都使用了兩個寄存器,其中一個是設定值例如 128,另一個則從 0 開始不斷遞增,到 1024 之后溢出回到 0。那么當兩個值相同的時候,Timer 就會把某個管腳反相。不同的 Timer 之間頻率是相同的,占空比則根據設置值不同。
占空比有了,那么周期怎么控制呢?
有一種叫做時鐘控制器的東東,這個控制器可以設置周期為 CPU 周期的某個倍數,例如 1,8,64,256,1024 等等,Timer0 和 Timer1 共用一個控制器,Timer2 和它們是獨立的。
Atmega 168/328 ?的時鐘們ATmega328P 有三個時鐘,Timer0,Timer1 和 Timer2。每個時鐘都有兩個比較寄存器,可以
同時支持兩路輸出。其中比較寄存器用于控 制 PWM 的占空比,具體的原理等會兒會介紹。大多數情況下,每個時鐘的兩路輸出會有相同的頻率,但是可以有不同的占空比(取決于那兩個比較寄存器的設置)每個時鐘都有一個“預定標器”,它的作用是設置 timer 的時鐘周期,這個周期一般是有Arduino 的系統時鐘除以一個預設的因子來實現的。這個因子一 般是 1,8,64,256 或 1024 這樣的數值。Arduino 的系統時鐘周期是 16MHz,所以這些 Timer 的頻率就是系統時鐘除以這個預設值的標定 值。需要注意的是,Timer2 的時鐘標定值是獨立的,而 Timer0 和 Timer1使用的是相同的。這些時鐘都可以有多種不同的運行模式。常見的模式包 括“快速 PWM”和“相位修正 PWM”,這兩種 PWM 的定義也會在后面解釋。這些時鐘可以從 0 計數到 255,
也可以計數到某個指定的值。例如 16 位 Timer1 就可以支持計數到 16 位(2 個字節)。
除了比較寄存器外,還有一些其他的寄存器用來控制時鐘。例如 TCCRnA 和 TCCRnB 就是用來設置時鐘的計數位數。這些寄存器包含了很多位(bit),它們分別的作用如下:
脈沖生成模式控制位(WGM):用來設置時鐘的模式
時鐘選擇位(CS):設置時鐘的預定標器
輸出模式控制位(COMnA 和 COMnB):使能/禁用/反相 輸出 A 和輸出 B
輸出比較器(OCRnA 和 OCRnB):當計數器等于這兩個值時,輸出值根據不同的模式進行變化。不同時鐘的這些設置位稍有不同,所以使用的時候需要查一下資料。其中 Timer1 是一個 16 位的時鐘,Timer2 可以使用不同的預定標器。
總結
以上是生活随笔為你收集整理的Arduino产生PWM的3种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 银行系统开发必读的三本书!银行IT开发
- 下一篇: 常见开源协议