STM32CubeMX配置HAL库输入捕获

STM32CubeMX配置HAL库输入捕获

STM32的输入捕获功能可以用来测量脉冲宽度或者频率。其工作原理是,通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如

上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。

硬件

  • STM32F407IGT6
  • Stlink
  • USB-TTL

软件

  • STM32CubeMX
  • CLion

配置

  • RCC->High Speed Clock (HSE)-> Crystal/Ceramic Resonator

  • SYS->Debug->Serial Wire

  • Clock Configuration -> HCLK->84

  • 设置PWM->TIM3

image-20231222170505554

  • 设置输入捕获->TIM2 适当设置滤波器 打开NVIC中断

默认输入捕获通道可以设置低电平,上升沿触发

image-20231222170712990

编写程序

初始化变量(全局)

uint32_t capture_left_Buf[3] = {0};   //左电机存放计数值
uint32_t capture_right_Buf[3] = {0};   //右存放计数值
uint8_t capture_left_Cnt = 0;    //左电机状态标志位
uint8_t capture_right_Cnt = 0;   //右电机状态标志位
uint32_t left_time, right_time;   //周期时间
uint32_t left_speed, right_speed; //电机速度

中断服务函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)// 捕获中断发生时执行
{
    if(htim->Instance == TIM2)
    {
        if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
        {
            switch(capture_left_Cnt){
                case 1:
                    capture_left_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值
//                __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);  //设置为下降沿捕获
                    capture_left_Cnt++;
                    break;
                case 2:
                    capture_left_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.
//                capture_Num = capture_flag;
//                capture_flag = 0;
                    HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); //停止捕获   或者: __HAL_TIM_DISABLE(&htim2);
                    capture_left_Cnt++;
            }
        }
        if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
        {
            switch(capture_right_Cnt){
                case 1:
                    capture_right_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2);//获取当前的捕获值
                    capture_right_Cnt++;
                    break;
                case 2:
                    capture_right_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2);//获取当前的捕获值.
                    HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_2); //停止捕获   或者: __HAL_TIM_DISABLE(&htim2);
                    capture_right_Cnt++;
            }
        }
    }
}

主函数

  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
  HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);  //开启TIM2的捕获通道1
  HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);  //开启TIM2的捕获通道2
  __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);  //使能更新中断

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

      Load_PWM(500, 500);
      switch (capture_left_Cnt){
          case 0:
              capture_left_Cnt++;
              __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
              HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);	//启动输入捕获       或者: __HAL_TIM_ENABLE(&htim2);
              break;
          case 3:
              left_time = capture_left_Buf[1]- capture_left_Buf[0];    //周期
              capture_left_Cnt = 0;  //清空标志位
              break;
      }
      switch (capture_right_Cnt){
          case 0:
              capture_right_Cnt++;
              __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);
              HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);	//启动输入捕获       或者: __HAL_TIM_ENABLE(&htim2);
              break;
          case 3:
              right_time = capture_right_Buf[1]- capture_right_Buf[0];    //周期
              capture_right_Cnt = 0;  //清空标志位
              break;
      }
      printf("{\"left_time\":%d,\"right_time\":%d} \r\n",left_time, right_time);
      HAL_Delay(1000);
  }

演示

用杜邦线连接PA6->PA0 PA7->PA1

PWM脉冲 84M/168/1000 = 500Hz 1/500Hz = 20ms = 200us

(之前的截图没设置滤波器,配置都一样)

image-20231222190002435

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

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

相关文章

被有道云笔记成功劝退拥抱Joplin(Joplin使用过程遇到的问题)

本人职业程序员,培训讲师(技术类)、活动主持人,对多端阅读是有些需求的,平时习惯墨水平板、手机和笔记本电脑登录着有道云笔记。其实本人对内容比较重视,对有道云笔记提供的什么AI服务、PDF转Word等功能是没…

【python】进阶--->网络编程(二)

一、分层模型 OSI/RM(开放系统互联参考模型) 是由国际标准化组织提出来的一种网络互联模型,成为所有的销售商都能实现的开放网络模型.(OSI模型提供我们理解网络协议的内部运作) OSI模型将网络通信工作分为7层,每一层为上一层服务,并为上一层提供一个访问的接口或者界面. 越下…

用Minikube 搭建一个单机k8s玩玩

Minikube 介绍 Minikube是一款单机搭建和管理Kubernetes集群的工具。与Kind 类似,但是个人认为比Kind 好用 Minikube 安装 mac如果安装了 Homebrew,直接执行以下命令安装minikube brew install minikubemac没有安装Homebrew,需要到官网下载选择系统配置…

【Prometheus|报错】Out of bounds

【背景】进入Prometheus地址的9090端口,pushgateway(0/1)error : out of bounds 【排查分析】 1、out of bounds报错,是由于Prometheus向tsdb存数据出错,与最新存数据的时间序列有问题,有可能当前时间与最…

VGGNet

目录 一、VGGNet介绍 1、VGG块 2、VGG架构 3、LeNet, AlexNet和VGGNet对比 4、总结 二、代码实现 1、定义VGG卷积块 2、VGG网络 3、训练模型 4、总结 一、VGGNet介绍 VGGNet(Visual Geometry Group Network)是一种深度卷积神经网络,…

Android Studio 安装和使用

前些天,打开了几年前的一个Android Studio app项目,使用安卓虚拟机仿真app崩溃,怀疑是不是中间升级过Android Studio导致异常的,马上脑子一热卸载了,结果上次踩过的坑,一个没少又踩一次,谨以此文…

系列十二(面试)、Java中的GC回收类型有哪些?

一、Java中的GC回收类型 1.1、概述 Java中的GC回收类型主要包含以下几种,即:UseSerialGC、UseParallelGC、UseConcMarkSweepGC、UseParNewGC、UseParallelOldGC、UseG1GC。 1.2、源码

Linux:sudo给予账户特定的权限

我们某些用户权限比较低,如果我们他们的权限提高,或者假如搞权限的组,那么会大大减少安全性,我们可以使用sudo对他们开放指定的命令 我这里有 a1—3 3个用户,现在我切换到a1执行一下重启的命令 发现我们这个用户并无…

【vtkWidgetRepresentation】第十六期 vtkContourRepresentation(三)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkContourLineInterpolator接口的源码剖析和实例应用,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 前言 …

Uniapp 开发 BLE

BLE 低功耗蓝牙(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart),用于医疗保健、运动健身、安防、工业控制、家庭娱乐等领域。在如今的物联网时代下大放异彩,扮演者重要一环&#xff…

Ubuntu 常用命令之 man 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 man命令在Ubuntu系统中是一个非常重要的命令,它用于查看系统的手册页。手册页是Linux和Unix系统中的一种在线文档,用于描述系统中的命令、函数、配置文件等的详细信息。 man命令的基本格式是 man [选项] …

如何开发一套家政预约小程序,家政系统有哪些功能?

家政服务小程序保洁上门预约维修 同城师傅入驻抢单派单平台开发 家政保洁预约小程序的功能与特点; 一、功能介绍 1. 小程序与公众号无缝对接,支持员工预约、项目预约两种方式,用户可随时在线预约,享受便捷服务。 2. 商家在预约小程…

WiFi+蓝牙物联网定制方案——五大核心难点

WiFi蓝牙物联网定制方案可以根据具体需求进行定制: 1、设备连接方案:采用WiFi和蓝牙技术,将物联网设备与智能手机、平板电脑等设备进行连接,实现数据传输和远程控制。 2、数据传输方案:通过WiFi和蓝牙技术,…

安全基础~实战应用

文章目录 HTTP请求头应用X-Forwarded-ForHTTP动作练习(修改请求方式)浏览器信息伪造(修改User-Agent)来源请求伪造(referer应用) 密码的应用SQL注入漏洞测试(前部分)PHP_encrypt_1(ISCCCTF) XShell连接Linxu连接Windows连接 HTTP请求头应用 X-Forwarded-For 原理作用 一般的…

SpringBoot+Redis的Bloom过滤器

1.保姆级Linux安装Redis ①把redis.tar.gz下载到linux中,并用命令tar -zxvf安装 ②安装完成进入目录输入make进行编译,编译完成后输入make install 进行安装 ③创建两个文件夹mkdir bin mkdir etc 将redis目录下的redis.conf文件移动到etc文件中&…

磁盘类型选择对阿里云RDS MySQL的性能影响

测试说明 这是一个云数据库性能测试系列,旨在通过简单标准的性能测试,帮助开发者、企业了解云数据库的性能,以选择适合的规格与类型。这个系列还包括: * 云数据库(RDS MySQL)性能深度测评与对比 * 阿里云RDS标准版(x86) vs 经济…

医院影像科PACS系统源码,医学影像系统,支持MPR、CPR、MIP、SSD、VR、VE三维图像处理

PACS系统是医院影像科室中应用的一种系统,主要用于获取、传输、存档和处理医学影像。它通过各种接口,如模拟、DICOM和网络,以数字化的方式将各种医学影像,如核磁共振、CT扫描、超声波等保存起来,并在需要时能够快速调取…

Verilog基础:时序调度中的竞争(二)(创建分频时钟时,使用阻塞赋值)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 作为一个硬件描述语言,Verilog HDL常常需要使用语句描述并行执行的电路,但其实在仿真器的底层,这些并行执行的语句是有先后顺序…

汽车制造厂设备故障预测与健康管理PHM

在现代汽车制造工业中,设备的可靠性和稳定性对于保证生产线的高效运行至关重要。为了提高生产效率、降低维修成本以及确保产品质量,汽车制造厂逐渐采用设备故障预测与健康管理(PHM)系统,以实现对设备状态的实时监测和预…

第11章 GUI Page411~420 步骤五 支持其他图形

运行效果&#xff1a; 源代码 //item_i.hpp 抽象“图形元素”接口定义 #ifndef ITEM_I_HPP_INCLUDED #define ITEM_I_HPP_INCLUDED#include <wx/gdicmn.h> #include <wx/dc.h>class IItem { public://作为接口&#xff0c;记得要有虚析构virtual ~IItem(){}//使用…