<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          STM8 PWM例程

          作者: 時(shí)間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
          單片機(jī)應(yīng)用系統(tǒng)中,也常常會(huì)用到PWM 信號(hào)輸出,例如電機(jī)轉(zhuǎn)速的控制?,F(xiàn)在很多高檔的單片機(jī)

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

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



          關(guān)鍵詞: STM8PWM例

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();