新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM8 PWM例程

        STM8 PWM例程

        作者: 時間:2016-11-25 來源:網絡 收藏
        單片機應用系統中,也常常會用到PWM 信號輸出,例如電機轉速的控制。現在很多高檔的單片機

        也都集成了PWM 功能模塊,方便用戶的應用。
        對于PWM 信號,主要涉及到兩個概念,一個就是PWM 信號的周期或頻率,另一個就是PWM 信號的
        占空比。例如一個頻率為1KHZ,占空比為30%,有效信號為1 的PWM 信號,在用示波器測量時,
        就是高電平的時間為300uS,低電平的時間為700uS 的周期波形。
        在單片機中實現PWM 信號的功能模塊,實際上就是帶比較器的計數器模塊。首先該計數器循環計數,
        例如從0 到N,那么這個N 就決定了PWM 的周期,PWM 周期=(N+1)*計數器時鐘的周期。在計數
        器模塊中一定還有一個比較器,比較器有2 個輸入,一個就是計數器的當前值,另一個是可以設置的
        數,這個數來自一個比較寄存器。當計數器的值小于比較寄存器的值時,輸出為1(可以設置為0),
        當計數器的值大于或等于比較寄存器的值時,輸出為0(也可設置為1,與前面對應)。
        了解了這個基本原理后,我們就可以使用STM8 單片機中的PWM 模塊了。下面的實驗程序首先將定
        時器2 的通道2 設置成PWM 輸出方式,然后通過設置自動裝載寄存器TIM2_CCR2,決定PWM 信號
        的周期。在程序的主循環中,循環修改占空比,先是從0 逐漸遞增到128,然后再從128 遞減到0。
        當把下面的程序在ST 的三合一板上運行時,可以看到發光二極管LD1 逐漸變亮,然后又逐漸變暗,
        就這樣循環往復。如果用示波器看,可以看到驅動LD1 的信號波形的占空比從0 變到50%,然后又從
        50%變到0。
        同樣還是利用ST 的開發工具,生成一個C 語言程序的框架,然后修改其中的main.c,修改后的代碼
        如下。
        // 程序描述:用PWM 輸出驅動LED
        #include "STM8S207C_S.h"
        void CLK_Init(void);
        void TIM_Init(void);
        // 函數功能:延時函數
        // 輸入參數:ms -- 要延時的毫秒數,這里假設CPU 的主頻為2MHZ
        // 輸出參數:無
        // 返回值:無
        // 備注:無
        void DelayMS(unsigned int ms)
        {
        unsigned char i;
        while(ms != 0)
        {
        for(i=0;i<250;i++);
        for(i=0;i<75;i++);
        ms--;
        }
        }

        本文引用地址:http://www.104case.com/article/201611/321401.htm

        // 函數功能:初始化時鐘
        // 輸入參數:無
        // 輸出參數:無
        // 返回值:無
        // 備注:無
        void CLK_Init()
        {
        CLK_CKDIVR = 0x11; // 10: fHSI = fHSI RC output/ 4
        // = 16MHZ / 4 =4MHZ
        // 001: fCPU=fMASTER/2. = 2MHZ
        }
        // 函數功能:初始化定時器2 的通道2,用于控制LED 的亮度
        // 輸入參數:無
        // 輸出參數:無
        // 返回值:無
        // 備注:無
        void TIM_Init()
        {
        TIM2_CCMR2 = TIM2_CCMR2 | 0x70;// Output mode PWM2.
        // 通道2 被設置成比較輸出方式
        // OC2M = 111,為PWM 模式2,
        // 向上計數時,若計數器小于比較值,為無效電平
        // 即當計數器在0 到比較值時,輸出為1,否則為0
        TIM2_CCER1 = TIM2_CCER1 | 0x30;// CC polarity low,enable PWM output */
        // CC2P = 1,低電平為有效電平
        // CC2E = 1,開啟輸出引腳
        //初始化自動裝載寄存器,決定PWM 方波的頻率,Fpwm=4000000/256=15625HZ
        TIM2_ARRH = 0;
        TIM2_ARRL = 0xFF;
        //初始化比較寄存器,決定PWM 方波的占空比
        TIM2_CCR2H = 0;
        TIM2_CCR2L = 0;
        // 初始化時鐘分頻器為1,即計數器的時鐘頻率為Fmaster=4MHZ
        TIM2_PSCR = 0;
        // 啟動計數
        TIM2_CR1 = TIM2_CR1 | 0x01;
        }
        main()
        {
        unsigned char i;
        CLK_Init(); // 初始化時鐘
        TIM_Init(); // 初始化定時器
        while(1) // 進入無限循環
        {
        // 下面的循環將占空比逐漸從0 遞增到50%
        for(i=0;i<128;i++)
        {
        TIM2_CCR2H = 0;
        TIM2_CCR2L = i;
        DelayMS(5);
        }
        // 下面的循環將占空比逐漸從50%遞減到0
        for(i=128;i>0;i--)
        {
        TIM2_CCR2H = 0;
        TIM2_CCR2L = i;
        DelayMS(5);
        }
        }
        }



        關鍵詞: STM8PWM例

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 体育| 张家口市| 三门峡市| 合水县| 黔西县| 平泉县| 崇仁县| 庄浪县| 台南县| 云林县| 左贡县| 镇巴县| 延安市| 紫阳县| 屏山县| 恩施市| 舞阳县| 绍兴市| 甘孜| 仁布县| 黑河市| 凉城县| 天柱县| 平顺县| 平阳县| 澄迈县| 朝阳区| 凤台县| 贵州省| 府谷县| 波密县| 庄浪县| 海晏县| 庆城县| 乌什县| 个旧市| 大理市| 峨眉山市| 彭山县| 西林县| 山东省|