新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 如何利用ARM里的PWM模塊產生SPWM波

        如何利用ARM里的PWM模塊產生SPWM波

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

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

        本文引用地址:http://www.104case.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發生器0為上下計數方式,兩路PWM不同步
        PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC | PWM_GEN_ACT_ZERO | PWM_GEN_ACT_ONE <<6);
        //PWM0A 在計數器為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); //死區時間設置

        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發生器0
        HWREG(PWM_BASE+0X044)|=0x01;
        // PWMGenIntRegister(PWM_BASE, PWM_GEN_0,*SpwmISRHandler) ;

        PWMIntEnable(PWM_BASE,PWM_INT_GEN_0); //中斷使能 WM發生器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

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 手机| 上林县| 上饶市| 大荔县| 邵阳市| 新密市| 资中县| 衡水市| 犍为县| 赞皇县| 老河口市| 离岛区| 宁武县| 阳江市| 宜君县| 义马市| 金塔县| 永川市| 内丘县| 高青县| 时尚| 澳门| 衡南县| 漠河县| 玛多县| 达日县| 新干县| 剑河县| 建阳市| 阿拉善盟| 深水埗区| 峨眉山市| 藁城市| 乌兰浩特市| 太和县| 济源市| 喀什市| 叙永县| 疏勒县| 辽宁省| 仪陇县|