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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 如何利用ARM里的PWM模塊產(chǎn)生SPWM波

          如何利用ARM里的PWM模塊產(chǎn)生SPWM波

          作者: 時間:2016-11-11 來源:網(wǎng)絡 收藏
          由于各種ARM外圍配置的資源各不相同,本人使用是群星的LM3S615,里面含有3路PWM模塊,可以產(chǎn)生6路PWM波。SPWM與PWM看看,只差了一個,實際上還是有很大的差別的,如果控制電機之類,直接利用PWM波已經(jīng)足夠,但要做個逆變電源,就必須用SPWM才行。

          利用PWM模塊產(chǎn)生SPWM波,主要是利用了PWM模塊里一個比較器中斷功能。通過比較器,產(chǎn)生一個中斷,再附值產(chǎn)生一個PWM脈沖,一直循環(huán),下去,通過附不同的值,就可以產(chǎn)生一個SPWM了。主要程序如下:

          本文引用地址:http://www.ex-cimer.com/article/201611/316675.htm

          const INT16U spwmwidth[spwmct]={24,72,120,168,215,262,308,353,398,441,484,525,565,604,641,677,
          711,743,774,803,829,854,877,897,916,932,946,958,967,974,979,981,
          981,979,974,967,958,946,932,916,897,877,854,829,803,774,743,711,
          677,641,604,565,525,484,441,398,353,308,262,215,168,120,72,24
          };

          void SpwmInit(void)
          {


          SysCtlPWMClockSet(SYSCTL_PWMDIV_64); // PWM時鐘源64分頻

          SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); // 使能PD口外設

          SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); // 使能PWM外設

          GPIOPinTypePWM(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);// 設置PD0,PD1為PWM0和PWM1

          PWMGenConfigure(PWM_BASE, PWM_GEN_0, // 設置PWM發(fā)生器0為上下計數(shù)方式,兩路PWM不同步
          PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC | PWM_GEN_ACT_ZERO | PWM_GEN_ACT_ONE <<6);
          //PWM0A 在計數(shù)器為0時,輸出 為低電平,與比較器A值相等時輸出為高電平 。

          PWMOutputInvert(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT,true); //設置PWM兩路反相

          PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, 1000); // 設置兩路PWM的共同周期

          PWMDeadBandEnable(PWM_BASE,PWM_GEN_0,15,15); //死區(qū)時間設置

          PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, spwmwidth[16]); // 分別設置兩路PWM的匹配值

          // PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, 1000);

          PWMOutputState(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT, true);// 使能PWM0和PWM1

          PWMGenEnable(PWM_BASE, PWM_GEN_0); // 使能PWM發(fā)生器0
          HWREG(PWM_BASE+0X044)|=0x01;
          // PWMGenIntRegister(PWM_BASE, PWM_GEN_0,*SpwmISRHandler) ;

          PWMIntEnable(PWM_BASE,PWM_INT_GEN_0); //中斷使能 WM發(fā)生器0模塊
          IntEnable(INT_PWM0);
          }

          #endif

          /***********中斷程序*****************************************************************************/
          void SpwmISRHandler (void)
          {

          static INT16U count;

          #if OS_CRITICAL_METHOD == 3
          OS_CPU_SR cpu_sr;
          #endif

          OS_ENTER_CRITICAL();
          OSIntNesting++;
          OS_EXIT_CRITICAL();

          PWMGenIntClear(PWM_BASE, PWM_GEN_0,PWMIntStatus(PWM_BASE, true)|PWM_INT_GEN_0 );//清除中斷
          PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, spwmwidth[count]);
          if (count>=63||count<=0 ){
          count=1 ;
          }
          else {
          count++;
          }

          OSIntExit();
          }



          關鍵詞: ARMPWM模塊SPWM

          評論


          技術專區(qū)

          關閉
          看屁屁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); })();