<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    S3C2440-蜂鳴器

    發布時間:2011-3-25 14:28    發布者:techshare
    關鍵詞: S3C2440 , 蜂鳴器
    ARM驅動蜂鳴器的方式有兩種:一種是PWM輸出口直接驅動,另一種是利用IO定時翻轉電平產生驅動波形對蜂鳴器進行驅動。PWM輸出口直接驅動是利用PWM輸出口本身可以輸出一定的方波來進行驅動。在ARM中可以用幾個特殊功能寄存器對占空比和周期進行設置。通過設置這些寄存器產生符合蜂鳴器要求的方波后,這個時候利用這個方波就可以對蜂鳴器進行驅動了。使用PWM時,通過TCMPn可以決定脈寬,TCNTn決定頻率,TCMPn/TCNTn決定占空比。使用IO口電平翻轉時,需要使用定時器來做定時,通過定時翻轉產生符合要求頻率的波形。由于蜂鳴器一般的工作電流比較大,以至于IO口無法驅動,一般使用放大電路來驅動,一般使用三極管來放大電流就可以了。





    使用PWM控制蜂鳴器:

    rTCFG0用來設置預分頻值,rTCFG1用來設置多路選擇器MUX的分頻值,TCNTB0也起到分頻作用。使用PWM控制蜂鳴器注意設置GPB0為TOUT0。這里設置PWM頻率為1HZ,占空比50%,也就是半秒響一次。S3C2440定時器中有雙緩沖rTCNTBn,rTCMPBn,他們是可以通過編程訪問的,他們會將數據自動裝入rTCNTn,rTCMPn,這兩個16位計數器對程序員來說是透明的。

    一般啟動定時器的步驟如下:
    • 將初始值寫入到rTCNTn,rTCMPn
    • 設置對應定時器的手動更新位,自動裝載
    • 啟動定時器,并關閉手動更新位


    #define rGPBCON (*(volatile unsigned *)0x56000010)
    #define rGPBDAT (*(volatile unsigned *)0x56000014)
    #define rGPBUP (*(volatile unsigned *)0x56000018)
    #define rTCFG0 (*(volatile unsigned *)0x51000000)
    #define rTCFG1 (*(volatile unsigned *)0x51000004)
    #define rTCNTB0 (*(volatile unsigned *)0x5100000C)
    #define rTCMPB0 (*(volatile unsigned *)0x51000010)
    #define rTCON (*(volatile unsigned *)0x51000008)

    int Main(){
            rGPBCON &= 0xfffffc;
            rGPBCON |= 0x2;
            rTCFG0 &= "0xff;
            rTCFG0 |= 0x64;
            rTCFG1 &= "0xf;
            rTCFG1 |= 0x3;
            rTCNTB0 = 0x7530;
            rTCMPB0 = rTCNTB0>>1;
            rTCON &= "0x1f;
            rTCON |= (0x1)|(0x1<<1)|(0x1<<3);
            rTCON &= "2;        
             while(1);
            return 0;
    }

    使用定時器產生中斷使IO電平翻轉,控制蜂鳴器:

    定時器注意設置rINTMSK開中斷,并在中斷處理程序中清除中斷請求位。rSRCPND |= 0x1<<10;rINTPND |= 0x1<<10;清除rINTPND通過設置相應為1進行清除。rSTCPND是向相應位寫數據清除。如果不清除,會一直響應這個中斷。在Main函數中清一下是為了防止以前這個位申請中斷,所以清一下,以防萬一。定時器接在APB總線上,所以用PCLK時鐘。在這里我設預分頻為0x64,除法器為16,rTCNTB0為0x7a12,所以 50M/0x64/16/0x7a12為1HZ,所以中斷周期為1s,所以每一秒蜂鳴器響一下,然后隔一秒,然后再響。

    #define rGPBCON (*(volatile unsigned *)0x56000010)  
    #define rGPBDAT (*(volatile unsigned *)0x56000014)  
    #define rGPBUP (*(volatile unsigned *)0x56000018)  
    #define rSRCPND (*(volatile unsigned *)0x4A000000)  
    #define rINTPND (*(volatile unsigned *)0x4A000010)  
    #define rTCFG0 (*(volatile unsigned *)0x51000000)  
    #define rTCFG1 (*(volatile unsigned *)0x51000004)  
    #define rTCNTB0 (*(volatile unsigned *)0x5100000C)  
    #define rTCON (*(volatile unsigned *)0x51000008)  
    #define rINTMSK (*(volatile unsigned *)0x4A000008)  
    #define U32 unsigned int   
    #define _ISR_STARTADDRESS 0x33ffff00  
    #define pISR_TIMER0 (*(unsigned *)(_ISR_STARTADDRESS+0x48))   
    int count;   
    void __irq Timer0_ISR(void){   
        rSRCPND |= 0x1<<10;   
        rINTPND |= 0x1<<10;   
        count++;   
        if(count %2 == 1)   
            rGPBDAT |= 0x01;   
        else  
            rGPBDAT &= 0xfe;   
        if(count == 1000)   
            count = 0;            
    }   
      
    int Main(){   
        count = 0;   
        rGPBCON &= 0xfffffc;   
        rGPBCON |= 0x1;   
        rGPBDAT &= 0xffe;   
        rGPBUP &= 0xfe;   
        pISR_TIMER0 = (U32)Timer0_ISR;   
        rSRCPND |= 0x1<<10;   
        rINTPND |= 0x1<<10;   
        rINTMSK &= "(0x1<<10);   
        rTCFG0 &= "0xff;   
        rTCFG0 |= 0x64;   
        rTCFG1 &= "0xf;   
        rTCFG1 |= 0x3;   
        rTCNTB0 = 0x7a12;   
        rTCON &= "0x1f;           
        rTCON |= 0xb;   
        rTCON &= "0x2;     
        while(1);   
        return 0;   
    }

    李萬鵬
    本文地址:http://www.portaltwn.com/thread-59922-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區
    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷