STM32-TIM定时器与PWM输出

devtools/2024/9/25 2:04:35/
学习目标:
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);
}


http://www.ppmy.cn/devtools/16432.html

相关文章

Spring 数据脱敏实现方式

1、前言 当前互联网中,越来越重视数据安全,数据脱敏在实际应用中越来越多。 2 、脱敏方式 2.1 数据库sql 语句脱敏 sql 语句脱敏是比较传统通用的,例子如下所示: select CONCAT(LETF(mobile,3),"*****",RIGHT(mobile,…

Linux内核驱动开发-001字符设备开发-内核中断驱动独立按键+等待队列优化

1驱动程序 /*************************************************************************> File Name: key_wait.c> Author: yas> Mail: rage_yashotmail.com> Created Time: 2024年04月23日 星期二 13时20分42秒**********************************************…

如何在 CentOS 7 上配置 WordPress 并解决常见问题

如何在 CentOS 7 上配置 WordPress 并解决常见问题 在本文中,我将指导如何在 CentOS 7 上安装和配置 WordPress,以及如何解决配置过程中可能遇到的一些常见问题。 步骤 1: 安装 LEMP (Linux, Nginx, MySQL, PHP) 栈 WordPress 需要一个 web 服务器&am…

FPM 快速报表开发

背景: 使用FPM开发报表时,如果报表字段过多,页面拖拽等操作不方便 报表数量过多时,新建应用操作步骤较为繁琐 更习惯通过少量代码而非页面操作去实现功能 处理: 将FPM报表开发简化为类似GUI端ALV的开发过程:&#xff…

搭建JMeter+Grafana+influxdb性能测试监控平台

保姆级教程参考:https://blog.csdn.net/wqda125/article/details/130853557 非常详细,包括windows/mac环境下搭建、liunx环境下搭建、docker容器下搭建;再次就不再赘述,就动手实践搭建性能监控体系吧 我本地笔记本是参考了docker…

03-JAVA设计模式-备忘录模式

备忘录模式 什么是备忘录模式 Java中的备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以将对象恢复到原先保存的状态…

永恒之蓝ms17-010的利用

永恒之蓝ms17-010的利用 实验环境: Kali虚拟机:攻击机 Win7虚拟机:目标机 主要工具:metasploit ##获取meterpreter 使用关键字17-010在metasploit中查找 msf5 > search 17-010Matching Modules # Name …

2024贵州康博会|特色健康食品展|医药展|医疗器械展会

2024 中国(贵州)大健康产业博览会2024 特色食品(农产品、水、饮料)暨第22届医药及医疗器械、设备展览会邀请函 时间:2024 年 9 月 26 日 -28 日(共三天) 地点:贵阳国际会议展览中心 (观山湖区) 主办单位: 贵州省天然饮用水行业协会 贵州省大健康产业…