在某天遇到一个需求,需要同时输出3个不同频宽的的PWM输出。同时,而且一个时间段内,我只需要3个PWM的波形。似乎有点不太可能,接下来先分析一波:
1、需要同时输出3个PWM输出,那么意味着只有同一个定时器的3个通道输出PWM才能实现。
2、如果是需要同一个定时器的3通道PWM,那么如果这3个波形的周期都是10us,那么我只需要调整3个通道的占空比,那么就能够实现。
3、那么问题的重点是如何控制一段时间内的波形个数呢?
1、首先我们先简单的写一个2通道PWM波形输出(通道一为周期10us秒,占空比20 通道二为占空比50)
GPIO_Config_T GPIO_ConfigStruct;
TMR_BaseConfig_T TMR_TimeBaseStruct;
TMR_OCConfig_T OCcongigStruct;
RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_TMR1 | RCM_APB2_PERIPH_GPIOB));
GPIO_ConfigStruct.pin = GPIO_PIN_8;
GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
GPIO_Config(GPIOA, &GPIO_ConfigStruct);
GPIO_ConfigStruct.pin = GPIO_PIN_9;
GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
GPIO_Config(GPIOA, &GPIO_ConfigStruct);
TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;
TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;
TMR_TimeBaseStruct.division = 71;
TMR_TimeBaseStruct.period = 10;
TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);
OCcongigStruct.idleState = TMR_OC_IDLE_STATE_RESET;
OCcongigStruct.mode = TMR_OC_MODE_PWM1;
OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;
OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH;
OCcongigStruct.outputNState = TMR_OC_NSTATE_ENABLE;
OCcongigStruct.outputState = TMR_OC_STATE_ENABLE;
OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH;
OCcongigStruct.pulse = 5;
TMR_ConfigOC1(TMR1, &OCcongigStruct);
OCcongigStruct.idleState = TMR_OC_IDLE_STATE_RESET;
OCcongigStruct.mode = TMR_OC_MODE_PWM1;
OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;
OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH;
OCcongigStruct.outputNState = TMR_OC_NSTATE_ENABLE;
OCcongigStruct.outputState = TMR_OC_STATE_ENABLE;
OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH;
OCcongigStruct.pulse = 2;
TMR_ConfigOC2(TMR1, &OCcongigStruct);
TMR_ConfigOC1Preload(TMR1, TMR_OC_PRELOAD_ENABLE);
TMR_EnableAutoReload(TMR1);
TMR_Enable(TMR1);
TMR_EnablePWMOutputs(TMR1);
2、我们尝试使用第二个定时器,10us进入一次中断,每次中断计数一次。那么我们只需要在计数3(30us的时候关闭PWM输出),计数10(100us)的时候清零且打开PWM的输出,是否能够实现100us内仅输出3个波形。
a、定时器5的配置
TMR_BaseConfig_T TMR_BaseConfigStruct;
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR5);
TMR_BaseConfigStruct.clockDivision = TMR_CLOCK_DIV_1;
TMR_BaseConfigStruct.countMode = TMR_COUNTER_MODE_UP;
TMR_BaseConfigStruct.division = 72;
TMR_BaseConfigStruct.period = 10;
TMR_BaseConfigStruct.repetitionCounter = 0;
TMR_ConfigTimeBase(TMR5, &TMR_BaseConfigStruct);
TMR_EnableInterrupt(TMR5, TMR_INT_UPDATE);
NVIC_EnableIRQRequest(TMR5_IRQn, 0, 0);
TMR_Enable(TMR5);
c、最终呈现波形效果
最后,这样的方式确实能够简单的实现控制一段时间内的波形个数。但是这样的方式个人感觉还是有很多不妥当的地方,这样的方式仅能实现同一频率不同占空比的波形,如果波形的频率不一致的话,恐怕还是需要别的方式去实现。