嵌入式Linux之我行——PWM在ARM Linux中的原理和蜂鳴器驅動例項開發
一、開發環境
- 主 機:VMWare--Fedora 9
- 開發板:Mini2440--64MB Nand, Kernel:2.6.30.4
- 編譯器:arm-linux-gcc-4.3.2
二、PWM怎樣工作在ARM Linux中
1. 什麼是PWM?
PWM(脈衝寬度調製)簡單的講是一種變頻技術之一,是靠改變脈衝寬度來控制輸出電壓,通過改變週期來控制其輸出頻率。如果還不是很清楚,好吧,來看看我們實際生活中的例子,我們的電風扇為什麼扭一下按扭,風扇的轉速就會發生變化;調一下收音機的聲音按鈕,聲音的大小就會發生變化;還有待會兒我們要講的蜂鳴器也會根據不同的輸入值而發出不同頻率的叫聲等等!!這些都是PWM的應用,都是通過PWM輸出的頻率訊號進行控制的。
2. ARM Linux中的PWM
根據S3C2440的手冊介紹,S3C2440A內部有5個16位的定時器,定時器0、1、2、3都帶有脈衝寬度調製功能(PWM),定時器4是一個沒有輸出引腳的內部定時器,定時器0有一個用於大電流裝置的死區生成器。看下圖解釋吧!!
由S3C2440的技術手冊和上面這幅結構圖,我們來總結一下2440內部定時器模組的特性吧:
1)共5個16位的定時器,定時器0、1、2、3都帶有脈衝寬度調製功能(PWM);
2)每個定時器都有一個比較快取暫存器(TCMPB)和一個計數快取暫存器(TCNTB);
3)定時器0、1共享一個8位的預分頻器(預定標器),定時器2、3、4共享另一個8位的預分頻器(預定標器),其值範圍是0~255;
4)定時器0、1共享一個時鐘分頻器,定時器2、3、4共享另一個時鐘分頻器,這兩個時鐘分頻器都能產生5種不同的分頻訊號值(即:1/2、1/4、1/8、1/16和TCLK);
5)兩個8位的預分頻器是可程式設計的且根據裝載的值來對PCLK進行分頻,預分頻器和鍾分頻器的值分別儲存在定時器配置暫存器TCFG0和TCFG1中
6)有一個TCON控制暫存器控制著所有定時器的屬性和狀態,TCON的第0~7位控制著定時器0、第8~11位控制著定時器1、第12~15位控制著定時器2、第16~19位控制著定時器3、第20~22位控制著定時器4。
還是根據S3C2440手冊的描述和上圖的結構,要開始一個PWM定時器功能的步驟如下(假設使用的是第一個定時器):
1)分別設定定時器0的預分頻器值和時鐘分頻值,以供定時器0的比較快取暫存器和計數快取暫存器用;
2)設定比較快取暫存器TCMPB0和計數快取暫存器TCNTB0的初始值(即定時器0的輸出時鐘頻率);
3)關閉定時器0的死區生成器(設定TCON的第4位);
4)開啟定時器0的自動過載(設定TCON的第3位);
5)關閉定時器0的反相器(設定TCON的第2位);
6)開啟定時器0的手動更新TCNTB0&TCMPB0功能(設定TCON的第1位);
7)啟動定時器0(設定TCON的第0位);
8)清除定時器0的手動更新TCNTB0&TCMPB0功能(設定TCON的第1位)。
由此可以看到,PWM的輸出頻率跟比較快取暫存器和計數快取暫存器的取值有關,而比較快取暫存器和計數快取暫存器的值又跟預分頻器和時鐘分頻器的值有關;要使用PWM功能其實也就是對定時器的相關暫存器進行操作。手冊上也有一個公式:定時器輸出頻率 = PCLK / {預分頻器值 + 1} / 時鐘分頻值。下面我們來通過一個蜂鳴器的例項來說明PWM功能的使用。
1. 蜂鳴器的種類和工作原理
蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種型別。
壓電式蜂鳴器主要由多諧振盪器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發光二極體。多諧振盪器由電晶體或積體電路構成。當接通電源後(1.5~15V直流工作電壓),多諧振盪器起振,輸出1.5~2.5kHZ的音訊訊號,阻抗匹配器推動壓電蜂鳴片發聲。
電磁式蜂鳴器由振盪器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源後,振盪器產生的音訊訊號電流通過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,週期性地振動發聲。
有源蜂鳴器和無源蜂鳴器的區別:這個“源”字是不是指電源,而是指震盪源,即有源蜂鳴器內有振盪源而無源蜂鳴器內部沒有振盪源。有振盪源的通電就可以發聲,沒有振盪源的需要脈衝訊號驅動才能發聲。
額外知識:簡單蜂鳴器的製作方法
1)製備電磁鐵M:在長約6釐米的鐵螺栓上繞100圈導線,線端留下5釐米作引線,用透明膠布把線圈粘好,以免線圈鬆開,再用膠布把它粘在一個盒子上,電磁鐵就做好了; 2)製備彈片P:從鐵罐頭盒上剪下一條寬約2釐米的長鐵片,彎成直角,把電磁鐵的一條引線接在彈片上,再用膠布把彈片緊貼在木板上; 3)用曲別針做觸頭Q,用書把曲別針墊高,用膠布粘牢,引出一條導線,如圖連線好電路; 4)調節M與P之間的距離(通過移動盒子),使電磁鐵能吸引彈片,調節觸點與彈片之間的距離,使它們能恰好接觸,通電後就可以聽到蜂鳴聲。
2. 開發板上蜂鳴器原理圖分析
由原理圖可以得知,蜂鳴器是通過GPB0 IO口使用PWM訊號驅動工作的,而GPB0口是一個複用的IO口,要使用它得先把他設定成TOUT0 PWM輸出模式。
3. 編寫合適開發板的蜂鳴器驅動程式,檔名:my2440_pwm.c
|
4. 將PWM蜂鳴器驅動程式碼部署到核心中。
|
|
|
|
|
5.配置核心,選擇PWM蜂鳴器裝置選項
|
|
6. 編譯核心並下載到開發板上。這裡要注意,現在我們不需要手動的在開發板上建立裝置的節點了,因為我們現在使用了mdev進行管理了(使用方法請看:裝置檔案系統剖析與使用),在驅動程式中也添加了對類裝置介面的支援。之前講的一些驅動都沒有,以後我們都使用這種方法。現在可以檢視到/dev目錄下自動建立好的my2440_pwm裝置節點,就直接可以使用它了。
7. 編寫PWM蜂鳴器驅動的測試程式。檔名:pwm_test.c
|
8. 在開發主機上交叉編譯測試應用程式,並複製到檔案系統的/usr/sbin目錄下,然後重新編譯檔案系統下載到開發板上。
|
9. 在開發板上執行測試程式。可以看到根據你輸入引數的大小,蜂鳴器也會發生不同頻率的叫聲,輸入0蜂鳴器停止鳴叫。