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

目录

概述

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     20static 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.rhkb.cn/news/332641.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建CMS系统

搭建CMS系统 1 介绍 内容管理系统(Content Management System,CMS)是一种用于管理、发布和修改网站内容的系统。开源的CMS系统有WordPress、帝国CMS等,国产的Halo很不错。 WordPress参考地址 # 官网 https://wordpress.org/# …

OrangePi KunPengPro | 开发板开箱测评之学习与使用

OrangePi KunPengPro | 开发板开箱测评之学习与使用 时间:2024年5月23日20:51:12 文章目录 OrangePi KunPengPro | 开发板开箱测评之学习与使用概述1.参考2.资料、工具3.使用3-1.通过串口登录系统3-2.通过SSH登录系统3-3.安装交叉编译工具链3-4.复制文件到设备3-5.第…

SpringMVC:创建一个简单的SpringMVC框架S

目录 一、框架介绍 两个重要的xml文件 SpringMVC执行流程 二、Vscode搭建SpringMVC框架 1、maven创建webapp原型项目 2、pom.xml下添加springmvc的相关依赖 3、在web.xml配置 4、springmvc.xml的配置 5、编写Controller控制器类 6、 编写JSP界面 7、项目结构图 一…

【除自身以外数组的乘积】python

目录 思路: 代码: 思路: 直接计算前缀乘积,后缀乘积,然后相乘即可 开始我还在想,遍历一次i,怎么能同时计算前缀乘积和后缀乘积,事实上分开计算比较方便。。 代码: cl…

基于SpringBoot和Mybatis实现的留言板案例

目录 一、需求及界面展示 二、准备工作 引入依赖 .yml文件相关配置 数据库数据准备 三、编写后端代码 需求分析 代码结构 Model Mapper Service Controller 前端代码 四、测试 一、需求及界面展示 需求: 1. 输入留言信息,点击提交&…

hubilder Android模拟器华为手机连接不上

APP真机测试注意点: 1. 同一个局域网下 2. 手机连接USB模式(华为选择USB配置:音频来源) ,开发者模式 3. 实在不行重启HBuilderX再运行真机 可是卡在了“正在安装手机端HBuilder调试基座...” 就没反应了?&…

Flask+Vue+MySQL天水麻辣烫管理系统设计与实现(附源码 配置 文档)

背景: 同学找到我期望做一个天水麻辣烫的网页,想复用以前做过的课设,结合他的实际需求,让我们来看看这个系统吧~ 项目功能与使用技术概述: 里面嵌入了6个子系统,其中餐饮系统可以进行餐馆信息添加、修改…

Jeecg | 完成配置后,如何启动整个项目?

前端启动步骤: 1. 以管理员身份打开控制台,切换到前端项目目录。 2. 输入 pnpm install 3. 输入 pnpm dev 4. 等待前端成功运行。 可以看到此时前端已经成功启动。 后端启动步骤: 1. 启动 mysql 服务器。 管理员身份打开控制台&#…

微服务-系统架构

微服务: 系统架构的演变 单一应用架构 早期的互联网应用架构,大量应用服务 功能 集中在一个包里,把大量的应用打包为一个jar包,部署在一台服务器,例如tomcat上部署Javaweb项目 缺点:耦合度高,一台服务器…

谷歌浏览器使用vue插件查看表单提交的数据

1.查看组件: 对应代码里主页面引用的组件名: 表单名称,对应组件里form表单名: 左边的层次结构: 右边层次结构:

【vue2配置】Vue Router

Vue Router官网 1、npm install vue-router4 2、创建模块,在src目录小创/views/map/MapIndex.vue模块和创router/index.js文件 3、在router/index.js配置路由 import Vue from "vue"; import Router from "vue-router"; // 引入模块 const Ma…

【限免】杂波环境下线性调频脉冲、巴克码、频率步进脉冲雷达MTI、脉冲压缩【附MATLAB代码】

来源:微信公众号:EW Frontier 本代码主要模拟杂波环境(飞机、地杂波、鸟类信号)下,Chirp脉冲、巴克码脉冲、频率步进脉冲雷达信号的脉冲压缩及MTI、​匹配滤波。 MATLAB主代码 % 定义参数 fs 1000; % 采样率 T 1; …

基于EV54Y39A PIC-IOT WA的手指数量检测功能开发(MPLAB+ADC)

目录 项目介绍硬件介绍项目设计开发环境及工程参考总体流程图硬件基本配置光照传感器读取定时器检测逻辑 功能展示项目总结 👉 【Funpack3-2】基于EV54Y39A PIC-IOT WA的手指数量检测功能开发 👉 Github: EmbeddedCamerata/PIC-IOT_finger_recognition 项…

C++ prime 第五版 第14章 重载运算与类型转换

一、基本概念 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成。和其他函数一样,重载的运算符也包含返回类型、参数列表以及函数体。 我们不能为内置类型的运算对象重定义运算符。对于一个运算符函数来说&…

【Linux】 虚拟机可以ping通主机 主机却ping不通虚拟机 解决方法

我当时初学linux,需要虚拟机联网,且虚拟机和windows需要能相互ping通,我当时就是虚拟机一切正常,虚拟机显示有网可以ping通百度,也可以ping通windows,但是windows就是ping不通虚拟机,这个问题困…

如何关闭或者减少屏蔽 CloudFlare 的真人检测

经常浏览境外网站的应该常碰到一个真人检测的提示(如下图所示)。最近,明月就收到了一个知乎上的付费咨询:问我如何去掉这个提示,由此明月也特别的研究了一下这个“真人检测”,这算是 CloudFlare 的一个特色了,基本上大家看到站点访问有这个提示的几乎都是用了 CloudFlar…

list的模拟实现(一)

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

Elasticsearch集群和Logstash、Kibana部署

1、 Elasticsearch集群部署 服务器 安装软件主机名IP地址系统版本配置ElasticsearchElk10.3.145.14centos7.5.18042核4GElasticsearchEs110.3.145.56centos7.5.18042核3GElasticsearchEs210.3.145.57centos7.5.18042核3G 软件版本:elasticsearch-7.13.2.tar.gz 示…

【vue3+elementuiplus】el-select下拉框会自动触发校验规则

场景:编辑弹框省份字段下拉框必填,触发方式change,有值第一次打开不会触发校验提示,关闭弹框再次打开触发必填校验提示,但是该字段有值 问题的原因是:在关闭弹层事件中,我做了resetfileds&…

使用docker完整搭建前后端分离项目

1、docker的优势,为啥用docker 2、docker的核心概念 镜像【Image】- 只读模板 容器【Container】- 运行镜像的一个外壳,相当于一个独立的虚拟机 仓库【repository】- 镜像的管理工具,可公开,可私有;类似git仓库 3、c…