蓝桥杯嵌入式学习记录——PWM输出

目录

一、PWM原理介绍

二、学习目的

三、cubeMX的配置

四、PWM输出代码


一、PWM原理介绍

        PWM(Pulse Width Modulation,脉宽调制)是一种通过改变信号的脉冲宽度控制电平的技术。它通过调整脉冲信号的占空比(高电平时间与周期的比例)来实现对电压或电流的精确控制。

PWM的原理可以简单描述为以下几个步骤:

  1. 选择一个固定的周期:PWM信号由一系列周期性的脉冲组成,其中周期是固定的,表示脉冲信号的重复时间。

  2. 设置一个目标值:根据需要控制的设备或系统,设置一个目标值,例如期望的电压或电流。

  3. 比较目标值和当前值:将目标值与一个计数器进行比较,该计数器在每个周期内递增。如果目标值大于计数器的当前值,则输出高电平;如果目标值小于计数器的当前值,则输出低电平。

  4. 调整占空比:通过调整目标值与计数器的比较关系,可以改变脉冲信号的占空比。占空比越大,高电平时间越长,输出电平的平均值也就越高;占空比越小,高电平时间越短,输出电平的平均值也就越低。

  5. 输出PWM信号:根据比较结果,生成相应的脉冲信号。通常,高电平表示逻辑1或高电平电压,低电平表示逻辑0或低电平电压。

二、学习目的

        我们今天的学习目的是完成第十一届蓝桥杯嵌入式真题中的两路PWM输出部分,通过PA6、PA7两个引脚输出PWM脉冲,频率分别为100MHz、200MHz,并且通过两个按键来分别调节两路PWM输出的占空比,每次按下按键增加10%的占空比。

三、cubeMX的配置

我们需要通过定时器来完成PWM的输出,所以需要设置两个引脚为PWM输出引脚

1、打开cubeMX,选择PA6、PA7引脚并设置为定时器引脚

由上图可知,将PA6设置为TIM16_CH1,PA7设置为TIM17_CH1

这是因为我们需要选择通道1进行输出,而同为通道1的TIM3在上一节按键的使用中已经被用作按键的中断定时器,所以选择定时器16、17的通道1来进行PWM输出

2、点击Timers,选择TIM16、TIM17,勾选Activated打开使能,选择PWM Generation CH1

然后设置分频系数,预分频器值设置为8000-1数器重载值设置为100-1,此时脉冲频率为100MHz

同理,预分频器值设置为4000-1数器重载值设置为100-1,此时脉冲频率为200MHz

公式如下:

定时时间 = (预分频器值\times计数器重载值)/ 定时器时钟频率

脉冲频率 = 1 / 定时时间

3、设置脉冲数为20

四、PWM输出代码

        由于定时器的代码在cubeMX配置完成后就会自动生成,所以只需要在主函数中调用以下函数来启动定时器16、17:

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

再用以下函数设置占空比即可:

__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, pa6_duty);__HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1, pa7_duty);

其中pa6_duty和pa7_duty是占空比,范围是10-90

与PWM输出相关的主函数代码如下:

main.c

// main.c#include "main.h"
#include "tim.h"
#include "gpio.h"#include "led.h"
#include "lcd.h"
#include "interrupt.h"
#include "stdio.h"...  // 省略部分初始代码extern struct keys key[];
uchar pa6_duty = 10;       // 定义占空比
uchar pa7_duty = 10;       // 定义占空比char view = 0;             // 用于表示界面 0 or 1
char text[30];             // LCD显示的内容
void key_proc(void)        // 通过按键来切换界面、调节PWM占空比
{if(key[3].flag == 1){view =! view;key[3].flag = 0;}if(key[0].flag == 1){pa6_duty += 10;if(pa6_duty >= 100) pa6_duty = 10;__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, pa6_duty);key[0].flag = 0;}if(key[1].flag == 1){pa7_duty += 10;if(pa7_duty >= 100) pa7_duty = 10;__HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1, pa7_duty);key[1].flag = 0;}
}void disp_proc(void)      // 界面的切换
{if(view == 0){sprintf(text, "       Para");LCD_DisplayStringLine(Line0,(unsigned char *)text);LCD_DisplayStringLine(Line1,(unsigned char *)"                    ");LCD_DisplayStringLine(Line2,(unsigned char *)"                    ");}if(view == 1){sprintf(text, "       DATA");		LCD_DisplayStringLine(Line0,(unsigned char *)text);sprintf(text, "    PA6:%d / 100     ", pa6_duty);LCD_DisplayStringLine(Line1,(unsigned char *)text);sprintf(text, "    PA7:%d / 100     ", pa7_duty);LCD_DisplayStringLine(Line2,(unsigned char *)text);		}
}int main()
{
...// 省略部分初始代码LCD_Init();                // LCD的初始化LCD_Clear(Blue);LCD_SetBackColor(Blue);LCD_SetTextColor(White);HAL_TIM_Base_Start_IT(&htim3);              // 开启定时器3HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);  // 开启定时器16HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);  // 开启定时器17while(1)
{disp_proc();key_proc();	
}
}

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

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

相关文章

Spring 用法学习总结(四)之 JdbcTemplate 连接数据库

🐉目录 9 JdbcTemplate 9 JdbcTemplate Spring 框架对 JDBC 进行了封装,使用 JdbcTemplate 方便实现对数据库操作 相关包: 百度网盘链接https://pan.baidu.com/s/1Gw1l6VKc-p4gdqDyD626cg?pwd6666 创建properties配置文件 💥注意…

Mybatis Day02

增删改查 环境准备 创建一个emp表创建一个新的springboot工程,选择mysql、lombok、mybatis依赖application.properties中引入数据库连接信息创建对应的实体类Emp准备Mapper接口EmpMapper,mapper代表程序运行时自动创建接口的代理对象,并放入…

[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注:等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

大学的英语搜题软件有哪些?大学生必知技巧:如何更好地利用搜题工具? #笔记#学习方法

在这个信息爆炸的时代,合理利用学习工具可以帮助我们过滤和获取有用的知识。 1.智能翻译官 这是一款多语言在线翻译神器,除了最基础的英语以外,还支持日语、德语、俄语、法语等几十种语言文本翻译和拍照翻译,并且还支持语音翻译…

c语言操作符(上)

目录 ​编辑 原码、反码、补码 1、正数 2、负数 3、二进制计算1-1 移位操作符 1、<<左移操作符 2、>>右移操作符 位操作符&、|、^、~ 1、&按位与 2、|按位或 3、^按位异或 特点 4、~按位取反 原码、反码、补码 1、正数 原码 反码 补码相同…

基于BitVM的乐观 BTC bridge

1. 引言 前序博客&#xff1a; 区块链互操作协议Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM&#xff1a;Bitcoin的链下合约 基于BitVM的乐观 BTC bridge&#xff1a; Trust-minimized two-way peg 机制 BitVM BTC bridge背后的主要思想是&#xff1a; 为比…

FT2232调试记录(3)

FT2232调试记录&#xff08;1&#xff09;: FT2232调试记录&#xff08;2&#xff09;: FT2232调试记录&#xff08;3&#xff09;: FT2232 SPI读写函数: 参照SPI提供的文档&#xff1a; 工程&#xff1a; SPI 写函数&#xff1a; FT_STATUS write_byte(FT_HANDLE handle…

java8使用流

这种处理数据的方式很有用&#xff0c;因为你让Stream API管理如何处理数据。这样StreamAPI就可以在背后进行多种优化。此外&#xff0c;使用内部迭代的话&#xff0c;SteamAPI可以决定并行运行你的代码。这要是用外部迭代的话就办不到了&#xff0c;因为你只能用单一线程挨个迭…

程序员年末如何狂赚一笔?竟然是……

年关将近&#xff0c;一年一度的阖家团圆又要提上日程了&#xff0c;但是对咱成年人来说还得扛起生活的重担啊&#xff01;趁年末最后的时间&#xff0c;抓住机会&#xff0c;大干一笔&#xff0c;为2023年画上圆满的句号&#xff1b;为亲戚闲来聊天时提供满满的底气&#xff0…

嵌入式中I2C 相关的硬件问题汇总及死锁解决办法

本文主要介绍如何解决I2C设备硬件设计上的各种问题&#xff0c;希望对大家有所帮助&#xff01; 关于I2C协议详细的讲解&#xff0c;可以参考之前的推文&#xff1a;全面解析 I2C 通信协议 一般情况下&#xff0c; i2c 设备焊接没什么问题&#xff0c;按照设备手册一步步来&a…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱5(附带项目源码)

效果演示 文章目录 效果演示系列目录前言制作系统定义制作配方 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xff0c;我们将探索如何用unity制作一个3D背包、库存、制…

Golang快速入门到实践学习笔记

Go学习笔记 1.基础 Go程序设计的一些规则 Go之所以会那么简洁&#xff0c;是因为它有一些默认的行为&#xff1a; 大写字母开头的变量是可导出的&#xff0c;也就是其它包可以读取 的&#xff0c;是公用变量&#xff1b;小写字母开头的就是不可导出的&#xff0c;是私有变量…