您的位置 首页 芯闻

怎么使用ARM里的PWM模块发生SPWM波

由于各种ARM外围配置的资源各不相同,本人使用是群星的LM3S615,里面含有3路PWM模块,可以产生6路PWM波。SPWM与PWM看看,只差了一个…

因为各种ARM外围装备的资源各不相同,自己使用是群星的LM3S615,里边含有3路PWM模块,能够发生6路PWM波。SPWM与PWM看看,只差了一个,实际上仍是有很大的不同的,假如操控电机之类,直接使用PWM波现已满足,但要做个逆变电源,就必须用SPWM才行。

使用PWM模块发生SPWM波,首要是使用了PWM模块里一个比较器中止功用。经过比较器,发生一个中止,再附值发生一个PWM脉冲,一向循环,下去,经过附不同的值,就能够发生一个SPWM了。首要程序如下:

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();
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/274527.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部