版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。PWM在ARM_Linux中的原理和蜂鳴器驅(qū)動實例開發(fā)-PWM在ARMLinux中的原理和蜂鳴器驅(qū)動實例開發(fā)一、開發(fā)環(huán)境主機:VMWare-Fedora9開發(fā)板:Mini2440-64MBNand,Kernel:編譯器:arm-linux-gcc-4.3.2二、PWM怎樣工作在ARMLinux中1.什么是PWM?PWM(脈沖寬度調(diào)制)簡單的講是一種變頻技術(shù)之一,是靠改變脈沖寬度來控制輸出電壓,通過改變周期來控制其輸出頻率。如果還不是很清楚,好吧,來看看我們實際生活中的例子,我們的電風扇為什么扭一下按扭,
2、風扇的轉(zhuǎn)速就會發(fā)生變化;調(diào)一下收音機的聲音按鈕,聲音的大小就會發(fā)生變化;還有待會兒我們要講的蜂鳴器也會根據(jù)不同的輸入值而發(fā)出不同頻率的叫聲等等!這些都是PWM的應用,都是通過PWM輸出的頻率信號進行控制的。2.ARMLinux中的PWM根據(jù)S3C2440的手冊介紹,S3C2440A內(nèi)部有5個16位的定時器,定時器0、1、2、3都帶有脈沖寬度調(diào)制功能(PWM),定時器4是一個沒有輸出引腳的內(nèi)部定時器,定時器0有一個用于大電流設備的死區(qū)生成器??聪聢D解釋吧!由S3C2440的技術(shù)手冊和上面這幅結(jié)構(gòu)圖,我們來總結(jié)一下2440內(nèi)部定時器模塊的特性吧:1)共5個16位的定時器,定時器0、1、2、3都帶有
3、脈沖寬度調(diào)制功能(PWM);2)每個定時器都有一個比較緩存寄存器(TCMPB)和一個計數(shù)緩存寄存器(TCNTB);3)定時器0、1共享一個8位的預分頻器(預定標器),定時器2、3、4共享另一個8位的預分頻器(預定標器),其值范圍是0255;4)定時器0、1共享一個時鐘分頻器,定時器2、3、4共享另一個時鐘分頻器,這兩個時鐘分頻器都能產(chǎn)生5種不同的分頻信號值(即:1/2、1/4、1/8、1/16和TCLK);5)兩個8位的預分頻器是可編程的且根據(jù)裝載的值來對PCLK進行分頻,預分頻器和鐘分頻器的值分別存儲在定時器配置寄存器TCFG0和TCFG1中;6)有一個TCON控制寄存器控制著所有定時器的屬
4、性和狀態(tài),TCON的第07位控制著定時器0、第811位控制著定時器1、第1215位控制著定時器2、第1619位控制著定時器3、第2022位控制著定時器4。還是根據(jù)S3C2440手冊的描述和上圖的結(jié)構(gòu),要開始一個PWM定時器功能的步驟如下(假設使用的是第一個定時器):1)分別設置定時器0的預分頻器值和時鐘分頻值,以供定時器0的比較緩存寄存器和計數(shù)緩存寄存器用;2)設置比較緩存寄存器TCMPB0和計數(shù)緩存寄存器TCNTB0的初始值(即定時器0的輸出時鐘頻率);3)關(guān)閉定時器0的死區(qū)生成器(設置TCON的第4位);4)開啟定時器0的自動重載(設置TCON的第3位);5)關(guān)閉定時器0的反相器(設置TC
5、ON的第2位);6)開啟定時器0的手動更新TCNTB0&TCMPB0功能(設置TCON的第1位);7)啟動定時器0(設置TCON的第0位);8)清除定時器0的手動更新TCNTB0&TCMPB0功能(設置TCON的第1位)。由此可以看到,PWM的輸出頻率跟比較緩存寄存器和計數(shù)緩存寄存器的取值有關(guān),而比較緩存寄存器和計數(shù)緩存寄存器的值又跟預分頻器和時鐘分頻器的值有關(guān);要使用PWM功能其實也就是對定時器的相關(guān)寄存器進行操作。手冊上也有一個公式:定時器輸出頻率=PCLK/預分頻器值+1/時鐘分頻值。下面我們來通過一個蜂鳴器的實例來說明PWM功能的使用。三、蜂鳴器驅(qū)動實例1.蜂鳴器的種類和工作原理一、開
6、發(fā)環(huán)境主機:VMWare-Fedora9開發(fā)板:Mini2440-64MBNand,Kernel:編譯器:arm-linux-gcc-4.3.2二、PWM怎樣工作在ARMLinux中蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發(fā)光二極管。多諧振蕩器由晶體管或集成電路構(gòu)成。當接通電源后(1.515V直流工作電壓),多諧振蕩器起振,輸出1.52.5kHZ的音頻信號,阻抗匹配器推動壓電蜂鳴片發(fā)聲。電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號電流通
7、過電磁線圈,使電磁線圈產(chǎn)生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發(fā)聲。有源蜂鳴器和無源蜂鳴器的區(qū)別:這個“源”字是不是指電源,而是指震蕩源,即有源蜂鳴器內(nèi)有振蕩源而無源蜂鳴器內(nèi)部沒有振蕩源。有振蕩源的通電就可以發(fā)聲,沒有振蕩源的需要脈沖信號驅(qū)動才能發(fā)聲。額外知識:簡單蜂鳴器的制作方法1)制備電磁鐵M:在長約6厘米的鐵螺栓上繞100圈導線,線端留下5厘米作引線,用透明膠布把線圈粘好,以免線圈松開,再用膠布把它粘在一個盒子上,電磁鐵就做好了;2)制備彈片P:從鐵罐頭盒上剪下一條寬約厘米的長鐵片,彎成直角,把電磁鐵的一條引線接在彈片上,再用膠布把彈片緊貼在木板上;3)用曲別針做觸頭
8、Q,用書把曲別針墊高,用膠布粘牢,引出一條導線,如圖連接好電路;4)調(diào)節(jié)M與P之間的距離(通過移動盒子),使電磁鐵能吸引彈片,調(diào)節(jié)觸點與彈片之間的距離,使它們能恰好接觸,通電后就可以聽到蜂鳴聲。2.開發(fā)板上蜂鳴器原理圖分析由原理圖可以得知,蜂鳴器是通過GPB0IO口使用PWM信號驅(qū)動工作的,而GPB0口是一個復用的IO口,要使用它得先把他設置成TOUT0PWM輸出模式。3.編寫合適開發(fā)板的蜂鳴器驅(qū)動程序,文件名:my2440_pwm.c/*=Name:my2440_pwm.cAuthor:HuangGangDate:25/11/09Copyright:GPLDescription:my2440
9、pwmdriver=*/#include#include#include#include#include#include#include#include#include#include#include#definePWM_MAJOR0/主設備號#definePWM_NAMEmy2440_pwm/設備名稱staticintdevice_major=PWM_MAJOR;/系統(tǒng)動態(tài)生成的主設備號/打開設備staticintpwm_open(structinode*inode,structfile*file)/對GPB0復用口進行復用功能設置,設置為TOUT0PWM輸出s3c2410_gpio_cfg
10、pin(S3C2410_GPB0,S3C2410_GPB0_TOUT0);return0;/關(guān)閉設備staticintpwm_close(structinode*inode,structfile*file)return0;/對設備進行控制staticintpwm_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)if(cmd=0)/如果輸入的參數(shù)小于或等于0的話,就讓蜂鳴器停止工作/這里又恢復GPB0口為IO口輸出功能,由原理圖可知直接給低電平可讓蜂鳴器停止工作s3c2410_gpio_cfgpin(S
11、3C2410_GPB0,S3C2410_GPB0_OUTP);s3c2410_gpio_setpin(S3C2410_GPB0,0);else/如果輸入的參數(shù)大于0,就讓蜂鳴器開始工作,不同的參數(shù),蜂鳴器的頻率也不一樣/定義一些局部變量unsignedlongtcon;unsignedlongtcnt;unsignedlongtcfg1;unsignedlongtcfg0;structclk*clk_p;unsignedlongpclk;/以下對各寄存器的操作結(jié)合上面講的開始一個PWM定時器的步驟和2440手冊PWM寄存器操作部分來看就比較容易理解tcfg1=_raw_readl(S3C241
12、0_TCFG1);/讀取定時器配置寄存器1的值tcfg0=_raw_readl(S3C2410_TCFG0);/讀取定時器配置寄存器0的值tcfg0&=S3C2410_TCFG_PRESCALER0_MASK;tcfg0|=(50-1);/設置tcfg0的值為49tcfg1&=S3C2410_TCFG1_MUX0_MASK;tcfg1|=S3C2410_TCFG1_MUX0_DIV16;/設置tcfg1的值為0 x0011即:1/16_raw_writel(tcfg1,S3C2410_TCFG1);/將值tcfg1寫入定時器配置寄存器1中_raw_writel(tcfg0,S3C2410_TC
13、FG0);/將值tcfg0寫入定時器配置寄存器0中clk_p=clk_get(NULL,pclk);pclk=clk_get_rate(clk_p);/從系統(tǒng)平臺時鐘隊列中獲取pclk的時鐘頻率,在include/linux/clk.h中定義tcnt=(pclk/50/16)/cmd;/計算定時器0的輸出時鐘頻率(pclk/prescaler0+1/dividervalue)_raw_writel(tcnt,S3C2410_TCNTB(0);/設置定時器0計數(shù)緩存寄存器的值_raw_writel(tcnt/2,S3C2410_TCMPB(0);/設置定時器0比較緩存寄存器的值tcon=_raw
14、_readl(S3C2410_TCON);/讀取定時器控制寄存器的值tcon&=0 x1f;tcon|=0 xb;/關(guān)閉死區(qū)、自動重載、關(guān)反相器、更新TCNTB0&TCMPB0、啟動定時器0_raw_writel(tcon,S3C2410_TCON);/設置定時器控制寄存器的0-4位,即對定時器0進行控制tcon&=2;_raw_writel(tcon,S3C2410_TCON);/清除定時器0的手動更新位return0;/設備操作結(jié)構(gòu)體staticstructfile_operationspwm_fops=.owner=THIS_MODULE,.open=pwm_open,.release=
15、pwm_close,.ioctl=pwm_ioctl,;/定義一個設備類staticstructclass*pwm_class;staticint_initpwm_init(void)/注冊為字符設備,主設備號為0讓系統(tǒng)自動分配,設備名為my2440_pwm,注冊成功返回動態(tài)生成的主設備號device_major=register_chrdev(PWM_MAJOR,PWM_NAME,&pwm_fops);if(device_majorCharacterdevices-My2440PWMBeepDevice(NEW)6.編譯內(nèi)核并下載到開發(fā)板上。這里要注意,現(xiàn)在我們不需要手動的在開發(fā)板上創(chuàng)建設備
16、的節(jié)點了,因為我們現(xiàn)在使用了mdev進行管理了(使用方法請看:HYPERLINK/u3/101649/showart_2101208.html設備文件系統(tǒng)剖析與使用),在驅(qū)動程序中也添加了對類設備接口的支持。之前講的一些驅(qū)動都沒有,以后我們都使用這種方法?,F(xiàn)在可以查看到/dev目錄下自動創(chuàng)建好的my2440_pwm設備節(jié)點,就直接可以使用它了。7.編寫PWM蜂鳴器驅(qū)動的測試程序。文件名:pwm_test.c/*=Name:pwm_test.cAuthor:HuangGangDate:25/11/2009Copyright:GPLDescription:my2440pwmdrivertest=*/#include#include#include#includeintmain(intargc,char*argv)inttmp;intfd;inti;/打開蜂鳴器設備fd=open(/dev/my2440_pwm,O_RDWR);if(fd0)printf(OpenPWMDeviceFaild!n);exit(1);/提示用戶輸入一個參數(shù)來對蜂鳴器進行調(diào)頻,0表示停止工作printf(pleaseenterthetimesnumber(0is
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球離網(wǎng)房車行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球高脈沖能量皮秒激光器行業(yè)調(diào)研及趨勢分析報告
- 月齡嬰兒情緒情感與社會性親子活動設計創(chuàng)造性撫觸游戲講解
- 2025【合同范本】建筑工程設計協(xié)議書
- 蔬菜配送合作合同范本
- 分期付款合同模板集錦
- 會簽單合同模板
- 全新對講機服務合同下載
- 勞務出資合伙協(xié)議合同
- 個人租車租賃合同范本
- 區(qū)域經(jīng)理年終工作總結(jié)匯報
- 2019版新人教版高中英語必修+選擇性必修共7冊詞匯表匯總(帶音標)
- 初中八年級音樂-勞動號子《軍民大生產(chǎn)》
- 中層領(lǐng)導的高績效管理
- 小小銀行家-兒童銀行知識、理財知識培訓
- 機械基礎(chǔ)知識競賽題庫附答案(100題)
- 閱讀理解特訓卷-英語四年級上冊譯林版三起含答案
- 國庫集中支付培訓班資料-國庫集中支付制度及業(yè)務操作教學課件
- 屋面及防水工程施工(第二版)PPT完整全套教學課件
- 2023年上海青浦區(qū)區(qū)管企業(yè)統(tǒng)一招考聘用筆試題庫含答案解析
- 2023年高一物理期末考試卷(人教版)
評論
0/150
提交評論