本帖最后由 wangjj19950516 于 2021-5-6 14:20 编辑
如题,最近有客户有这样一个需求:需要做PWM输出,要求2路输出可独立控制占空比,但一路的上升沿与另一路的下降沿对齐。
这个要求通过配置PWM模块是可以实现的,下面简单讲一下原理:
1.首先,两路输出需要独立控制占空比,则应设置为PWM输出的独立模式;
其次,两路的一个边沿要在任何情况下都要对齐,则应选择向上计数模式,每次在初始时刻对齐边沿
最后,一路的上升沿对齐另一路的下降沿,则这两路的极性应设置为相反。
下图显示了边沿对齐的PWM配置不同极性后输出的波形,计数器从CNTIN开始向上计数,当与设置的最大计数值MCVR匹配时,则完成了一个周期,重新从CNTIN开始计数,CHnV用于控制占空比。
当设置为高有效时,从初始时刻开始,该通道输出高电平,直到计数值与CHnV匹配,则将输出拉低,占空比为(2+1)/(4+1) = 60%.
当设置为低有效时,从初始时刻开始,该通道输出低电平,直到计数值与CHnV匹配,则将输出拉高,占空比为1-(2=1)/(4+1)= 40%.
2.程序配置
void PWM_GPIO_Config(void)
{
GPIO_SetFunc(GPIOB, GPIO_PIN5, GPIO_FUN1);//PWM1_CH0
GPIO_SetFunc(GPIOB, GPIO_PIN4, GPIO_FUN1);//PWM1_CH1
}
void PWM_Config(void)
{
PWM_SimplyConfigType SimplyConfig;
memset(&SimplyConfig, 0, sizeof(SimplyConfig));
SimplyConfig.allChCombineMode = PWM_INDEPENDENT_MODE; //独立模式
SimplyConfig.countMode = PWM_UP_COUNT; //向上计数,边沿对齐
/* PWM_CLK_SOURCE_BUS */
SimplyConfig.clkSource = PWM_CLK_SOURCE_APB; //PWM模块时钟源选择APB时钟,24MHZ
SimplyConfig.clkPsc = 0; //时钟分频系数
SimplyConfig.initValue = 0;//初始计数值
SimplyConfig.maxValue = 24000;//最大计数值,决定频率。24M/maxValue = 24000000/24000 = 1000HZ
SimplyConfig.chValue[0] = 10000;//通道0匹配值
SimplyConfig.chValue[1] = 20000;//通道1匹配值
SimplyConfig.interruptEn = DISABLE;
SimplyConfig.callBack = NULL;
PWM_SimplyInit(PWM1, &SimplyConfig);
PWM_SetChannelELSR(PWM1, PWM_CH_0, PWM_HIGH_TRUE);//通道0极性为高有效
PWM_SetChannelELSR(PWM1, PWM_CH_1, PWM_LOW_TRUE);//通道1极性为低有效
}
int main(void)
{
PWM_GPIO_Config();
PWM_Config();
while(1)
{
}
}
生成波形如下图:黄色为PWM_CH0,绿色为PWM_CH1.可以看出CH0的上升沿与CH1的下降沿对齐
如果需要不同的对齐边沿,可以修改通道的极性来实现,可以为相同的极性,也可为不同的极性。
附上调试代码:
PWM_上升沿对齐下降沿.rar
(1.61 MB)
|