PWM概述
一些定时器支持PWM输出功能,通过定时器设定定时周期,还有一个定时中断服务函数配合使用
TIMX_ARR确定频率(周期)、TIMX_CCRX寄存器确定占空比 :这两个寄存器最关键,控制pwm输出,
因为在计数器等于ARR和CCR都会使信号反转。稍微理一下就很清楚了,若要使输出的PWM占空比
变化,需要将CCR值变化(在中断服务程序中更改CCR值)。
pwm设置关键点!也是设置PWM通道的关键点在芯片引脚功能上有标注。
主要文件和函数
文件:
bsp_led.c //led初始化,看PWM效果
bsp_pwm.c //pwm、定时器、优先级配置
函数定义:
LED_Config()
PWM_Config()
VCIN_Configure()
void TIM3_Pwm_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 255;
TIM_TimeBaseInitStructure.TIM_Prescaler = 1999; //预分频为什么是1999,分频后是多少?
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
//PWMÉèÖÃ
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
//TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
//TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low ; // 指互补极性(及电平的有效性)
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//TIM_OCPolarity_High; //比较后输出的电平的有效性(TIM_OCPolarity_High:高电平有效)
//TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //通道3互补输出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //通道3的输出使能
TIM_OCInitStructure.TIM_Pulse = 0; 设置占空比
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //使能通道3 对应PB0 观察引脚图
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIM3重载寄存器ARR
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE); //使能定时器3
TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE); //使能update中断
NVIC_Config_PWM();
}
在STM32F103中,只有TIM1和TIM8有互补性输出的设定,一定要注意。
有些定时器可以实现互补输出
就是你在引脚复用里看到的TIM_CH1和TIM_CH1N,
后者是前者的互补输出引脚,它的极性、相位、初相都可以设置