STM32 LL库+STM32CubeMX--LED呼吸灯

news2025/1/15 17:27:00

一、前期准备

  1. 硬件:STM32F103C8T6开发板
  2. 调试工具:DAPLink(本次使用)或USB-TTL
  3. 开发环境:STM32CubeMX、Keil、Vscode(可选)
  4. LED:使用PA0(TIM2_CH1)输出PWM,LED的阴极接GND

二、使用定时器中断产生PWM

STM32F103C8T6在72MHz的计数时钟下,可实现最大59.65s的定时。

  •  STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4
  • 时基单元:16位预分频器 + 16位计数器 + 16位自动重装载寄存器

计数模式:

1. 向上计数模式(常用):从0开始累加,到自动重装值触发中断。

2. 向下计数模式:从自动重装值递减,到0触发中断

3. 中央对齐计数模式:从0开始累加,到自动重装载值触发中断,然后递减,到0再次触发中断。常用于电机控制的SVPWM算法中。

TIM输出比较原理:

  • OC(Output Compare):输出比较,输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作用于输出一定频率和占空比的PWM波形每个高级定时器和通用定时器都拥有4个输出比较通道OC1~4
  • CCR(Capture Compare):捕获比较寄存器

PWM(Pulse Width Modulation)脉冲宽度调制

  1. 频率 = 1 / TS,一般在 几kHz~几十kHz。
  2. 占空比 = TON / TS
  3. 分辨率 = 占空比变化步距,也就是占空比变化的精细程度。一般1%足够使用。

注:定时中断的频率就是PWM波的频率,只不过占空比的变化范围由自动重装载值ARR决定。

输出比较模式:常用PWM模式1

 

2.1 PWM参数计算

  • PWM频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1)
  • PWM占空比: Duty = CCR / (ARR + 1),CCR值可以设置PWM的占空比,因此ARR常设为100-1
  • PWM分辨率: Reso = 1 / (ARR + 1),即PWM的步长

参数说明:

  • CK_PSC:时钟源频率,72MHz
  • PSC:预分频器寄存器的值
  • ARR:自动重装寄存器的值
  • CCR:捕获比较寄存器的值

案例1:假如驱动SG90舵机:PWM频率为50Hz,即周期20ms

  • PSC = 72-1
  • ARR = 20K-1

案例2:输出频率为10K的PWM

  1. 先确定ARR的值:ARR = 100-1
  2. 再设置PSC的值:PSC = 72-1

2.2 STM32F103C8T6通用定时器输出通道

  • 因为涉及到GPIO的复用功能,所以要使用定时器输出PWM时,GPIO的工作模式需要设置为复用推挽输出模式
序号主功能默认复用功能
1PA0TIM2_CH1
2PA1TIM2_CH2
3PA2TIM2_CH3
4PA3TIM2_CH4
5PA6TIM3_CH1
6PA7TIM3_CH2
7PB0TIM3_CH3
8PB1TIM3_CH4
9PB6TIM4_CH1
10PB7TIM4_CH2
11PB8TIM4_CH3
12PB9TIM4_CH4

三、STM32CubeMX配置

1.设置RCC:使用外部高速时钟HSE

 2.SYS配置:配置成 SWD协议下载和调试

3. 定时器配置

使用TIM2,输出PWM频率10K

  • 设置ARR = 100-1
  • 设置PSC = 72-1

TIM2时钟源配置、通道输出配置: GPIO的工作模式会自动被设置为复用推挽输出模式

工作参数设置:PWM模式1

  •  ARR:决定PWM的分辨率
  • CCR:PWM的占空比

4.时钟树配置:72MHz

 5.导出代码:之后步骤参考之前的就可以了

四、程序编写

// 在TIMX_CH1通道上输出占空比为CompareValue的PWM
__STATIC_INLINE void LL_TIM_OC_SetCompareCH1(TIM_TypeDef *TIMx, uint32_t CompareValue)
{
  WRITE_REG(TIMx->CCR1, CompareValue);
}
 /* USER CODE BEGIN WHILE */
  LL_TIM_EnableAllOutputs(TIM2);
  LL_TIM_EnableCounter(TIM2);                        // 使能计数
  LL_TIM_CC_EnableChannel(TIM2, LL_TIM_CHANNEL_CH1); // 使能输出比较通道
  while (1)
  {
    for (uint16_t i = 0; i <= 100; i++)
    {
      LL_TIM_OC_SetCompareCH1(TIM2, i); // PA0(TIM2_CH1)输出占空比为i的PWM
      LL_mDelay(10);
    }
    for (uint16_t i = 0; i <= 100; i++)
    {
      LL_TIM_OC_SetCompareCH1(TIM2, 100 - i);
      LL_mDelay(10);
    }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

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

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

相关文章

各地区-各行业法人单位、区划数63个指标(2010-2022年)

一、数据介绍 数据名称&#xff1a;各地区-各行业法人单位、区划数63个指标 数据年份&#xff1a;2010-2022年&#xff08;法人单位至2021年&#xff09; 数据样本&#xff1a;404条 数据来源&#xff1a;自我整理 二、指标说明 行政区划代码 地区 长江经济带 经度 纬…

数字化时代,选择商业智能BI解决80%数据问题

数据是需要有人来照料、培养的&#xff0c;如果企业没有完善的数据治理方案&#xff0c;就很难保障数据的质量&#xff0c;进而导致数据无法利用&#xff0c;让这些辛苦积累的数据失去了价值。 数据治理目标 数据从业务活动中产生&#xff0c;也会深刻影响到业务本身。 对于…

vue2中使用mixins(混入)和vue3中使用composable

文章目录 一、mixins混入1、 新建mixins文件夹&#xff0c;新建myMixins.js2、myMixins.js 文件3、index.vue 文件&#xff08;要使用的文件&#xff09; mixins 总结二、composable(组合式api composition )1、 新建composables文件夹&#xff0c;新建useEdit.js2、useEdit.js…

python无聊小创作:直播读弹幕机器人(附完整代码)

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 直播读弹幕机器人是指能够实时读取直播平台上观众发送的弹幕&#xff0c;并将其转化为语音进行播放的机器人。 这种机器人通常会使用文字转语音技术&#xff0c;将接收到的弹幕文本转为语音&#xff0c;并通过扬声器或…

系统架构设计专业技能 · 网络规划与设计(三)【系统架构设计师】

系列文章目录 系统架构设计专业技能 网络规划与设计&#xff08;三&#xff09;【系统架构设计师】 系统架构设计专业技能 系统安全分析与设计&#xff08;四&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构设计&#xff08;一&#xff09;【系统架构设计师…

腾讯云标准型CVM云服务器详细介绍

腾讯云CVM服务器标准型实例的各项性能参数平衡&#xff0c;标准型云服务器适用于大多数常规业务&#xff0c;例如&#xff1a;web网站及中间件等&#xff0c;常见的标准型云服务器有CVM标准型S5、S6、SA3、SR1、S5se等规格&#xff0c;腾讯云服务器网来详细说下云服务器CVM标准…

Vue中使用Tailwind css

1.什么是Tailwind 就是一个CSS框架&#xff0c;和你知道的bootstrap&#xff0c;element ui&#xff0c;Antd&#xff0c;bulma。一样。将一些css样式封装好&#xff0c;用来加速我们开发的一个工具。 Tailwind解释 tailwind css 中文文档 2.Vue使用Tailwind配置 1. 新建vu…

【elasticSearch系】3.完整搭建详尽版elk

话不多说,我们先看下经典的elk 是由哪些组件搭建组合起来的 elasticsearch和kibana搭建 可以查看之前我们搭建elasticsearch和kibana 的这篇文章 logstash搭建 为了和之前我们搭建elasticsearch和kibana版本保持一致,这里我们还是选择7.17.3 下载地址 点击下载,这里为了…

Spring Boot配置文件中的配置项加密jasypt使用

在Spring Boot中&#xff0c;有很多口令需要加密&#xff0c;如数据库连接密码、访问第三方接口的Token等。常见的方法就是用jasypt对口令进行加密。 实际上&#xff0c;jasypt可以对配置文件中任意配置项的值进行加密&#xff0c;不局限于对密码的加密。 1.在pom.xml中添加ja…

由于找不到vcruntime140.dll,无法继续执行代码,三种修复方法

为什么我们很多人都遇到过打开电脑软件时候突然电脑就提示找不到vcruntime140.dll&#xff0c;或许vcruntime140.dll丢失&#xff0c;那么vcruntime140.dll到底是什么&#xff1f;为什么会丢失&#xff0c;丢失了要怎么解决修复呢&#xff1f;下面小编都会一一介绍给大家&#…

常见直播流协议,你学“废”了吗?

常见的直播流协议&#xff08;大汇总&#xff09; 前言正文什么是视频流协议&#xff1f;协议、编解码器和容器格式 RTMP什么是RTMP&#xff1f;RTMP的特性RTMP的三个主要成分使用RTMP直播的整个流程RTMP拉流过程RTMP是否被淘汰了&#xff1f;RTMP的几个变种 HLS什么是HLS&…

腾讯云服务器CVM标准型S5详细介绍及其他S6、SA3实例等

腾讯云CVM服务器标准型实例的各项性能参数平衡&#xff0c;标准型云服务器适用于大多数常规业务&#xff0c;例如&#xff1a;web网站及中间件等&#xff0c;常见的标准型云服务器有CVM标准型S5、S6、SA3、SR1、S5se等规格&#xff0c;腾讯云服务器网来详细说下云服务器CVM标准…

数字经济、创业活跃度与高质量发展(面板熵值法代码数字经济测算原始数据)

数据简介&#xff1a;熵值法是一种多指标综合评价方法&#xff0c;旨在解决多指标决策问题。相较于传统的加权平均法&#xff0c;这一方法更能够综合考虑指标之间的相互影响&#xff0c;避免出现因指标权重设置不当导致决策失误等问题。熵值法是一种基于信息论的多指标综合评价…

✅最新!自然指数中国科研机构百强名单,出炉!

【SciencePub学术】8 月 9 日&#xff0c;自然指数官网发布了最新的中国科研机构百强名单。名单根据各大机构2022年在自然科学领域的论文贡献份额进行排名。 其中&#xff0c;中国科学院以2053.76的论文贡献份额&#xff0c;位列榜首&#xff1b;中国科学院大学和中国科学技术…

【JVM】JVM中的分代回收

文章目录 分代收集算法什么是分代分代收集算法-工作机制MinorGC、 Mixed GC 、 FullGC的区别是什么 分代收集算法 什么是分代 在java8时&#xff0c;堆被分为了两份&#xff1a; 新生代和老年代【1&#xff1a;2】 其中&#xff1a; 对于新生代&#xff0c;内部又被分为了三…

分割一切模型 Fast SAM C++推理部署---TensorRT (有核心代码)

Fast SAM C推理部署—TensorRT 核心源代码在结尾处有获取方式 晓理紫 0 XX开局一张图&#xff0c;剩下… 1 为什么需要trt部署 主要是在GPU上推理可以获得更高的推理速度。可与onnxruntim推理向比较一下 对比视频 2 TensorRt部署 2.1 环境与条件 需要配置TensorRt相关环境 这…

【uniapp】uniapp使用微信开发者工具制作骨架屏:

文章目录 一、效果&#xff1a;二、过程&#xff1a; 一、效果&#xff1a; 二、过程&#xff1a; 【1】微信开发者工具打开项目&#xff0c;生成骨架屏&#xff0c;将wxml改造为vue页面组件&#xff0c;并放入样式 【2】页面使用骨架屏组件 【3】改造骨架屏&#xff08;去除…

Mr. Cappuccino的第61杯咖啡——Spring之BeanPostProcessor

Spring之BeanPostProcessor 概述基本使用项目结构项目代码运行结果源代码 常用处理器项目结构项目代码执行结果 概述 BeanPostProcessor&#xff1a;Bean对象的后置处理器&#xff0c;负责对已创建好的bean对象进行加工处理&#xff1b; BeanPostProcessor中的两个核心方法&am…

scope,deep穿透的实际应用

一.父组件代码 <template><div id"app"><h1 class"box"><pageName> </pageName></h1></div> </template><script> import pageName from "../src/components/pageName.vue"; export de…