【蓝桥杯】【嵌入式组别】第十四节:PWM输出编程

2023-05-16

PWM输出编程

  • PWM输出原理
  • 单路PWM信号输出
  • 双路PWM信号输出

目的:在特定管脚上产生频率和占空比可调的方波信号。
比赛我们主要掌握PA6和PA7就可以了。

PWM输出原理

CNT: 定时器中的计数器,配置成1us增加1;
ARR: 自动重装载寄存器(相当于计数的周期),当CNT计数到ARR时,即溢出,重新开始计数;
CCRx: 比较寄存器(相当于高电平时间) ,当CNT计数到CCRx时,输出极性会翻转! (CCRx对STM32CUBE里的Pulse)
具体原理见下图:
在这里插入图片描述

单路PWM信号输出

比如本次我们让PA7输出1KHZ的方波,应该如何配置ARR重装载寄存器的值呢?
1KHZ对应的周期就是1ms,1ms就是1000微秒,所以对应的就是CNT要一微秒递增一次一共递增1000次才能到ARR。又由于ARR计数都是从0开始的,所以ARR配置为999即可实现。

在这里插入图片描述

所以我们按照上图配置好这些参数就可以了。

需要注意的是,这个“auto-reload preload”不是我们说的重装载值,而是一个很不常用的设置“预装载值”,这个启用和不启用关系不大,所以我们保持默认状态就可以了。
还有一点就是PWM输出不需要中断配置,所以不用勾选NVIC

关于下面这部分的配置:
在这里插入图片描述

这几个配置是关联起来的。“Mode”里面有两种模式,一种是“PWM mode1”,一种是“PWM mode2”,
文档里查到的定义是这样的:

  • PWM mode 1 - Channel 1 is active as long as TIM15 CNT<TIM15 CCR1
    elseinactive.
  • PWM mode 2 - Channel 1 is inactive as long as TIM15 CNT<TIM15 CCR1
    else active.

意思就是mode1代表的是当CNT< CCR1的时候采用的是不活跃状态,而mode2相反。
至于什么是活跃状态,什么是不活跃状态,则由下面的“CH Polarity”来控制,如果“CH Polarity”选择“High”,那么高电平就是活跃状态,低电平就是不活跃状态。
所以两个结合起来的意思就是,如果选择mode1并且“CH Polarity”选择“High”,那就意味着CNT< CCR1时输出的方波信号是低电平,而CNT>CCR1时输出的是高电平。我们一般都选择这种组合,比较符合直觉。而“Pulse”这个选项就是规定“活跃状态的时间”,所以我们如果上面选的组合是mode1并且“CH Polarity”选择“High”,那么此处“Pulse”就是在规定高电平的时间,那就是占空比了。
由于ARR已经被设置为了999,也就是一共1000微秒,所以Pulse为100就是占空比百分之十,Pulse为200就是占空比百分之二十。
在这里插入图片描述
所以按如上图的配置就可以了。然后直接生成代码。
在主函数中调用tim17的初始化函数之后,用hal库函数开启tim17的1通道的pwm输出即可:

	MX_TIM17_Init();
	HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);

当然我们也可以在主函数里面直接操作寄存器来更改他的频率和占空比:

TIM17->ARR=499;
TIM17->CCR1=250;

双路PWM信号输出

就是把单路的PWM代码重复一次即可。
然后在主函数中加入相应的初始化代码和开启PWM产生的代码:

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

【蓝桥杯】【嵌入式组别】第十四节:PWM输出编程 的相关文章

  • C++STL的使用心得汇总(vector,string,map,list)

    文章目录 find 函数vector的findstring的findmap的find count 函数vector的countstring的countmap的count vectorstringmap的各种排序方法转换相关 待完善 find
  • Qt 之 样式表的使用——设置样式的方法

    一 简述 我们通常在使用Qt开发的过程中都会使用样式表来美化我们的界面 xff0c 关于如何使用样式表的资料也很多 xff0c 样式表的使用方法也千变万化 为了搭建一个漂亮的界面那么必须学会如何使用样式表 xff0c Qt帮助文档中提供了非
  • 如何使QGraphicsItem不随QGraphicsView放大缩小而改变大小

    一 简述 在使用QGraphicsView过程中 xff0c 有时候我们需要对view进行缩放 xff0c 但是对于一般正常的加入view中的item都会随着view的大小变化而变化 xff0c 但是如果我们想让某些item不随view的缩
  • 【linux系统如何查看内核版本、操作系统版本等信息】

    有时候需要查看linux系统的内核版本 xff0c 可以有多种方法 xff0c 方法如下 xff1a xff08 下面以优麒麟系统为例 xff09 方法1 xff1a 打开mate终端 xff0c 在命令行输入以下命令 xff1a unam
  • 【linux系统如何安装arm交叉编译工具链】

    文章目录 前言一 arm交叉编译器介绍命名规则具体编译器 二 Arm GNU Toolchain安装总结 前言 本文简要介绍arm交叉编译器及工具链的安装方法 一 arm交叉编译器介绍 命名规则 交叉编译工具链的命名规则为 xff1a ar
  • 比较冒泡排序、选择排序和快速排序的时间(C语言实现)

    文章目录 前言代码设计代码实现运行结果结果分析稳定性测试 总结 前言 本文主要比较冒泡排序 快速排序 选择排序的时间 冒泡排序和快速排序的思想可以参考我转载的以下博文 xff1a https blog csdn net gogo0707 a
  • freertos应用程序常见错误排查

    freertos系统应用程序常见问题 对一些比较常见的问题 xff0c 下面简要的以 FAQ 问答 的形式给出可能的原因和解决方法 问题现象 xff1a 在一个 Demo 应用程序中增加了一个简单的任务 xff0c 导致应用程序崩溃 任务创
  • keil5编译工程常见问题汇总

    简介 我们在编译keil工程的时候总是遇到很多问题 xff0c 我把一些常见的问题和解决方案汇总下来 xff0c 仅供大家参考 问题汇总 问题1 问题描述 选择arm v6版本编译器 xff0c 编译keil5工程 xff0c 报错 xff
  • mdk arm debug配置

    简述 本文简要讲述启动调试之前如何配置debug 点击魔术棒 xff0c 进入debug选项界面 xff0c 如下图 xff1a 我们可以选择软件仿真 xff0c 也可以选择硬件仿真 xff08 软件仿真不需要接开发板和仿真器 xff09
  • stm32高级定时器实现pwm互补输出

    简介 stm32设备一般都有很多类型的定时器 xff0c 常见的有systick timer 基本定时器 通用定时器 高级定时器 看门狗定时器 RTC等等 xff0c 本文简单介绍高级定时器是如何实现pwm互补输出 详细 我这里使用的dev
  • shell脚本基础知识(入门)

    简介 本文会全面介绍shell脚本的基础知识 脚本格式 要把shell命令放到一个 脚本 当中 xff0c 有一个要求 xff1a 脚本的第一行必须写成类似这样的格式 xff1a bin bash bash是一个shell解释器 xff0c
  • 记ADB shell for循环踩坑

    abd 里面的shell的电脑Linux的shell有点不太一样 以下这些案例均不能执行 xff1a for i 61 1 i lt 61 100 i 43 43 do echo i done for i in 1 100 do echo
  • linux线程调度策略简述

    简述 linux系统调度执行的最小单位是线程 xff0c 线程的调度策略有以下三种 xff1a xff08 1 xff09 SCHED FIFO 其静态优先级必须设置为1 99 xff0c 这将意味着一旦线程处于就绪态 xff0c 他就能立
  • stm32串口发送接口

    简介 本文记录一下stm32标准库实现串口发送功能和接收功能的接口函数 轮询方式发送串口数据 1 标准库实现 span class token comment 61 61 61 61 61 61 61 61 61 61 61 61 61 6
  • linux系统线程池

    简述 一个进程中的线程就好比是一家公司里的员工 xff0c 员工的数目应该根据公司的业务多少来定 xff0c 太少了忙不过来 xff0c 但是太多了也浪费资源 最理想的情况是让进程有一些初始数目的线程 xff08 线程池 xff09 xff
  • STM32串口环形缓冲区

    目录 1 xff1a 概述 2 xff1a 代码 1 xff1a 概述 1 1 xff1a 本篇实现串口驱动 xff0c 实现printf函数的重定向 xff0c 实现串口的中断接受和发送 xff0c 效仿modbus协议中的3 5T超时机
  • 天地飞6通道遥控器解码

    在做四轴 xff0c 想到要改造一下遥控器 我用的是天地飞6通道2 4G版 改造的思路是这样的 xff1a 用M8单片机读取PPM信号 xff0c 用液晶显示出6个通道的解码 xff0c 当然这个解码还需要根据飞控板进行一下 校准 xff0
  • 如何计算网络协议校验和以及为什么这么计算

    一 校验和是如何计算的 xff1f 这个问题牵扯到计算机最底层最神秘的部分 二进制运算 说实话 xff0c 从学计组计统起 xff0c 我就比较讨厌思考二进制的相关运算 但毕竟是学这个的 xff0c 只好硬着头皮想了 首先发送方校验和的计算
  • JAVA又臭又长,是一门垃圾语言,早晚会被淘汰

    1 JAVA又臭又长 xff0c 是一门垃圾语言 xff0c 早晚会被淘汰 2 JAVA能做的 xff0c python 等上层解释类语言大部分都可以坐到 3 JAVA为了面向对象而面向对象 xff0c 导致程序冗长 xff0c 效率低下
  • 封装OkHttp

    懒汉 安全 加同步 私有的静态成员变量 只声明不创建 私有的构造方法 提供返回实例的静态方法 private static OkHttpClient okHttpClient 61 null private OkHttp3Util publ

随机推荐