STM32 HAL 定时器详细篇(计数、PWM、输入捕获)

2023-05-16

l  16位的向上、向下、向上/向下(中心对齐)计数模式,支持自动重装载

l  16位的预分频器

l  每个定时器都有多个独立通道,每个通道可用于

*  输入捕获

*  输出比较

*  PWM输出

*  单脉冲模式

l  高级定时器还可以产生互补输出

l  可以产生中断/DMA请求:

*  更新事件:计数器向上/向下溢出,计数器初始化(通过软或者内部/外部触发)

*  触发事件:计数器启动,停止,初始化或者有内部/外部触发计数

*  输入捕获

*  输出比较

一、定时器之计数模式

(一)  计数模式

向上计数

计数器从0向上计数(递增)到自动装载值,然后再次回到0开始计数,并产生一个计数溢出事件

 

向下计数

计数器从自动装载值向下计数(递减)到0,然后再次回到自动装载值开始计数,并产生一个计数器向下溢出事件

 

中央对齐模式(向上/向下计数)

计数器从0开始计数到自动装载值-1,并产生一个计数器溢出事件,然后再向下计数到0+1,并产生一个计数溢出事件,然后再向上计数。

 

(二)定时器的溢出时间计算

time=(ARR+1)*(PSC+1)/Tclk

 

ARR为自动装载值

PSC:预分频系数

Tclk:定时器的APB时钟,通常等于系统时钟

 

如:

tclk为72M

psc为7199

arr为4999

 

time=(4999+1)*(7199+1)/72 000 000 = 0.5s = 500ms

(三)CubeMX设置

这里需要注意的是你所需要使用的定时器是挂载在APB1还是APB2。相应的要调节他们时钟频率

 选择

 选择内部时钟

基础配置,这里配置的是1秒计数

l  Prescaler (PSC- 16 bits value),预分频器(PSC- 16位值)

l  Counter Mode,计数器模式:

up 向上

down 向下

Center Aligned mode 中心对齐模式

l  Counter Period (AutoReload Register - 16 bits value),重装载值

l  auto-reload preload,自动重装载开启

 

开启更新中断

中断优先级数字越低越高

(四)编程记录

中断开启

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)

溢出事件回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
   if(htim->Instance == TIM1){
         
        HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);//单独输出电平取反
     
     }
}

开启中断

HAL_TIM_Base_Start_IT(&htim1);

二、 定时器之PWM

PWM即脉冲宽度调制,是一种模拟控制方式,通常用于LED的亮度调节。其实就是快速的高低电平变化让人感觉不出来。

(一)了解一下HZ的概念

1HZ表示1秒变化一个周期

在家用交流点中:

50HZ表示电流每秒钟来回变化50次,方向改变100次。

50HZ是50个周期,所以有50个正玄波形

这个图表示的是1HZ变化,1个周期,1个正玄波

50HZ表示每个周期的时间=1S/50=0.02S=20ms

 

单片机检测交流电可以200ms内没有检测到高电平,则表示无输入。

 

在计算机cpu等使用1khz=1000hz

在电磁波和机械波等,1Khz=1024hz

 

在PWM中

 

hz是频率的单位

1hz 表示PWM的周期是一秒

1Khz表示一秒钟有一千个周期,也就是周期是1ms

1KKhz、1Mhz表示一秒钟有100万个周期,也就是周期是1us

 

y秒=1/xHZ

 

1/1000=0.001S=1ms

1/1000000=0.000001S=1us

 

如果实现周期是100us

100us=0.0001S=1/0.0001= 10,000HZ

(二)PWM配置

ARR为自动装载值

CCRx 为捕获比较寄存器值

 

预分频系数决定了PWM的时钟速度

ARR的大小决定了PWM的周期

CRRx决定了输出有效信号的时间

 

有效信号:

高电平

低电平

 

PWM模式:

模式1,不管是向上还是向下计数,当计数值小于重装载值是输出有效电平。

模式2,不管是向上还是向下计数,当计数值小于重装载值是输出无效电平。

 

PWM周期计算

Fpwm = 100M / ((arr+1)*(psc+1))(单位:Hz)

 

Fpwm = 100M / (arr+1)/(psc+1)(单位:Hz)

 

arr 是计数值

psc 是预分频值

如:

3. 主频=100M

4. arr=100

5. psc=1000

100,000,000/100/1000=1000Hz

(三) CubeMX设置

设置定时器使用内部时钟

设置定时器的PWM通道1开启

STM32F103C8T6对应的PWM通道为PA8

设置基础参数

Prescaler,分配系数为36

Counter Period,重装载值为100

所以:

PWM的频率为:72 000 000/35/100=20 000 HZ(20KHZ),周期为 1/20000= 0.00005秒

PWM脉宽调制的最大值与重装载值一致,其范围为[0,100]

通道可以设置的值:

Mode,PWM的模式,可以选择模式1或模式2

CH Polarity,有效电平,可选高或底

(四)编程

初始化

//开启PWM输出
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
//设置默认的占空比值
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,10);

while循环改变值

HAL_Delay(30);//延时30ms

//变量修改
if(i<100) i++;
else i=0;

//设置占空比值
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,i);

三、 定时器之输入捕获

通过检查定时器通道上的边沿信号,在边沿信号跳变(上升沿或者下降沿)的时候,将当前定时器的计数值存储到对应的捕获/比较寄存器里面,完成一次捕获。

 

通常用于检测高电平持续时间、低电平持续时间、两次下降沿的持续时间、两次上升沿的持续时间

滤波器:

里可以设置以什么频率采集多少次有效电平才说明边沿触发成功,如设置的是上升沿触发,当上升沿发生时,滤波器或以fDTS的频率采集ICF设置的次数,每次检测是否是高电平,这样可以防止误触发所带来的计算干扰。

 

边沿检测器:

设置捕获的触发边沿,可以设置上升沿或下降沿

 

通道选择

通过寄存器可以设置其它通道输入的值到该通道上

如通道1和通道2都可以映射到IC1,但通常是通道1是IC1,通道2是IC2,每个独立一对一映射,互不干扰。

 

分频器:

每2个事件触发一次捕获,如上升沿捕获时,连续获取到两个上升沿后才会触发计数

每4个事件触发一次捕获

每8个事件触发一次捕获

(一) CubeMX设置

开启TIM4的通道1作为输入捕获通道,对应是PB6引脚

Internal Clock表示内部时钟

input capture direct mode 表示输入捕获

根据硬件连接,这里设置为上拉

开启中断

基础配置

时钟:72 000 000 /72 = 1 000 000 HZ= 1MHZ,所以计数一次为1us

最大计数值为65536,约为65ms

prolarity selection 为触发计数边沿,下降沿

(二)编程

测量低电平的持续时间,先下降沿后上升沿,记录计数值,最终输出us单位。

通用函数

//变量存储
typedef struct 
{   
    uint8_t   flg; //0为未开始,1已经开始,2为结束
    uint16_t  num;//计数值
    uint16_t  num_period;//溢出次数
}COUNT_TEMP;

COUNT_TEMP count_temp={0};

//捕获中断发送时的回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
      //判断定时器2
        if(TIM2 == htim->Instance){
            if ( count_temp.flg == 0 )
            {   
                // 清零定时器计数
                __HAL_TIM_SET_COUNTER(htim,0); 
                //设置上升沿触发
                __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);
                count_temp .flg = 1;    //设置已经开始    
                count_temp .num_period = 0;    //溢出计数清零        
                count_temp .num = 0; //计数清零
            }        
            else
            {
                // 获取定时器计数值
                count_temp .num = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2);
                //设置下降沿触发
                __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);
                count_temp .flg = 2;
            }
        }
}    

//定时器溢出回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(TIM2 == htim->Instance){
    //每次溢出时间为65536us
    if(count_temp.flg==1)//还未成功捕获
    {
                if(count_temp.num_period==0XFFFF)//电平太长了
                {
                    count_temp.flg=2;        //标记成功捕获了一次
                    count_temp .num=0XFFFF;
                }else count_temp .num_period ++;
    }
    }
}

初始化

//开启定时器溢出中断
HAL_TIM_Base_Start_IT(&htim2);  
//开启输入捕获中断,设置下降沿触发中断
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING); 
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);    //启动输入捕获

while循环

//等待测量完毕
if(count_temp.flg == 2 )
{
    //计数计数值,0xFFFF为最大计数
    uint32_t ulTime = (uint32_t)count_temp .num_period * 0xFFFF + count_temp .num;
    //输出测量的值
    printf ( "低电平时间:%d us\n",ulTime); 
    count_temp .flg = 0;            
}

找作者:https://space.bilibili.com/162091292

原文地址:https://www.cnblogs.com/dongxiaodong/p/14351398.html

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 HAL 定时器详细篇(计数、PWM、输入捕获) 的相关文章

  • 污水处理远程监控系统解决方案

    一 行业背景 随着我国科技和经济的发展 xff0c 近年来工厂数量日益增多 xff0c 而生产所带来的工业垃圾及污水就是一个重要的环境污染问题 xff0c 部分工厂甚至会在监管部门的监控死角下偷偷进行污水排放 xff0c 对周围水质造成严重
  • 5G工业路由器安全性怎么样?工业路由器的特点

    路由器 xff0c 本身就是一个具有相当大潜力的网络通信设备 xff0c 即使再是网络小白的用户 xff0c 可能也知道路由器是家中用于发布无线网络的设备 xff0c 如果深入了解的话 xff0c 其作用和发展会让人大为感慨 相信很多用户也
  • 路由器有防火墙?工业路由器的那些安全防护

    想要网络安全光是电脑装了杀毒软件可不行 xff0c 如果一个企业或者大型工厂一旦因为网络防护疏忽 xff0c 那么丢失数据信息所造成的损失是无法估量的 xff0c 所以企业及工厂网络通信及数据传输所使用的路由器一般都是工业级的 xff0c
  • Cat.1和Cat.4有哪些区别

    Cat 1的全称为LTE UE Category 1 xff0c 它是4G LTE网络的一个类 xff0c 也可以理解为低配的4G终端 xff0c 属于广域网 xff0c 蜂窝联网 xff0c 上行峰值为5Mbit s xff0c 下行峰值
  • RS485接口连接设备数量总共有多少?

    RS485总线可以连接256个设备 xff0c 但测试后发现这个数字有比较大的差异 有一种说法认为专门开发串行嵌入式的RS485总线只能连接32个节点 xff0c 这由自身的驱动能力决定的 有人说网上的各种485总线产品可以支持128个 x
  • 预防山体滑坡,泥石流监测智能预警系统

    一 行业背景 我国是一个山区面积较大的国家 xff0c 山地 丘陵约占国土总面积的2 3 xff0c 在众多的山区中 xff0c 都具备泥石流形成的基本条件 xff0c 这也让我国成为受泥石流灾害影响最大的国家 在我国境内 xff0c 泥石
  • 如何扩大无线网络信号强度?

    欢迎来到东用小知识课堂 xff0c 每天学习一分钟 xff0c 让你紧跟时代 xff0c 扩充自己 xff0c 成为大佬不是梦 xff01 无线网络通信设备存在一个问题 xff0c 那就是他的信号发射都是直线型 xff0c 因此一旦家中或者
  • OpenWrt 添加cpu温度显示监控

    opkg update opkg install lm sensors lm sensors detect 然后修改一下 usr lib lua luci view admin status index htm 增加一个温度的显示 lt C
  • RS485接线方式小科普

    欢迎来到东用知识小课堂 xff01 RS 485采用平衡发送和差分接收方式实现通信 xff1a 发送端将串行口的ttl电平信号转换成差分信号a xff0c b两路输出 xff0c 经过线缆传输之后在接收端将差分信号还原成ttl电平信号 RS
  • 传输数据稳如老狗,还支持多种接口,这款DTU让智能化更简单

    如果你的项目正在向着智慧化转变或发展 xff0c 那么你一定会深刻意识到数据传输的稳定性对于整个系统的稳定运行的重要性 毕竟 xff0c 项目的智能化发展需要时刻保持数据的可靠性和稳定传输 xff0c 如果一旦传输因设备或者网络等因素导致中
  • 什么是光耦隔离?光耦隔离的主要作用

    欢迎来到东用知识小课堂 xff01 光耦合器的结构相当于把发光二极管和光敏三极管封装在一起 光耦隔离电路使被隔离的两部分电路之间没有电的直接连接 xff0c 主要是防止因有电的连接而引起的干扰 xff0c 特别是低压的控制电路与外部高压电路
  • ORB305与CISCO路由器构建L2TP over IPSec VPN操作手册

    1 网络拓扑 在思科路由器与ORB305之间建立一个安全隧道 xff0c 对客户路由器端设备子网 xff0c 与思科路由器端服务器子网之间的数据流进行安全保护 xff0c 组网拓扑图如图所示 2 思科路由器端配置指导 此处以多数客户使用专线
  • linux下使用UDP发送接收数据

    接收 static int sock fd struct sockaddr in recv addr 读取参数 struct sockaddr in send addr 发送参数 sock fd 61 socket AF INET SOCK
  • 0长度数组的使用,重点掌握的知识

    0长度的数组在ISO C和C 43 43 的规格说明书中是不允许的 xff0c 但是GCC的C99支持的这种用法 GCC对0长度数组的文档参考 xff1a Arrays of Length Zero 如下代码片段 xff0c 哪个更简洁更灵
  • Freertos中检测内存的剩余函数

    static uint16 t prvTaskCheckFreeStackSpace const uint8 t pucStackByte
  • 重定位

    一 必须知道的几个概念 1 链接地址和运行地址 运行地址 xff0c 顾名思义就是程序运行的时候的地址 xff0c 也就是你用工具将代码下载到RAM的那个地址 xff0c 也叫加载地址 链接地址 xff0c 由链接脚本指定的地址 为什么需要
  • CC2541低功耗的实现方法

    转自 xff1a http blog csdn net mzy202 article details 42091537 CC2541 CC2540 实现超低功耗是非常重要的 xff1a 我们来总结一下实现方法 xff1a 1 xff0c 有
  • Macbook pro/air 2013 late -2014 使用转接卡更换NVME SSD休眠不醒问题的解决办法

    2021年1月更新 xff0c 发现升级 big sur 11 1之后 xff0c 固件版本变成了429 0 0 0 睡眠问题又回来了 xff0c 每次都睡死 xff0c 不醒 于是我按老办法 xff0c 把mbp114的nvme驱动刷到m
  • stm32使用stlink v2.0下载的sw接线方式

    stm32的sw下载需要用到4根线 GND VCC SWCLK SWDIO xff0c 对应好即可 xff0c 相比较3根线的方式 xff0c 优先推荐4根线下载方式
  • stm32芯片的焊接

    stm32的焊接 xff0c 使用到东西 xff1a 松香 xff0c 维修佬 xff0c 烙铁 1 首先将stm32的一个角的脚上涂上维修佬 xff0c 要特别特别少 xff0c 太多了 xff0c 容易粘连到其他脚上面 xff0c 不好

随机推荐

  • Modbus-RTU通讯协议中CRC校验码的计算步骤

    在CRC计算时只用8个数据位 xff0c 起始位及停止位 xff0c 如有奇偶校验位也包括奇偶校验位 xff0c 都不参与CRC计算 CRC计算方法是 xff1a 1 预置1个16位的寄存器为十六进制FFFF xff08 全1 xff09
  • 一个很好的makefile例子(经典)

    转自http www cnblogs com sld666666 archive 2010 04 08 1707789 html 相信在unix下编程的没有不知道makefile的 xff0c 刚开始学习unix平台 下的东西 xff0c
  • 无线传输距离计算公式

    转自一篇文档 无线传输距离计算 Pr dBm 61 Pt dBm Ct dB 43 Gt dB FL dB 43 Gr dB Cr dB Pr xff1a 接受端灵敏度 Pt 发送端功率 Cr 接收端接头和电缆损耗 Ct 发送端接头和电缆损
  • hex文件解析

    Keil开发环境编程时对源程序进行编译链接后都 可以 成一个可执行文件即 hex文件 xff0c 但是有不完全是一个可执行文件 然后 可以 通过烧录工具烧写到对应的单片机的 flash中 xff0c 当然也还有其他方法可以进行烧录 大家在编
  • Ubuntu下如何挂载以及卸载U盘?

    l 在挂载U盘前 xff0c 首先运行命令cat proc partitions xff0c 看看现在系统中有哪些分区 插上u盘以后 xff0c 再次运行上述命令 xff0c 看看多出来什么分区 xff08 通常是sda1 xff0c 由于
  • 链接脚本文件的写法

    对于 lds文件 xff0c 它定义了整个程序编译之后的连接过程 xff0c 决定了一个可执行程序的各个段的存储位置 虽然现在我还没怎么用它 xff0c 但感觉还是挺重要的 xff0c 有必要了解一下 先看一下GNU官方网站上对 lds文件
  • Ubuntu18.04+思岚激光雷达A2M7+ROS测试

    Ubuntu18 04 43 思岚激光雷达A2M7 43 ROS测试 1 测试环境搭建 测试环境 xff1a Ubuntu18 04 43 ROS Melodic测试工具 xff1a 思岚科技激光雷达A2M7 43 USB转接工具 2 下载
  • ROS系统的串口数据读取和解析

    原帖地址 xff1a https blog csdn net Tansir94 article details 81357612 一 Ubuntu下的串口助手cutecom 下载 xff1a sudo apt get install cut
  • tcp buffer设置

    本文基于CENTOS DEBIAN UBUNTU 编写 我有两台位于不同数据中心的服务器 xff0c 都用来处理很多并行的大文件传输 但是处理大文件 xff0c 网络性能非常差 并且涉及到一个大文件 xff0c 会导致性能降级 我怎样通过调
  • URL模块之parse方法

    url parse urlString boolean boolean parse这个方法可以将一个url的字符串解析并返回一个url的对象 参数 xff1a urlString指传入一个url地址的字符串 第二个参数 xff08 可省 x
  • Makefile 知识点记录

    Makefile 知识点记录 1 依赖类型 xff1a normal Prerequisites xff0c order only prerequisites normal Prerequisites xff1a 标准依赖具有两层含义的声明
  • 视频矩阵系统中三代OSD字符叠加技术全面解析

    视频矩阵系统中三代OSD字符叠加技术全面解析 屏显信息更丰富 中文效果更出色 使用设置更灵活 视频矩阵系统中三代OSD字符叠加技术全面解析 前言 xff1a 在以矩阵为控制中枢的视频监控系统中 xff0c 大量的视频信号需要在数目有限的监视
  • CV_...报错

    在出错的程序里面添加相应的头文件即可 1 CV LOAD IMAGE COLOR was not declared in this scope include 34 opencv2 imgcodecs legacy constants c
  • 优化IMU数据避免突变的建议

    影响IMU数据变化的主要因素是应力 温度和电气干扰 xff1b xff11 温度的的骤升 xff0c 比如芯片的位置附件有相关器件几秒钟工作一次 xff0c 此时温度骤升 xff0c 可能会引起数据也发生突变 xff0c 周围有变化的热源和
  • JAVA HtmlParser Filter解析网页和表格(半个教程)

    package sometry import java io BufferedReader import java io InputStreamReader import java io FileInputStream import jav
  • 物联网系统网关开发与实现

    项目是大学时期的课程设计 摘要 粤嵌GEC 6818开发板作为系统的网关板 xff0c 其为系统数据的中枢 启动串口收发 xff0c 可以接收到ZigBee网络的协调器通过串口发送的数据 xff1b lCD屏幕编程 xff0c 实现传感网的
  • python 人脸识别和手势识别应用(face++)开发

    一 基础认识 本项目使用的是face 43 43 平台 xff0c 人脸识别 43 手势识别双确认显示 python编程 xff0c 代码简介 xff0c 方便扩展 该项目适用于Windows系统和Linux系统 xff0c 但必须安装相应
  • 产品开发阶段 EVT DVT PVT MP

    PLM xff08 Product Lifecycle Management xff09 System xff1a PLM是协助产品能够顺利完成在新产品开发 xff08 NPI xff1a New Product Introduction
  • OLED的波形曲线、进度条、图片显示(STM32 HAL库 模拟SPI通信 5线OLED屏幕)详细篇

    少废话 xff0c 先上效果图 屏幕显示效果 全家福 观看演示效果 xff1a https www bilibili com video BV13V411b78V 一 基础认识及引脚介绍 屏幕参数 xff1a 尺寸 xff1a 0 96英寸
  • STM32 HAL 定时器详细篇(计数、PWM、输入捕获)

    l 16位的向上 向下 向上 向下 xff08 中心对齐 xff09 计数模式 xff0c 支持自动重装载 l 16位的预分频器 l 每个定时器都有多个独立通道 xff0c 每个通道可用于 输入捕获 输出比较 PWM输出 单脉冲模式 l 高