速通蓝桥杯嵌入式省一教程:(六)PWM输出

news2024/12/25 9:31:21

定时器除了用于最基本的定时器计时中断以外,还可以用于输出PWM(Pulse Width Modulation)波,即脉冲宽度调制波形,也就是频率与占空比均可改变的矩形波。下面我们就使用PA1端口生成PWM波。

在Cube中,首先需要将PA1设置成定时器的通道,在这里我们选择TIM2的CH2(CHANNEL2)(注:CH后带N的意思是输出与不带N的波形反相):

接着,我们要到定时器中进行设置:

将定时器的时钟频率设置为80MHz后,这样设置得到的定时器频率(计算公式见第三节)为80,000,000/(100*200)=4kHz,而所得PWM波的频率与定时器频率一致,为4kHz。因此,我们可以通过改变时钟频率、Prescaler(分频系数)、Counter Period(计数周期,也叫AutoReload重装载值)来改变PWM波的频率。而PWM波的占空比为Pulse(也叫Compare比较值)/(Counter Period+1)(AutoReload重装载值),故通过改变比较值重装载值就可以改变PWM波的占空比为方便计算,我们通常将重装载值设置为100-1(或200-1),这样比较值(或Pulse)的值(或除以2)即为PWM波的占空比。

完成在Cube中的设置之后,在程序的初始化部分只需要开启PWM波的输出:

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);    //开启TIM2的CH2输出PWM

这样就可以在PA1通道输出频率为4kHz、占空比为10%的PWM波啦!

HAL_TIM_PWM_Start函数的声明如下:

/**
  * @brief  Starts the PWM signal generation.
  * @param  htim TIM handle
  * @param  Channel TIM Channels to be enabled
  *          This parameter can be one of the following values:
  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected
  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);

若想要在后续改变输出PWM波的频率与占空比,需要用到这两个宏定义:

pa1_autoreload = 100-1;

__HAL_TIM_SetAutoreload(&htim2, pa1_autoreload);
//修改重装载值为100-1,此时频率为80,000,000/(100*100)=8kHz

__HAL_TIM_SetCompare(&htim2, (pa1_autoreload+1)*0.1);
//因为重装载值改变,若要保持占空比不变,需要同步修改比较值,此时占空比仍为10%

这样就能得到频率为8kHz,占空比为10%的PWM波了。

下面我们以第十四届省赛题为例,总结本节所讲内容:

把要求简化为固定占空比为50%,根据第五节:交互系统的内容,当在数据界面按下B2时,进行高低频模式的切换。考虑到题目要求在5s内均匀升高或降低频率,而我们是通过改变重装载值的方式来改变频率的,因此频率与我们需要改变的量成反比关系,要求频率均匀变化,重装载值必然不能均匀变化。为尽可能增加精度,预分频系数应该设置得尽量小,使得在频率相同时,重装载值能够尽量大,这样在改变频率时能够改变的重装载值就能分得越精细。因此我们将预分频系数设为1,通过计算可得当频率为4kHz时,重装载值为20000;当频率为8kHz时,重装载值为10000

为满足题目要求在5s内切换到目标频率,步进值小于200Hz的要求,我们选择每100ms改变100Hz:

int pa1_frq = 4000;
float pa1_duty = 0.5;
int pa1_autoreload = 20000;

void change_frq(void)
{
    if (pa1_frq == 4000)
    {
        while (pa1_frq < 8000)
        {
            pa1_frq += 100;
            pa1_autoreload = 80000000/pa1_frq;                          //公式计算重装载值
            __HAL_TIM_SetAutoreload(&htim2, pa1_autoreload);            //改变频率
            __HAL_TIM_SetCompare(&htim2, int(pa1_autoreload*pa1_duty)); //保持占空比不变
            LED_Toggle(LD2);
            HAL_Delay(100);                                             //每100ms改变一次
        }
    }

    else if (pa1_frq == 8000)
    {
        while (pa1_frq > 4000)
        {
            pa1_frq -= 100;
            pa1_autoreload = 80000000/pa1_frq;                          //公式计算重装载值
            __HAL_TIM_SetAutoreload(&htim2, pa1_autoreload);            //改变频率
            __HAL_TIM_SetCompare(&htim2, int(pa1_autoreload*pa1_duty)); //保持占空比不变
            LED_Toggle(LD2);
            HAL_Delay(100);                                             //每100ms改变一次
        }
    }
}

将函数change_frq封装到task库中,并在上一节内容中已经写好的key_pro函数中调用此函数,即可完成按键改变高低频模式的要求。

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

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

相关文章

Android LiveData原理之-setValue和数据倒灌原理分析

一图胜万言&#xff0c;直接上图吧&#xff01;有需要的同学们可以对着这张泳道图阅读源码&#xff0c;相信能够快速加深理解。

3:Ubuntu上配置QT交叉编译环境并编译QT程序到Jetson Orin Nano(ARM)

1.Ubuntu Qt 配置交叉编译环境 1.1 ubuntu 20.04安装Qt sudo apt-get install qtcreator 1.2 配置QT GCC配置同上 最后配置Kits 上面设置完成之后 &#xff0c;设置Kits 中的Device(这是为了能够直接把项目部署到arm设备上) 点击NEXT之后会出现连接被拒绝&#xff0c;不用担…

IEC61499/ OPCUA pub/sub 测试

OpenDACS 是基于OPCUA 信息模型的IEC61499 分布式自动控制系统。本文介绍它如何采用Opcua Pub/Sub 实现分布式设备中功能块之间的通信。 4diac 构建IEC61499 系统和应用 系统结构 试验系统共有三台设备&#xff0c;为了实验方便&#xff0c;我们让它们在一台Linux PC 上运行…

智能文件改名,一键与上上级目录名称同步,让文件整理更加便捷

在整理文件时&#xff0c;经常会遇到需要将文件名称与上上级目录名称保持一致的情况。手动逐个修改文件名不仅费时费力&#xff0c;还容易出错。现在&#xff0c;我们为你带来了一款智能文件改名工具&#xff0c;让你能够一键将文件名称改成跟上上级目录名称一样&#xff0c;让…

Qt+C++跑马灯-指示灯-风扇-虚线灯带-动画仿真

程序示例精选 QtC跑马灯-指示灯-风扇-虚线灯带-动画仿真 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC跑马灯-指示灯-风扇-虚线灯带-动画仿真>>编写代码&#xff0c;代码整…

Vulnhub靶机系列 Infosec_Warrior1

InfoSecWarrior CTF 2020: 01官网地址 难易程度&#xff1a;So Easy 信息收集 主机发现 arp-scan -l端口扫描 nmap -A -p- 192.168.80.145目录爆破 dirsearch -u 192.168.80.145 -i 200访问80端口&#xff0c;只能看出是Apache站点&#xff0c;没有别的 访问一下sitemap.xm…

火山引擎ByteHouse:一套方案,让OLAP引擎在精准投放场景更高效

由于流量红利逐渐消退&#xff0c;越来越多的广告企业和从业者开始探索精细化营销的新路径&#xff0c;取代以往的全流量、粗放式的广告轰炸。精细化营销意味着要在数以亿计的人群中优选出那些最具潜力的目标受众&#xff0c;这无疑对提供基础引擎支持的数据仓库能力&#xff0…

开源ChatGPT系统源码 采用NUXT3+Laravel9后端开发 前后端分离版本

开源ChatGPT系统源码 采用NUXT3Laravel9后端开发 前后端分离版本 ChatGPT是一种基于AI的聊天机器人技术&#xff0c;它可以帮助用户与聊天机器人进行自然语言交流&#xff0c;以解决用户的问题或满足用户的需求。ChatGPT的核心技术是使用自然语言处理&#xff08;NLP&#xff…

设计模式之组合模式(Composite)的C++实现

1、组合模式的提出 在软件开发过程中&#xff0c;使用者Client过多依赖所操作对象内部的实现结构&#xff0c;如果对象内部的实现结构频繁发生变化&#xff0c;则使用者的代码结构将要频繁地修改&#xff0c;不利于代码地维护和扩展性&#xff1b;组合模式可以解决此类问题。组…

JQuery快速入门教程

1、JQuery快速入门 1.1、JQuery介绍 jQuery 是一个 JavaScript 库。所谓的库&#xff0c;就是一个 JS 文件&#xff0c;里面封装了很多预定义的函数&#xff0c;比如获取元素&#xff0c;执行隐藏、移动等&#xff0c;目的就 是在使用时直接调用&#xff0c;不需要再重复定义…

蓝牙 - BLE SPP的设计策略(Serial over BLE strategy)

在开发 BLE 连接产品的过程中&#xff0c;你可能会有这样的疑问&#xff1a;"Serial profile在哪里&#xff1f;也许你以为你在蓝牙技术联盟网站上滚动浏览长长的profile列表时错过了它。又或者&#xff0c;你根本就没去看&#xff0c;而是准备选择更快的方法&#xff0c;…

第 359 场 LeetCode 周赛题解

A 判别首字母缩略词 签到题… class Solution { public:bool isAcronym(vector<string> &words, string s) {string pf;for (auto &s: words)pf.push_back(s[0]);return pf s;} };B k-avoiding 数组的最小总和 贪心&#xff1a;从 1 1 1开始升序枚举&#xff0c…

mybatis-plus--配置-(sql)日志输出-自动填充-分页-多数据源-逻辑删除

写在前面&#xff1a; 本文主要介绍mybatis-plus的配置&#xff0c;以后在有的时候在补充。欢迎交流。 文章目录 日志输出自动填充分页全局字段配置多数据源 日志输出 调试的时候需要看执行的sql&#xff0c;这时候就很需要日志来记录查看了。 mybatis-plus的日志配置在yml…

葡萄目标检测(yolov8模型,无需修改路径,python代码,解压缩后直接运行)

运行效果视频&#xff1a;葡萄目标检测&#xff08;yolov8模型&#xff0c;无需修改路径&#xff0c;python代码&#xff0c;解压缩后直接运行&#xff09;_哔哩哔哩_bilibili 1.采用yolov8模型 models文件夹保存的是yolov8的训练好的模型参数 PinotNoir文件夹存放的是训练集 …

局部变量可能会引发的错误---误判---用阶乘函数求强数的 Python 程序中遇到的问题

背景介绍 今天遇到这样一个额需求&#xff1a;用阶乘函数求强数的 Python 程序。所谓强数&#xff0c;就是一个特殊数字&#xff0c;满足其所有数字阶乘的和应等于数字本身的条件。 问题描述 def facorial_of_number(number):result 1for i in range(1, number 1):result *…

如何使用Python实现遥感彩色合成?

综述 遥感影像真彩色合成是一种将多光谱遥感影像转换为真实感彩色影像的技术。它通过将不同波段的遥感数据进行组合&#xff0c;以模拟人眼对地物颜色的感知&#xff0c;从而提供更直观、更易于理解的影像信息。 库索引名&#xff1a;arcpy.CompositeBands_management 通过不同…

如何在window下cmd窗口执行linux指令?

1.Git&#xff1a;https://git-scm.com/downloads(官网地址) 2.根据自己的实际路径,添加两个环境变量 3.重启电脑

[oneAPI] 使用Bert进行中文文本分类

[oneAPI] 使用Bert进行中文文本分类 Intel Optimization for PyTorch基于BERT的文本分类模型数据预处理数据集定义tokenize建立词表转换为Token序列padding处理与mask 模型 结果OneAPI参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517…

标速高就是好?不看4K随机就别买SSD!

游戏玩家心心念念的SSD终于降到了白菜价&#xff0c;1TB的固态硬盘甚至比机械硬盘都便宜了&#xff0c;不过如果只看到动辄3000MB/s的读速&#xff0c;那你下单的时候还真的会被骗。 之所以这么说&#xff0c;是因为商品页面标注的速度都是连续读写速度&#xff0c;也就是直接向…