STM32定时器应用:PWM输出技术

学习目标:

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);
}

作者:StayZ

物联沃分享整理
物联沃-IOTWORD物联网 » STM32定时器应用:PWM输出技术

发表回复