十四、pwm输出实验

2023-11-16

一、pwm的概述

1.pwm的工作原理

图中,假定定时器工作在向上计数
PWM 模式,且当 CNT<CCRx 时,输出 0 ,当 CNT>=CCRx 时输出 1 。那么就可以得到如上的
PWM 示意图:当 CNT 值小于 CCRx 的时候, IO 输出低电平 (0) ,当 CNT 值大于等于 CCRx
时候, IO 输出高电平 (1) ,当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次
循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM
输出的频率,这就是 PWM 输出的原理。

2.工作过程(以通道1为例)

CCR1:捕获比较(值)寄存器(X=1,2,3,4):设置比较值。

CCMR1: OC1M[2:0]位:
对于PWM方式下,用于设置PWM模式1【110】 或者PWM模式2【111】
CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。
CCER:CC1E位:输入捕获1输出使能。0:关闭,1:打开。

二、寄存器的介绍

1.捕获/比较模式寄存器(TIMx_CCMR1/2)

该寄存器总共有 2 个, TIMx _CCMR1 和 TIMx _CCMR2 TIMx_CCMR1 控制 CH1 2 ,而 TIMx_CCMR2 控制 CH3 4 。该寄存器 的各位描述如图 所示:

2.捕获/比较使能寄存器(TIMx_CCER

该寄存器控制着各个输入输出通道的开关。 
该寄存器比较简单,我们这里只用到了 CC1E 位,该位是输入 / 捕获 1 输出使能位,要想
PWM IO 口输出,这个位必须设置为 1 ,所以我们需要设置该位为 1

3.捕获/比较寄存器(TIMx_CCR1~4

该寄存器总共有 4 个,对应 4 个输通道 CH1~4
在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果产生相应动作。利用这点,
我们通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽了。

三、函数的配置步骤

1.开启 TIM1 时钟,配置 PA8 为复用输出。

要使用 TIM1 ,必须先开启 TIM1 的时钟。
这里还要配置 PA8 为复用输出(当然还要时能 PORTA 的时钟),这是因为 TIM1_CH1
道将使用 PA8 的复用功能作为输出。库函数使能 TIM3 时钟的方法是:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器 3 时钟
设置 PA8 为复用功能输出的方法
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

2.设置 TIM1 ARR PSC

在开启了 TIM1 的时钟之后,要设置 ARR PSC 两个寄存器的值来控制输出 PWM
周期。当 PWM 周期太慢(低于 50Hz )的时候,就会明显感觉到闪烁了。因此, PWM
期在这里不宜设置的太小。这在库函数是通过 TIM_TimeBaseInit 函数实现的,调用的格式为:
TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化 TIMx 的

3.设置 TIM1_CH1 PWM 模式及通道方向, 使能 TIM1 CH1 输出。

接下来,要设置 TIM1_CH1 PWM 模式(默认是冻结的),因为的 DS0 是低电
平亮,而希望当 CCR1 的值小的时候, DS0 就暗, CCR1 值大的时候, DS0 就亮,所以我 要通过配置 TIM1_CCMR1 的相关位来控制 TIM1_CH1 的模式。在库函数中, PWM 通道设
置是通过函数 TIM_OC1Init()~TIM_OC4Init() 来设置的,不同的通道的设置函数不一样,这里我 使用的是通道 1 ,所以使用的函数是 TIM_OC1Init()
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
这种初始化格式大家学到这里应该也熟悉了,所以直接来看看结构体 TIM_OCInitTypeDef
的定义:
typedef struct
{
uint16_t TIM_OCMode;
uint16_t TIM_OutputState;
uint16_t TIM_OutputNState; */
uint16_t TIM_Pulse;
uint16_t TIM_OCPolarity;
uint16_t TIM_OCNPolarity;
uint16_t TIM_OCIdleState;
uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;
这里我们讲解一下与要求相关的几个成员变量:
TIM_OCMode 设置模式是 PWM 还是输出比较,这里我们是 PWM 模式。
参数 TIM_OutputState 用来设置比较输出使能,也就是使能 PWM 输出到端口。
参数 TIM_OCPolarity 用来设置极性是高还是低。
其他的参数 TIM_OutputNState TIM_OCNPolarity TIM_OCIdleState TIM_OCNIdleState
高级定时器 TIM1 TIM8 才用到的。
要实现我们上面提到的场景,方法是:
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //初始化 TIM1 OC1

4.使能 TIM1

在完成以上设置了之后,需要使能 TIM1 。使能 TIM1 的方法:
TIM_Cmd(TIM1, ENABLE); //使能 TIM1

5.设置 MOE 输出,使能 PWM 输出。

普通定时器在完成以上设置了之后,就可以输出 PWM 了,但是高级定时器,还需要
使能刹车和死区寄存器( TIM1_BDTR )的 MOE 位,以使能整个 OCx (即 PWM )输出。库函
数的设置函数为:
TIM_CtrlPWMOutputs(TIM1,ENABLE);// MOE 主输出使能

6.修改 TIM1_CCR1 来控制占空比。

最后,在经过以上设置之后, PWM 其实已经开始输出了,只是其占空比和频率都是固定
的,而我们通过修改 TIM1_CCR1 则可以控制 CH1 的输出占空比。继而控制 DS0 的亮度。
在库函数中,修改 TIM1_CCR1 占空比的函数是:
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
理所当然,对于其他通道,分别有一个函数名字,函数格式为 TIM_SetComparex(x=1,2,3,4)

以上皆是对 正点原子stm32单片机的复习笔记 如有侵权立刻删 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

十四、pwm输出实验 的相关文章

  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015

随机推荐

  • 大一自学Java到毕业,学会这些内容,就可以进大厂

    我就是自学Java进的大厂 学校很普通一个不知名的二本 专业是计算机专业 不过在学校学不到什么 基本都是靠自学 我们班进一线大厂的人有6个 我就是其中一个 剩下的人大部分去考研了 下面这个学习安排就是我在大学自学的内容 就适合时间多的大学生
  • 动手学CV-目标检测入门教程6:训练与测试

    3 6 训练与测试 本文来自开源组织 DataWhale CV小组创作的目标检测入门教程 对应开源项目 动手学CV Pytorch 的第3章的内容 教程中涉及的代码也可以在项目中找到 后续会持续更新更多的优质内容 欢迎 如果使用我们教程的内
  • 《软件方法》书中自测题大全-题目全文+分卷自测

    已经根据最新版本内容更新了在线题库 以下是 软件方法 1 8章中的自测题 答案不直接给出 可访问每套题后面的自测链接或扫二维码自测 做到全对才能知道答案 知识点见 软件方法 http www umlchina com book softme
  • Latex 字母上方箭头

    字母上方右箭头 mathop A limits rightarrow A mathop A limits rightarrow A 或者 vec A
  • 一款使用 Jetbrains IDE 开发事半功倍的工具

    使用 Jetbrains 公司开发软件的小伙伴一般都用 Toolbox App 来管理自己的开发软件 这个管理工具使用起来非常舒服 包括安装 更新 还等随心所欲的回滚和降级 这大大节省了维护IDE的时间和精力 IDE 管理 随心打开任意项目
  • c++类成员初始化方式

    转载自 https blog csdn net coder xia article details 7447822 常用的初始化可能如下 1 赋值初始化 class Student public Student string in name
  • 一个主设备号是如何支持多个次设备?

    1 主次设备号 参考博客 字符设备驱动详解 主次设备号 注册 卸载字符设备驱动 创建设备节点 地址映射 2 次设备号介绍 1 在老的驱动程序里是不需要次设备号的 在老版内核中注册驱动用register chrdev 函数 只需要传入主设备号
  • 自旋锁(spinlock) 解释得经典,透彻

    自旋锁与互斥锁有点类似 只是自旋锁不会引起调用者睡眠 如果自旋锁已经被别的执行单元保持 调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁 自旋 一词就是因此而得名 由于自旋锁使用者一般保持锁时间非常短 因此选择自旋而不是睡眠是非常必
  • 解决提示“Warning File ‘CMakeFilesxxxxxx.dirprogress.make‘ has modification time 2.4 s in the future”方法

    问题描述 今天分享一个我自己之前在使用虚拟机中使用cmake进行编译连接时候产生的一个告警提示 首先看告警提示 Warning File CMakeFiles xxxxxx dir progress make has modificatio
  • SMT HT CMP SMP

    1 多线程 同时多线程 Simultaneous multithreading 简称 SMT SMT 可通过复制处理器上的结构状态 让同一个处理器上的多个线程同步执行并共享处理器的执行资源 可最大限度地实现宽发射 乱序的超标量处理 提高处理
  • 多版本node的安装与切换详细操作

    多版本node的安装与切换详细操作 安装多版本node的原因 方法一 利用nvm进行管理 NVM 简介 安装前须知 卸载已安装的nodeJS nvm 的安装与使用 node 的不同版本安装及切换 方法二 通过配置环境变量 切换node时只需
  • Spark课程设计——电影推荐系统

    题目所需数据集及相应信息描述 数据集 1 用户评分数据集ratings dat 包含了大量用户的历史评分数据 2 样本评分数据集personalRatings dat 包含了少数几个用户的个性化评分数据 这些数据反映了某个用户的个性化观影喜
  • python3 隐藏print的标准输出

    在使用python调用函数时 想将函数中的print输出禁止掉又不想改函数的代码 可以定义如下HiddenPrints类解决 class HiddenPrints def enter self self original stdout sy
  • 二、Spring IoC 容器

    IOC容器及相关概念 什么是 IOC 控制反转 把对象创建和对象之间的调用过程 交给 Spring 容器来管理 使用 IOC 的目的 为了解耦合 IOC 的底层原理 XML 解析技术 工厂模式 反射 IOC 目的 最低限度降低类与类之间的耦
  • landsat8数据下载教程

    Landsat下载地址 我们最常用的下载地址是USGShttps earthexplorer usgs gov 这是一个提供Landsat和其他卫星影像数据的官方网站 如果您还没有USGS EarthExplorer账户 请点击网站右上角的
  • OpenCV入门学习(五)处理视频帧

    opencv2 vs2010 opencv不仅可以播放视频 还可以对视频进行处理 并输出处理后的视频 本文以提取视频canny边缘为例 编写程序如下 include
  • IDEA中将maven项目导出打包成war包

    点击File gt Project Structure gt Artifacts gt add 号 gt Web Application Archive gt For yourProjectName 在这里选择你要导出的war包存放的路径
  • flex布局中的align-content属性

    align content属性起作用的条件 对父元素设置自由盒属性display flex 并且设置排列方式为横向排列flex direction row 默认值 设置换行 flex wrap wrap Demo代码
  • 程序员技术练级攻略

    原文地址 http coolshell cn articles 4990 html 月光博客6月12日发表了 写给新手程序员的一封信 翻译自 An open letter to those who want to start program
  • 十四、pwm输出实验

    一 pwm的概述 1 pwm的工作原理 图中 假定定时器工作在向上计数 PWM 模式 且当 CNT