蓝桥杯嵌入式学习记录——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);              // 开启定时器3
	
	HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);  // 开启定时器16
	HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);  // 开启定时器17

while(1)
{
	disp_proc();
	key_proc();	
}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TMGM官网平台开户运作流程如下:

TMGM官网平台开户运作流程如下: 首先,投资者需要注册并登录TMGM官网平台。在平台上,投资者可以选择适合自己的交易账户类型,包括标准账户、高级账户等。 然后,投资者需要进行身份验证和资金入账操作。TMGM会要求投资…

系统架构27 - 软件架构设计(6)

基于架构的软件开发方法 基于架构的软件开发方法(ABSD)概述概念与术语开发模型体系结构需求体系结构设计体系结构文档化体系结构复审体系结构实现体系结构的演化 基于架构的软件开发方法(ABSD) 基于体系结构的软件设计 (Architec…

2月3日作业

1.编程实现单向循环链表的头插&#xff0c;头删、尾插、尾删 尾插/头插&#xff0c;头删&#xff0c;尾删&#xff1a; 头文件&#xff1a; #ifndef __HEAD_H_ #define __HEAD_H_#include<stdio.h> #include<string.h> #include<stdlib.h>enum {FALSE-1,SU…

【教程】MySQL数据库学习笔记(一)——认识与环境搭建(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 文章目录 【MySQL数据库学习】系列文章一、认…

matplotlib雷达图制作具体步骤

此次我们制作的是关于护肤品下的畅销品类雷达图&#xff0c;数据如下&#xff1a; 数据预览&#xff1a; 一、代码展示 import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][SimHei] adress"D:/pandas练习文件/雷达…

关于Windows Media Player的一些知识,看这篇文章就差不多了

你知道如何在电脑上打开Windows Media Player吗?如果它不是你电脑上默认的媒体播放器,你知道如何将其设为默认吗?此外,如果你找不到它,你知道怎么把它找回来吗?这篇文章将向你展示你想要了解的所有信息。 在这篇文章中,我们将向你展示以下信息: 如何打开Windows Medi…

【MySQL/Redis】如何实现缓存一致

目录 不实用的方案 1. 先写 MySQL , 再写 Redis 2. 先写 Redis &#xff0c; 再写MySQL 3. 先删 Redis&#xff0c;再写 MySQL 实用的方案 1. 先删 Redis&#xff0c;再写 MySQL, 再删 Redis 2. 先写 MySQL , 再删 Redis 3. 先写MySQL&#xff0c;通过BinLog&#xff0…

Pytest测试技巧之Fixture:模块化管理测试数据

在 Pytest 测试中&#xff0c;有效管理测试数据是提高测试质量和可维护性的关键。本文将深入探讨 Pytest 中的 Fixture&#xff0c;特别是如何利用 Fixture 实现测试数据的模块化管理&#xff0c;以提高测试用例的清晰度和可复用性。 什么是Fixture&#xff1f; 在 Pytest 中&a…

ClickHouse--10--临时表、视图

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.临时表1.1 特征1.2 创建一个临时表 2.视图2.1 普通视图2.2 物化视图 1.临时表 1.1 特征 ClickHouse 支持临时表&#xff0c;临时表具备以下特征&#xff1a; 当…

[GYCTF2020]Blacklist

感觉是[强网杯 2019]随便注 的加强版&#xff0c;之前做的是最后可以通过prepare和execute实现对select的绕过&#xff0c;但是这题把这两个关键字也过滤了。 前面堆叠注入没啥问题&#xff0c;卡在了最后读取flag 查看其他师傅的wp&#xff0c;发现这个handler的可以当作丐版s…

html的超链接标签 a

超链接标签: a a标签有2个重要的属性&#xff0c;href和target属性。 href:必须具备&#xff0c;表示点击后会跳转到哪个页面 target:打开方式.默认是 _self.如果是 _blank则用新的标签页打开. 超链接href属性的使用展示 1.通过图片展示 示例代码 运行效果&#xff1a; 点…

Android---Jetpack Compose学习005

动画 1. 简单值动画 示例&#xff1a;背景颜色在紫色和绿色之间&#xff0c;以动画形式切换。使用 animateColorAsState() val backgroundColor by animateColorAsState(if (tabPage TabPage.Home) Purple100 else Green300) 该句代码中&#xff0c;有一个 backgroundColo…

D. Divisible Pairs

思路&#xff1a;我们预处理出每个数分别摸上xy的值&#xff0c;用map存一下&#xff0c;然后遍历每个数&#xff0c;如果a b是x的倍数的话&#xff0c;那么他们模x的值相加为x&#xff0c;如果a - b是y的倍数的话&#xff0c;那么他们的模y的值相等。 代码&#xff1a; voi…

浅析Linux内核线程监测机制:Hung Task

文章目录 概述Hung Task配置Hung Task机制初始化Hung Task监测线程 相关参考 概述 Hung Task机制周期性地监测系统中处于TASK_UNINTERRUPTIBLE状态&#xff08;即D状态&#xff09;的进程&#xff0c;如果超过120s&#xff08;时间可配&#xff09;&#xff0c;进程状态还没有…

解决:RuntimeError: shape ‘[1, 3, 32, 32]‘ is invalid for input of size 4096

报错&#xff1a; 原因&#xff1a; 因为我下载的图片是4通道的&#xff1a;通过下面打印出来的结果可知是RGBA四通道的。 解决方法&#xff1a; 但是网络的输入需要RGB三通道&#xff0c;因此需要使用下列方法进行转换&#xff1a; image_path "../imgs/dog.png"…

红色系可视化界面,偶尔用用可以,长时间太刺眼。

继昨日发了白色的可视化界面&#xff0c;表明了不适合做大屏展示用&#xff0c;友友们从很多角度阐述了&#xff0c;为什么不能用白色&#xff0c;大家的结论基本一致。 今天发一些红色&#xff0c;这些在某个节日用个一小会还行&#xff0c;长时间用肯定不适合。

【日常聊聊】新年新征程:迎接学习的挑战

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 随着新的一年的到来&#xff0c;程序员们站在了全新的起点。这是一个充满机遇和挑战的时刻&#xff0…

深入了解JavaScript混淆工具:jsjiami.v6

JavaScript混淆工具在前端开发中发挥着重要的作用&#xff0c;帮助开发者保护源代码&#xff0c;减少代码被轻易破解的风险。其中&#xff0c;jsjiami.v6 是一款备受开发者关注的混淆工具之一。本文将深入介绍jsjiami.v6的基本原理和使用方法&#xff0c;并通过案例代码演示其效…

相机图像质量研究(19)常见问题总结:CMOS期间对成像的影响--Sensor Noise

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

(一)【Jmeter】JDK及Jmeter的安装部署及简单配置

JDK的安装和环境变量配置 对于Linux、Mac和Windows系统&#xff0c;JDK的安装和环境变量配置方法略有不同。以下是针对这三种系统的详细步骤&#xff1a; 对于Linux系统&#xff1a; 下载适合Linux系统的JDK安装包&#xff0c;可以选择32位或64位的版本。 将JDK的安装包放置…