STM32-TIM定时器与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);
}
相关推荐
HQB202612 小时前
EG1198|屹晶微电子 120V 内置 MOS 异步降压 DC‑DC(高性价比)
嵌入式硬件·硬件工程
果壳science14 小时前
张祥前实验如何获取正电荷
笔记·科技·嵌入式硬件·硬件工程·制造
南山电子nscn14 小时前
中科芯CETC汽车电池管理系统BMS进口芯片国产型号替代指南
单片机·汽车·bms
沉淀的.晴天14 小时前
can总线
stm32
桀人15 小时前
认识AT24C02
stm32·单片机·嵌入式硬件
国科安芯16 小时前
星间激光通信终端CANFD控制网络的时延确定性与辐射可靠性
网络·嵌入式硬件·信息与通信·canfd·低轨卫星·商业航天·抗辐射
一直C16 小时前
嵌入式 Linux 驱动开发学习笔记:内核定时器、platform 总线与 I²C 驱动
linux·驱动开发·嵌入式硬件·学习·imx6ull
传感器与混合集成电路16 小时前
150MHz主频、8路DAC与6路PWM:JLH221360伺服控制SIP解析
嵌入式硬件
comyccccc16 小时前
STM32PID控制板设计全解析学习笔记
单片机·嵌入式硬件
碧海银沙音频科技研究院17 小时前
实现炬芯ATS308X的usb cdc 串口IAP 固件升级功能实现
人工智能·嵌入式硬件·深度学习·算法