电机转速计算(基于码盘和IO外部中断)

news2024/12/23 20:40:23

目录

概述

1 硬件介绍

1.1 整体硬件结构

1.2 模块功能介绍

2 测速框架介绍

2.1 测速原理

2.2 软件框架结构

3 使用STM32Cube配置Project

3.1 准备环境

3.2 配置参数

3.3 生成Project

4 功能实现

4.1 电机控制代码

4.2 测试代码

4.3 速度计算

5 测试

5.1 编写测试代码

5.2 运行代码 


电机测速功能

概述

本文主要介绍使用外部IO中断和内部定时器,实现电机转速的测试功能。笔者基于码盘和光电测速传感器,使用STM32F103内部定时器的功能,完成测试功能设计。文章介绍其实现原理,设计方法,并基于STM32Cube软件配置参数和生成工程。完成所有的软硬件功能。

1 硬件介绍

1.1 整体硬件结构

光电测试器位置

测速码盘位置

1.2 模块功能介绍

1)测试传感器

工作原理:

当模块中的槽无遮挡时,接收管导通,DQ输出为低电平

当槽被遮挡时,DQ输出为高电平。

2)码盘

该码盘一周总共有20个孔,则其将一个圆分为20个等分,在测速的时候。只需记录其在1s时间内走过孔的个数,然后通过轮胎的周长与孔等分的关系,就能计算出速度。

 3)轮胎参数

根据参数可得,轮胎的直径为:6.8cm

2 测速框架介绍

2.1 测速原理

1)IO EXIT: 输入性IO中断,当有脉冲发生时,会产生一个外部中断,在该中断的回调函数中实现计数功能,没进入一次中断,计数加1。

2)TIME6:实现1ms的定时功能,在其内部实现一个1s计数功能,当计数count=1000时,此时计时时间为1s,读取IO EXIT中的计数值。

3)根据计数值和轮胎的周长,就可以计算出转速值

2.2 软件框架结构

3 使用STM32Cube配置Project

3.1 准备环境

软件名称版本信息
STM32CubeSTM32CubeMX 6.11
STM32 HALSTM32Cube_FW_F1_V1.8.5

3.2 配置参数

1)配置外部IO中断,设置为上升沿触发模式

2) 配置计数定时器,定时中断触发时间为1ms

 3)PWM输出配置

输出端口配置

IO端口配置

 PWM相关的参数

PWM CH1 ~ CH4端口参数,每个端口参数相同,笔者以CH1为例,介绍参数配置 

 

3.3 生成Project

配置完成参数后,点击GENERATE生成工程,打开文件如下:

4 功能实现

4.1 电机控制代码

笔者使用PWM控制电机转速,CH1和CH2控制电机的转向,所以需要配置这两个输出端口的输出特性。其实现代码如下:

void pwm_ctrl_Init( void )
{
    HAL_TIM_Base_Start( &htim8 );
    HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_2);
     
    HAL_TIM_SetPWM_Pulse( 0, TIM_CHANNEL_1);
    HAL_TIM_SetPWM_Pulse( 2000, TIM_CHANNEL_2);
}

4.2 测试代码

在外部中断回调函数中实现计数功能。在定时器计数到1s的时刻,记录下该值,用于计算转速。

static uint32_t trg_cn = 0;

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if( GPIO_Pin == INPUT_TRIGGER_Pin){
        trg_cn++;
  }
}

void Calculate_Speeds( void )
{
    printf("run count: %d \r\n", trg_cn);
    trg_cn = 0;
}

4.3 速度计算

已知参数如下:

轮胎直径(R): 6.8 cm

码盘细分数(一个周长):20个间隔

1s时间内的码盘间隔数目:CNT

转速v = (π*R)/20   * CNT ( cm )

代码实现:

 /* USER CODE BEGIN 0 */
#define  PI          3.14159
#define  R           6.8         // unit: cm
#define  DIV_CNT     20


 static uint32_t trg_cn = 0;
/* USER CODE END 0 */

float  calculate_speeds( uint32_t cnt )
{
    float speeds;
    
    speeds = ((PI*R)/20) * cnt;
    
    return  speeds;
}

打印数据函数

void Calculate_Speeds( void )
{
    float speeds;
    
    speeds = calculate_speeds( trg_cn );
    printf("run count: %d, speeds: %0.3f cm/s\r\n", trg_cn, speeds);
    trg_cn = 0;
}

5 测试

5.1 编写测试代码

在定时器的回调函数中调用打印计数函数:void Calculate_Speeds( void )

5.2 运行代码 

使用串口将测试出来的数据打印出来,在PC山使用串口终端接收数据。

 测试硬件结构

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

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

相关文章

0基础认识C语言

为了给0基础一个舒服的学习路径,就有了这个专栏希望带大家一起进步。 话不多说,开始正题。 一、C语言的一段小历史 C语言的设计要追溯到20世纪60年代末和70年代初,在那个时代美国有这么一号人叫做丹尼斯.里奇,他和同事肯.汤普逊…

pyqt 浮动窗口QDockwidget

pyqt 浮动窗口QDockwidget QDockwidget效果代码 QDockwidget QDockWidget 是 PyQt中的一个控件,它提供了一个可以停靠在主窗口边缘或者浮动在屏幕上的窗口小部件(widget)。QDockWidget 允许用户自定义其界面,并提供了灵活的停靠和…

【数据结构】栈和队列超详细解析

最重要的就是不要去看远方模糊的,而要做手边清楚的事。💓💓💓 目录 ✨说在前面 🍋知识点一:栈 • 🌰1.什么是栈? • 🌰2.如何实现栈 • 🌰3.栈的基本操作…

一文教你使用stream流轻松解决java项目数据枚举显示问题

本篇文章主要讲解java枚举、vo实体类通过stream流形式输出枚举参数的方法。 日期:2024年5月26日 作者:任聪聪 本文代码实例附件:https://download.csdn.net/download/hj960511/89361611 实际效果 可以看到在枚举参数的基础上,我们…

56.合并区间

class Solution {public int[][] merge(int[][] intervals) {// 对 intervals 数组按照每个区间的开始位置进行排序Arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);int len intervals.length;// 创建结果数组 res,初始化长度为 intervals 的长度int[][] re…

【Text2SQL 经典模型】TypeSQL

论文:TypeSQL: Knowledge-Based Type-Aware Neural Text-to-SQL Generation ⭐⭐⭐ Code: TypeSQL | GitHub 一、论文速读 本论文是在 SQLNet 网络上做的改进,其思路也是先预先构建一个 SQL sketch,然后再填充 slots 从而生成 SQL。 论文发…

Thinkphp5内核宠物领养平台H5源码

源码介绍 Thinkphp5内核流浪猫流浪狗宠物领养平台H5源码 可封装APP,适合做猫狗宠物类的发信息发布,当然懂的修改一下,做其他信息发布也是可以的。 源码预览 源码下载 https://download.csdn.net/download/huayula/89361685

什么是云渗透测试?

推荐阅读: 什么是安全态势? 什么是人肉搜索 什么是恶意软件? 什么是数字取证? 什么是语音网络钓鱼? 什么是网络安全中的社会工程? 什么是网络安全中的威胁情报? 什么是端点检测和响应 (…

面试中算法(A星寻路算法)

一、问题需求: 迷宫寻路游戏中,有一些小怪物要攻击主角,现在希望你给这些小怪物加上聪 明的AI (Artificial Intelligence,人工智能),让它们可以自动绕过迷宫中的障碍物,寻找到主角的所在。 A星…

flink程序本地运行:No ExecutorFactory found to execute the application

1.问题描述 在idea中运行flink job程序出现如下错误: Exception in thread "main" java.lang.IllegalStateException: No ExecutorFactory found to execute the application. at org.apache.flink.core.execution.DefaultExecutorServiceLoader.getE…

Linux基础 (十):Linux 信号的使用

目录 一、信号的基本概念 二、信号处理常见方式概览 三、修改信号的响应方式 – signal() 3.1 简单复习结束前台进程 3.2 改变SIGINT信号的响应方式 3.3 自定义方式改变进程对信号的响应 3.4 进程对信号作出两种响应 四、发送信号 – kill() 五、利用信号解决僵死进程…

Apache CXF Aegis databinding SSRF 高危漏洞修复

一、漏洞修复 Apache CXF Aegis databinding SSRF漏洞 Spring Web UriComponentsBuilder URL解析不当漏洞 二、修复步骤 1、Apache CXF Aegis databinding SSRF漏洞修复 步骤: 进入服务器搜索 databinding find -name *databinding* 发现版本是3.1.6 果断…

springboot项目中图片上传之后需要重启工程才能看到图片?

需求背景 最近在做一个用户自定义上传头像的小需求,用户上传头像然后需要立马回显。 需求是很常见的、正当的需求。如果不使用到对象存储这类服务,我们把用户头像的图片文件仅存在本地就可以了。我们在开发的过程中为了工程管理方便通常下意识会将图片…

list的模拟实现(一)

嗨喽大家好,时隔许久阿鑫又给大家带来了新的博客,list的模拟实现(一),下面让我们开始今天的学习吧! list的模拟实现(一) 1.list splice接口的使用 2.list尾插的实现 3.list的迭代…

瑞昱半导体AMB82 MINI(RTL8735B)Arduino 方法介绍

介绍瑞昱半导体(Realtek )AMB82-Mini 物联网 AI开发板 Ameba是一个易于编程的平台,用于开发各种物联网应用程序。AMB82 MINI配备了各种外设接口,包括WiFi、BLE、GPIO INT、I2C、UART、SPI、PWM、ADC。通过这些接口,AM…

Reids高频面试题汇总总结

一、Redis基础 Redis是什么? Redis是一个开源的内存数据存储系统,它可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,并提供了丰富的操作命令来操作这些数据结构。Redis的主要特点是什么? 高性能:Redis将数据存储在内…

C语言代码错误(一)

今天在写选择排序代码时&#xff0c;在测试数据发现不能显示结果 1、代码如下&#xff1a; #include <stdio.h>int main(void) {int i, j; // 循环变量int MinIndex; // 保存最小的值的下标int buf; // 互换数据时的临时变量int n;printf("你想输入多少个数据n:\n…

ElasticSearch插件版本与ES版本不对应的解决方案

一、背景 最近需要给es安装ik、hanlp分词器和ingest-attachment管道&#xff0c;服务器已有的es版本为8.5.3&#xff08;似乎太新了&#xff09;&#xff0c;hanlp和ingest-attachment都没有这么高的版本&#xff0c;因此只能下载相对老的版本&#xff0c;然后自己修改配置文件…

C#同花顺下单 模拟操作版接口实现

C#同花顺下单 模拟操作版接口的实现 采用C#编程语言实现&#xff0c;对同花顺下单界面自动控制&#xff0c;将实现方法封装为DLL可以任意使用&#xff0c;支持几乎所有券商&#xff0c;不需要更换特定的券商。 比如当下最流行的QMT量化软件&#xff0c;仍然受限于特定的券商&a…

springboot小结1

什么是springboot ​ Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的&#xff0c;使用它可以做到专注于Spring应用的开发&#xff0c;而无需过多关注XML的配置。 ​ 简单来说&#xff0c;它提供了一堆依赖打包Starter&#xff0c;并已经按照使用习惯解决…