脉冲宽度调制,简称PWM(Pulse Width Modulation)是利用微处理器的数字输出 对模拟电路进行控制的一种非常有效的控制技术,常用于控制Led灯的亮度、电机转速等。
STM32 的定时器除了 TIM6 和 7,其他的定时器都可以用来产生 PWM 输出。其中高级定时器TIM1和TIM8可以同时产生高达7路的PWM输出,通用定时器TIM2~TIM5可以同时产生4路PWM输出。
使用通用定时器输出PWM同样需要4步配置,由于输出PWM信号时,不需要定时器中断,所以不需要配置NVIC,但是需要配置TIM_OCInitStructure。下面已配置TIM2为例:
(1)开启系统时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
(2)配置GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
(3)配置TIMER
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period = 3599; //重装载值3600
TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频系数0,意味着不分频,由两项参数可算出定时器频率为20KHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
(4)配置TIM_OCInitStructure
void TIM2_PWM_Init(void)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//输出模式为PWM1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高,即输出高电平
TIM_OCInitStructure.TIM_Pulse =40*36; //设置PWM占空比为40%
TIM_OC1Init(TIM2, &TIM_OCInitStructure);//初始化TIM2信道1
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//开启TIM2信道1的预装载寄存器
TIM_OCInitStructure.TIM_Pulse =0*36;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_Pulse =90*36;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_Pulse =0*36;
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
结构体 TIM_OCInitTypeDef的定义为:
typedef struct
{
uint16_t TIM_OCMode;
uint16_t TIM_OutputState;
uint16_t TIM_OutputNState;
uint16_t TIM_Pulse;
uint16_t TIM_OCPolarity;
uint16_t TIM_OCNPolarity;
uint16_t TIM_OCIdleState;
uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;
其中TIM_OCPolarity、TIM_OCMode、TIM_OutputState、TIM_Pulse四个属性是需要我们设置的,其他四个属性是高级定时器TIM1和TIM8才有用的,在这里不做介绍。
1.TIM_OCMode设置输出模式,可设置为TIM_OCMode_PWM1与TIM_OCMode_PWM2,
PWM1:在向上计数时,一旦TIMx_CNT
3.TIM_OutputState设置比较输出使能,当设置为TIM_OutputState_Enable时,将PWM输出到端口上;
4.TIM_Pulse设置输出PWM的占空比,TIM_Pulse/TIM_Period为PWM的占空比;
在设置PWM占空比 时,还有一种方式,在正点原子的教程中使用了TIM_SetComparex(x=1,2,3,4)函数来设置PWM的占空比,我不是很理解,具体设置过程以设置TIM2的CH1为例:
TIM_SetCompare1(TIM2,40*36)应该是与设置TIM_Pulse=40*36是相同的效果。
上一篇:STM32 PWM的输出与Keil软件仿真
下一篇:STM32学习笔记一一PWM 输出
推荐阅读最新更新时间:2024-03-16 16:07
设计资源 培训 开发板 精华推荐
- 首都医科大学王长明:针对癫痫的数字疗法已进入使用阶段
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度
- 英飞凌推出简化电机控制开发的ModusToolbox™电机套件
- 意法半导体IO-Link执行器电路板为工业监控和设备厂商带来一站式参考设计
- Melexis采用无磁芯技术缩小电流感测装置尺寸
- 千丘智能侍淳博:用数字疗法,点亮“孤独症”儿童的光
- 数药智能冯尚:ADHD数字疗法正为儿童“多动症”提供更有效便捷服务
- Vicor高性能电源模块助力低空航空电子设备和 EVTOL的发展