CubeMX使用教程(5)——定时器PWM输出

news2024/12/28 5:10:53

本篇我们将利用CubeMX产生频率固定、占空比可调的两路PWM信号输出

例如PA6引脚输出100Hz的PWM;PA7引脚输出500Hz的PWM,双路同时输出

我们还是利用上一章定时器中断的工程进行学习,这样比较方便

首先打开CubeMX对PA6PA7进行GPIO配置

 注:之所以不选择带N的,是因为TIM1_BKIN这种带N的定时器通道是用来生成互补PWM的

 

因为PA6配置的是TIM16,按照要求,PA6引脚要输出100Hz的PWM,默认系统时钟频率为80MHz(即80,000,000Hz),

定时频率=定时器工作频率/Counter=默认系统时钟频率/[(PSC+1)*Counter]

为了方便计算,我们把重装载值Counter设为100,目标输出频率(定时频率)为100Hz,因此PSC=8000-1

经过这个分析,我们再填入PSC=8000-1Counter=100-1两个参数

同理分析PA7引脚的参数配置,PA7引脚输出500Hz的PWM,默认系统时钟频率为80MHz(即80,000,000Hz)

定时频率=定时器工作频率/Counter=默认系统时钟频率/[(PSC+1)*Counter]

为了方便计算,我们把重装载值Counter设为100,目标输出频率(定时频率)为500Hz,因此PSC=1600-1

经过这个分析,我们再填入PSC=1600-1Counter=100-1两个参数

配置完成后,即可点击GENERATE CODE生成代码

进入Keil之后,我们可以先看看tim.c里面的内容

可以看到通过在CubeMX中的配置和图形化编程,CubeMX这个工具自动帮我们生成了 时钟配置代码,数值也是我们前面预设的那样 htim16.Init.Prescaler = 8000-1;  htim16.Init.Period = 99;

这就是为什么ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以大大减轻开发工作,时间和费用,提高开发效率。

接着我们回到main.c的主函数中,打开PWM输出通道

	HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);//打开PWM输出通道
	HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);

这样两个引脚就同时输出不同固定频率的PWM了,PA6引脚输出100Hz的PWM;PA7引脚输出500Hz的PWM。

我们开始编写按键调节占空比的部分

首先定义两个变量PA6_Duty、PA7_Duty,分别指代两个引脚输出脉冲的占空比

unsigned char PA6_Duty=10;
unsigned char PA7_Duty=10;

 在主函数的while(1)中编写按键中断,按下一次按键,占空比增加10%,当占空比到了90%,再按一次就又回到了10%,这里用的就是上一章的按键中断,只不过换了变量而已。

		if(key[0].single_flag==1)
		{
			PA6_Duty+=10;
			if(PA6_Duty>=100) PA6_Duty=10;
			__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,PA6_Duty);
			key[0].single_flag=0;
		}
		if(key[1].single_flag==1)
		{
			PA7_Duty+=10;
			if(PA7_Duty>=100) PA7_Duty=10;
			__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,PA7_Duty);
			key[1].single_flag=0;
		}

除此之外,我们还可以将占空比通过LCD实时显示出来,实现可视化,更加直观。

		char text[30]; 
		sprintf(text,"    PA6_Duty:%d    ",PA6_Duty);
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"    PA7_Duty:%d    ",PA7_Duty);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);

 最终效果

目前手头上没有示波器,要是有示波器把PA7和PA6引脚连上示波器,按下按键可以直观的看到占空比的变化(每按一次按键,占空比增加10%)

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

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

相关文章

【Web】浅聊Java反序列化之C3P0——JNDI注入利用

目录 简介 原理分析 EXP 前文:【Web】浅聊Java反序列化之C3P0——URLClassLoader利用 【Web】浅聊Java反序列化之C3P0——不出网Hex字节码加载利用 简介 出网的情况下,这个C3P0的Gadget可以和fastjson,Snake YAML , JYAML,Yamlbeans , …

Axure Cloud如何给每个原型配置私有域名

需求 在原型发布之后,自动给原型生成一个独立访问的域名,类似http://u591bi.axshare.bushrose.cn,应该如何配置呢? 准备事项 已备案域名 如何备案?阿里云备案流程 已安装部署Axure Cloud 如何安装部署,请…

【MySQL 系列】MySQL 语句篇_DML 语句

DML(Data Manipulation Language),即数据操作语言,用于操作数据库对象中所包含的数据。常用关键字包括:插入(INSERT)、更新(UPDATE)、删除(DELETE&#xff09…

用 Axios 提升前端异步请求的效率

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

政安晨:【深度学习处理实践】(三)—— 处理时间序列的数据准备

在深度学习中,对时间序列的处理主要涉及到以下几个方面: 序列建模:深度学习可以用于对时间序列进行建模。常用的模型包括循环神经网络(Recurrent Neural Networks, RNN)和长短期记忆网络(Long Short-Term M…

ubuntu下vscode+STM32CubeMX+openocd+stlinkv2搭建STM32开发调试下载环境

1、换源 清华源 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restr…

b站小土堆pytorch学习记录—— P27-P29 完整的模型训练套路

文章目录 一、定义模型(放在model.py文件中)二、训练三、测试四、完整的训练和测试代码 一、定义模型(放在model.py文件中) import torch from torch import nnclass Guodong(nn.Module):def __init__(self):super(Guodong,self)…

解决:ModuleNotFoundError: No module named ‘paddle‘

错误显示: 原因: 环境中没有‘paddle’的python模块,但是您在尝试导入 解决方法: 1.普通方式安装: pip install paddlepaddle #安装命令 2.镜像源安装 pip install paddlepaddle -i https://pypi.tuna.tsinghua.e…

黑马java-JavaSE进阶-java高级技术

1.单元测试 就是针对最小的功能单元方法,编写测试代码对其进行正确性测试 2.Junit单元测试框架 可以用来对方法进行测试,它是第三方公司开源出来的 优点: 可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键…

Javaweb之Maven高级分模块设计与开发的详细解析

1. 分模块设计与开发 1.1 介绍 所谓分模块设计,顾名思义指的就是我们在设计一个 Java 项目的时候,将一个 Java 项目拆分成多个模块进行开发。 1). 未分模块设计的问题 如果项目不分模块,也就意味着所有的业务代码是不是都写在这一个 Java 项…

基于AI软件平台 HEGERLS智能托盘四向车机器人物流仓储解决方案持续升级

随着各大中小型企业对仓储需求的日趋复杂,柔性、离散的物流子系统也不断涌现,各种多类型的智能移动机器人、自动化仓储装备大量陆续的应用于物流行业中,但仅仅依靠传统的物流技术和单点的智能化设备,已经无法更有效的应对这些挑战…

神经网络的矢量化,训练与激活函数

我们现在再回到我们的神经元部分,来看我们如何用python进行正向传递。 单层的正向传递: 我们回到我们的线性回归的函数。我们每个神经元通过上述的方法,就可以得到我们的激发值,从而可以继续进行下一层。 我们用这个方法就可以得…

【论文阅读】Segment Anything论文梳理

Abstract 我们介绍了Segment Anything(SA)项目:新的图像分割任务、模型和数据集。高效的数据循环采集,使我们建立了迄今为止最大的分割数据集,在1100万张图像中,共超过10亿个掩码。 该模型被设计和训练为可…

一文学会搭建 cli 脚手架工具

文章目录 设置工具命令package.json bin 字段注释:#!/usr/bin/env node设置环境变量 接收命令选项参数process 实现commander 命令行交互:inquirer下载项目模板:download-git-repo执行额外命令:自动安装依赖child_processexeca 体…

在Anaconda3的conda中创建虚拟环境下载opencv

opencv下载全流程 一、下载Anaconda 记得从官方网格站进行下载,会有一些慢 下载后进行配置 b站讲解视频(非本人(平台大神讲解)) 二、打开conda控制台 这里的两个都可以进行下载 通常我们受用anaconda prompt 三、…

pytorch CV入门3-预训练模型与迁移学习.md

专栏链接:https://blog.csdn.net/qq_33345365/category_12578430.html 初次编辑:2024/3/7;最后编辑:2024/3/8 参考网站-微软教程:https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorc…

mysql主从复制(同步阿里云的RDS至自建数据库)

从库同步阿里云的RDS 阿里云默认开启了binglog,所以我们无需对主库进行配置 查询主库的server_id,从库配置不要重复就行 show variables like %server_id%;编辑从库的my.cnf文件 在文件中增加如下配置 server-id 123456789 …

【微信小程序】传参存储

目录 一、本地数据存储 wx.setStorage wx.setStorageSync 1.1、异步缓存 存取数据 1.2、同步缓存 存取数据 二、使用url跳转路径携带参数 2.1、 wx.redirectTo({}) 2.2、 wx.navigateTo({}) 2.3、 wx.switchTab({}) 2.4 、wx.reLaunch({}) 2.5、组件跳转 三、…

spring boot 2.4.x 之前版本(对应spring-cloud-openfeign 3.0.0之前版本)feign请求异常逻辑

目录 feign SynchronousMethodHandler 第一部分 第二部分 第三部分 spring-cloud-openfeign LoadBalancerFeignClient ribbon AbstractLoadBalancerAwareClient 在之前写的文章配置基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 因为从 spring …

GPT-4 等大语言模型(LLM)如何彻底改变客户服务

GPT-4革命:如何用AI技术重新定义SEO策略 在当今快节奏的数字时代,客户服务不再局限于传统的电话线或电子邮件支持。 得益于人工智能 (AI) 和自然语言模型 (NLM)(例如 GPT-4)的进步,客户服务正在经历革命性的转变。 在这…