STM32-TIM定时器与PWM输出

发布于:2024-04-29 ⋅ 阅读:(38) ⋅ 点赞:(0)
学习目标:
1. 熟练掌握 TIM 的参数配置。
2. 掌握通道的参数配置。
3. 深刻理解 PWM 与功率的关系。
4. 理解 PWM 的原理示意。
一 什么是 PWM 输出
PWM pulse width modulation )一种脉冲宽度调节技术。
PWM 的效果是什么样子:
结论:脉冲宽度调节,仅仅改变的是高电平在整个周期的占比,不改变频率。通俗的来看:这个功能,没什么神奇之处。无非就是高电平持续一段时间,然后低电平持续一段时间。修改高电平持续时间就叫做脉冲宽度调节,叫做PWM
方波 1 和方波 2 同时给与设备供电。两个设备的功率一定不一样。在低频率下:体现出来就是工作一会,歇一会。下面这个歇的时间更久一些。在高频率下:体现出来就是两套设备功率不一样,比如LED 的亮度,风扇的转速,电动车的车速等等。
定时器的 PWM 的输出功能
2.1 PWM 的输出示意图
结论:首先这个通道和引脚有硬件上的绑定关系。第二个就是方波的频率由定时器决定,但是频宽由PWM 决定。选择一个通道并配置相应的 GPIO 引脚。这个就 可以在外面接收到你想要的各种方波信号了。
2.2. 程序流程图
2.2.2.1. 时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
函数解释:
参数 1 :确认是哪一个成员
参数 2 ENABLE\DISENABLE
2.2.2.2.GPIO 参数配置
GPIO_Init(GPIOC, &GPIO_InitStructure);
函数解释:让程序决定第几组第几根引脚,如何工作。
参数 1 GPIOC, 第几组。
参数 2 :第几根如何干活
GPIO_InitTypeDef 结构体名字;
结构体名字.GPIO_Pin = 第几根引脚
结构体名字.GPIO_Mode = 工作模式(这里选复用)
结构体名字.GPIO_Speed = 速度;
结构体名字.GPIO_OType = 推挽还是开漏;
结构体名字.GPIO_PuPd = 上拉还是下拉;

 2.2.2.3.GPIO复用到定时器

GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM8);
函数解释::如果你 GPIO 选择了 复用输出,这里请你选择确认该引脚下面的哪一个资源开始使用这个引脚。
参数 1 GPIOx :第几组,
参数 2 :第几根引脚。
参数 3 :要复用哪一个资源。你自己跳到函数里面。看参数提醒
2.2.2.4. 定时器参数配置
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
函数解释:让程序决定第几个定时器,如何工作。
参数 1 TIMx, 第几个定时器
参数 2 :告诉程序工作方式和工作速率。
TIM_TimeBaseInitTypeDef 结构体。
结构体.TIM_ClockDivision = 时钟分频因子(输入捕获的时候用)
结构体.TIM_CounterMode = 计数方式(向上、向下);
结构体.TIM_Period = 数到多少(从0开始数的);
结构体.TIM_Prescaler = 分频系数(也是从0开始算的);
结构体.TIM_RepetitionCounter = 重复计数值(高级定时器采用);
2.2.2.5. 定时器开始工作
TIM_Cmd(TIM8, ENABLE);
函数解释:定时器开始工作
参数 1 TIMx, 第几个定时器
参数 2 ENABLE\DISENABLE
2.2.2.6. 通道参数配置
TIM_OC1Init(TIM8, &TIM_OCInitStructure);
函数解释:定时器的这个通道的工作模式。
参数 1 TIMx, 第几个定时器
参数 2 :告诉程序通道的以什么形式工作。
TIM_OCInitTypeDef 结构体名子
结构体名子.TIM_OCMode =PWM输出模式。确定哪一个有效电平和无效电平
结构体名子.TIM_OCIdleState =空闲时候是高电平还是低电平。
//结构体名子.TIM_OCNIdleState =互补通道空闲是高电平还是低电平。
结构体名子.TIM_OCPolarity = 有效电平到底是高电平还是低电平
//结构体名子.TIM_OCNPolarity = 互补通道有效电平到底是高电平还是低电平
结构体名子.TIM_OutputState =ENABLE\DISENABLE
//结构体名子.TIM_OutputNState =互补通道的ENABLE\DISENABLE
结构体名子.TIM_Pulse = 占空比,这个数字越大,有效电平占比越
大。
此次不用配互补通道的参数。占空比取值与计算如下:
TIM_OCInitStructure.TIM_Pulse= 该数值决定了有效电平持续的时间。
TIM_TimeBaseInitStruct.TIM_Period = 该数值决定一个周期的时间,进而决定频率。
有效电平占占有比例 = TIM_Pulse /(TIM_Period);
2.2.2.7. 通道开始工作
TIM_OC1PreloadConfig(TIMx,TIM_OCPreload);//通道1
TIM_OC2PreloadConfig(TIMx,TIM_OCPreload);//通道2
TIM_OC3PreloadConfig(TIMx,TIM_OCPreload);//通道3
TIM_OC4PreloadConfig(TIMx,TIM_OCPreload);//通道4
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);
函数解释:让哪一个定时器的让通道 1 开始工作。
参数 1 TIMx, 第几个定时器
参数 2 TIM_OCPreload_Enable/TIM_OCPreload_Disable
2.2.2.8. 主输出开始工作
TIM_CtrlPWMOutputs(TIM8, ENABLE);
函数解释: PWM 的输出使能。
参数 1 TIMx, 第几个定时器
参数 2 ENABLE\DISENABLE
2.2.3. 功能验证和代码整理
void TIM8_PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 开启定时器时钟,即内部时钟CK_INT=72M
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM8);
TIM_TimeBaseStructure.TIM_Period= (10000/100-1);
TIM_TimeBaseStructure.TIM_Prescaler= (8400-1);
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
TIM_Cmd(TIM8, ENABLE);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable
;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity =
TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState =
TIM_OCIdleState_Set;
TIM_OC1Init(TIM8, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);
TIM_CtrlPWMOutputs(TIM8, ENABLE);
}
void PWM_test(void)
{
TIM_SetCompare1(TIM8,5);
delay_ms(5000);
TIM_SetCompare1(TIM8,15);
delay_ms(5000);
TIM_SetCompare1(TIM8,25);
delay_ms(5000);
}
PWM 功能深入学习与理论
PWM, 是脉冲调节,进而控制了功率 p= 电压乘电流乘占空比。(原因是一个周期内的只有有效电平)。
3.1 开发任务。
任务 1 :舵机的转速控制与 PWM.
利用 PWM 技术驱动舵机,实现舵机的转速控制。
任务 2 :定时器与音律,声音音色和声音大小
自然界所有的波,就可以通过频率( hz , 振幅两个变量来描述出来。声音也是
如此。
声音的大小:主要由振幅控制。振幅大,则功率大。体现出来就是 PWM 的占空
比大。
声音的音色:主要是频率控制。音调高,则频率高。体现出来就是方波的频率
高。
void beep_set_freq(uint32_t freq)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_Period = (10000/freq)-1;
TIM_TimeBaseInitStruct.TIM_Prescaler = 8400-1;
TIM_TimeBaseInitStruct.TIM_ClockDivision =
TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode =
TIM_CounterMode_Up;
beep_cnt = TIM_TimeBaseInitStruct.TIM_Period;
TIM_TimeBaseInit(TIM13,&TIM_TimeBaseInitStruct);
}
//功率按照百分之一,调节
void beep_set_duty(uint32_t duty)
{
uint32_t cmp = (beep_cnt+1)/100 * duty;
TIM_SetCompare1(TIM13,cmp);
}