十四、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输出实验 的相关文章

  • 处理器指令周期执行时间

    我的猜测是 no operation 内在 ARM 指令应花费 1 168 MHz 来执行 前提是每个NOP在一个时钟周期内执行 我想通过文档验证这一点 有关处理器指令周期执行时间的信息是否有标准位置 我试图确定 STM32f407IGh6
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • 解决KEIL编译慢问题

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

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • 大一自学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