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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/830131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AOMEI Partition Assistant傲梅分区助手技术员版:专业级的硬盘分区利器

在数字化时代,数据存储和管理变得愈发重要。对于电脑技术员而言,一款功能强大、操作简便的分区工具无疑是提高工作效率的得力助手。而傲梅分区助手技术员版(AOMEI Partition Assistant)正是这样一款备受赞誉的专业级硬盘分区软件。…

Day23.一刷数据结构算法(C语言版) 39组合总和;40组合总和II;131分割回文串

一、39组合总和 本题是集合里元素可以用无数次,那么和组合问题的差别,其实仅在于对startIndex上的控制 题目链接:组合总和 文章讲解:代码随想录 视频讲解:带你学透回溯算法-组合总和 (39.组合总和&#xff…

从零开始构建大语言模型(MEAP)

原文:annas-archive.org/md5/c19a4ef8ab1664a3c5a59d52651430e2 译者:飞龙 协议:CC BY-NC-SA 4.0 一、理解大型语言模型 本章包括 大型语言模型(LLM)背后的基本概念的高层次解释 探索 ChatGPT 类 LLM 源自的 Transfo…

workminer之dht通信部分

workminer是通过SSH爆破传播的挖矿木马,感染后会释放xmrig挖矿程序利用主机的CPU挖取北方门罗币。该样本能够执行特定的指令,指令保存在一个配置文件config中,config文件类似于xml文件,里面有要执行的指令和参数,样本中…

spring cloud eureka 初始化报错(A bean with that name has already been defined)

报错内容 The bean ‘eurekaRegistration’, defined in class path resource [org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration E u r e k a C l i e n t C o n f i g u r a t i o n . c l a s s ] , c o u l d n o t b e r e g i s t e r e d . A …

回归预测 | Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络多输入单输出回归预测

回归预测 | Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络多输入单输出回归预测 目录 回归预测 | Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络…

《QT实用小工具·四十五》可以在界面上游泳的小鱼

1、概述 源码放在文章末尾 该项目实现了灵动的小鱼&#xff0c;可以在界面上跟随鼠标点击自由的游泳&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include "magicfish.h" #include <QtMath> #include <QPainter>…

C++:map和set的封装

关于红黑树的模拟实现&#xff0c;大家不清楚的先去看看博主的博客再来看这篇文章&#xff0c;因为set和map的封装底层都是利用用的红黑树。所以这里不会过多介绍红黑树的相关内容&#xff0c;而更多的是去为了契合STL中的红黑树去进行改造&#xff0c;让封装的set和map能够去复…

CMake使用

一、CMake 是什么 CMake 是一个跨平台的自动化构建系统&#xff0c;它使用配置文件 CMakeLists.txt 来管理软件构建过程。CMake 基于 Makefile 做了二次开发。 二、单个文件目录 # CMake 最低版本号要求 cmake_minimum_required(VERSION 3.16.3)# 工程名 project(CMakeSingle)…

uniapp自定义返回事件(封装)

uniapp自定义返回事件 在我们使用uniapp时&#xff0c;我们导航栏一般都是自定义的&#xff0c;比如用uview框架的导航栏&#xff0c;那么返回事件通常会遇到以下几个问题 返回事件前需要做一些额外的处理 h5项目刷新页面后返回失效 返回按钮点击后到指定页面 如果只是监听返…

PhotosCollage for Mac:优雅且实用的照片拼贴软件

PhotosCollage for Mac是一款优雅且实用的照片拼贴软件&#xff0c;为Mac用户提供了一个便捷、高效的平台&#xff0c;以创建精美、个性化的照片拼贴作品。 PhotosCollage for Mac v1.4.1激活版下载 该软件界面简洁直观&#xff0c;操作便捷。用户只需将想要拼贴的照片拖入“照…

CSS基础:position定位的5个类型详解!

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

Andorid复习

组件 TextView 阴影 android:shadowColor"color/red" 阴影颜色android:shadowRadius"3.0" 阴影模糊度&#xff08;大小&#xff09;android:shadowDx"10.0" 横向偏移android:shadowDy"10.0" 跑马灯 这里用自定义控件 public cla…

日本极致产品力 | 源自内蒙古,日本99.7%的人都喝过都百年畅销饮料

​《极致产品力》日本深度研学是一个顾问式课程,可以帮助企业找产品、找方向、找方法,在日本终端市场考察中洞悉热销产品背后的成功逻辑,了解最新最前沿的产品趋势和机会。结合日本消费趋势中国转化的众多经验,从品牌、包装、卖点、技术和生产工艺等多方面寻找中国市场的解决方…

WIFI/BT中蓝牙的硬件资源是如何调度的 UART和PCM接口传输的是什么信号

安卓或IOS手机中&#xff0c;wifi/bt中的蓝牙是如何调度硬件资源的&#xff0c;尤其是UART和PCM是如何分配的。M.2 wifi/bt模块或其他形式的模块中&#xff0c;蓝牙是如何调度硬件资源的&#xff0c;尤其是UART和PCM是如何分配的。今天我们就图文并茂的解决这个问题。 蓝牙文件…

新买的设备自带的仪器校准证书,是否可以作为校准报告使用?

设备在刚刚购买时&#xff0c;有些商家会承诺&#xff0c;在交付设备的同时&#xff0c;还会交付设备的校准证书&#xff0c;这证书是附赠的&#xff0c;属于商家给客户的一种福利&#xff0c;面对附赠的仪器校准证书&#xff0c;很多客户也会有疑惑&#xff0c;这附赠的证书有…

UTONMOS:用区块链技术拓展商业边界在哪里?

引言 大约从 2021 年Web 3 这个新概念开始受到风险基金和科技圈的普遍关注。但如果你对过去几年区块链的发展历史足够了解&#xff0c;就应该已经意识到现在的 Web 3 并不是什么新技术&#xff0c;甚至不是旧技术的进步&#xff0c;它只是一个基于区块链技术的宏大构想。 我是…

Unity 如何制作和发布你的 Package

一、制作你的第一个 Package Unity Package 不做过多赘述&#xff0c;像 URP 本质上也是一个 Package&#xff0c;在 Unity 中可以通过菜单栏 → Window → Package manager 来管理你当前的所有 Package 本篇文章主要介绍&#xff1a;如何制作并发布属于你的 Package 1.1 Pac…

自制贪吃蛇小游戏

此片文章涉及到到控制台设置的相关操作&#xff0c;虚拟键码&#xff0c;宽字符输出等&#xff0c;有些地方大家可能会看不懂&#xff0c;可以阅读以下文章来进一步了解&#xff1a; 控制台程序设置-CSDN博客 效果展示&#xff1a; QQ2024428-181932 源码已放在文章结尾 目录 …

Graph Neural Networks(GNN)学习笔记

本学习笔记的组织结构是&#xff0c;先跟李沐老师学一下&#xff0c;再去kaggle上寻摸一下有没有类似的练习&#xff0c;浅做一下&#xff0c;作为一个了解。 ———————————0428更新—————————————— 课程和博客看到后面准备主要看两个&#xff1a;GCN和…