文章目录
- PWM输出关键点
- 代码如下:
- 逻辑分析仪测试结果:
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_tCCR1_Val=333;uint16_tCCR2_Val=249;uint16_tCCR3_Val=166;ntpwmout_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.578KTIM_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;