PWM输出(stm32)-非互补
·
PWM输出关键点
定时器输出PWM其实很简单,主要关注下面几件事情
-
1.PWM频率设置:
这个通过设置定时器的ARR寄存器即可,外部通过TIM_Period 来配置. TimerClk/TIM_Period 即为PWM频率. -
2.PWM占空比设置:
这个需要设置对应通道的CCR寄存器,定时器工作时,会比较CCR的值,当计数器工作在递增模式时,当计数器的值小于CCR中的值时,输出TIM_OCPolarity配置的极性,反之输出相反的极性.

-
3.PWM极性
PWM的极性通过TIM_OCPolarity配置, 一般默认都是高电平.一般我们说占空比为20%,就是意为一个周期内高电平持续时间占一个周期时间的20%.
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
代码如下:
uint16_t CCR1_Val = 333;
uint16_t CCR2_Val = 249;
uint16_t CCR3_Val = 166;
nt pwmout_main(void)
{
/* 一些GPIO配置,不展示代码了*/
TIM_Config();
/* -----------------------------------------------------------------------
TIM1 Channel1 占空比 = (TIM1_CCR1/ TIM3_ARR)* 100 = 50%
TIM1 Channel2 占空比 = (TIM1_CCR2/ TIM3_ARR)* 100 = 37.5%
TIM1 Channel3 占空比 = (TIM1_CCR3/ TIM3_ARR)* 100 = 25%
Note:
下面把定时器的时钟设置为21M,
----------------------------------------------------------------------- */
/*
TIM8 使用 APB2, 它的时钟是= 2 * PCLK2 = SystemCoreClock (168 MHz) */
PrescalerValue = (uint16_t) ((SystemCoreClock) / 21000000) - 1;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 665; //PWM频率为21000000/665 = 31.578K
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //占空比为333/665=50.07%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //占空比对应的是高电平.
TIM_OC1Init(TIM8, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;//占空比=249/665=37.44%
TIM_OC2Init(TIM8, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel3 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;//占空比=166/665=24.96%
TIM_OC3Init(TIM8, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM8, ENABLE);
/* 下面这句代码很重要,没有的话,PWM没有输出的*/
TIM_CtrlPWMOutputs(TIM8, ENABLE);
/* TIM8 enable counter */
TIM_Cmd(TIM8, ENABLE);
}
逻辑分析仪测试结果:
各个通道的PWM频率都是相同的,计算公式为PWM频率为21000000/665 = 31.578K.但是逻辑分析仪测出来的为31.45K,稍微有点出入(先不计较了)
- 通道1测试结果
占空比为333/665=50.07%, 符合预期

- 通道2测试结果:
占空比=249/665=37.44%

- 通道3测试结果:
占空比=166/665=24.96%

- 其它测试
特意将极性改为低电平,则占空比就变成了低电平占整个周期的比例.如下图
通道3的高电平变的很长.
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

更多推荐

所有评论(0)