首页 > 其他分享 >电机转速计算(基于码盘和IO外部中断)

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

时间:2024-05-27 12:32:48浏览次数:21  
标签:cn void trg TIM IO 转速 码盘 测速 speeds

目录

概述

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 运行代码 


<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="9m59gk2Y-1716534185716" src="https://player.bilibili.com/player.html?aid=1754972078"></iframe>

电机测速功能

概述

本文主要介绍使用外部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山使用串口终端接收数据。

 测试硬件结构

标签:cn,void,trg,TIM,IO,转速,码盘,测速,speeds
From: https://blog.csdn.net/mftang/article/details/139172089

相关文章

  • 十分钟精通MinIO:minio的原理、部署、操作
    一、认识MinIOMinio是一个简单易用的云存储服务,就像是一个放在网络上的大文件柜。想象一下,你有一间放满了各种文件的房间,有时候你需要把这些文件分享给朋友或者在不同地方访问它们。Minio就是帮你做到这一点的工具,它让你可以轻松地把文件上传到互联网上,这样无论你在哪里,只要......
  • LGMRec Local and Global Graph Learning for Multimodal Recommendation
    目录概符号说明MotivationLGMRecLocalGraphEmbeddingGlobalGraphEmbeddingFusion代码GuoZ.,LiJ.,LiG.,WangC.,ShiS.andRuanB.LGMRec:Localandglobalgraphlearningformultimodalrecommendation.AAAI,2024.概本文采用分解的方法进行对ID和模态信......
  • Istio-Ingress 与 nginx-ingress的差别
    istio-Ingress和nginx-ingress的差别istio-Ingress和nginx-ingress都是Kubernetes环境中的Ingress解决方案,但它们有以下几点主要差异:架构差异:Istio-Ingress:是IstioServiceMesh的一部分,由Envoy代理实现,与Istio的其他组件如Pilot等协作。nginx-in......
  • 在stable-DreamFusion的基础上部署ProlificDreamer
    ProlificDreamer是清华大学朱军团队发布的一款text-3D模型,是基于stable-DreamFusion代码库构建而成,主要的创新在于NeRF场的损失优化算法上,由SDS算法更新为VSD算法,得到了更好的生成结果,下面是对基于stable-DreamFusion复现完成的基础上对ProlificDreamer的部署。这种部署方式仅适......
  • 【强化学习】强化学习基础教程:基本概念、强化学习的定义,要素,方法分类 以及 Rollout、e
    【强化学习】强化学习基础教程:基本概念、强化学习的定义,要素,方法分类以及Rollout、episode回合、transition转移、trajectory轨迹的概念1.基础概念1.1强化学习的定义1.2强化学习的基本要素2.强化学习分类2.1根据agent学习方式分为基于策略的强化学习PolicybasedR......
  • E117: Unknown function: acp#enable
    问题Errordetectedwhileprocessing/usr/share/vim/vim80/plugin/acp.vim:line164:E117:Unknownfunction:acp#enablePressENTERortypecommandtocontinue解释我是下载了最新版:https://www.vim.org/scripts/script.php?script_id=1879下载了的版本是2.14.1看......
  • 【VTKExamples::Utilities】第一期 动画模拟Animation
    很高兴在雪易的CSDN遇见你 VTK技术爱好者QQ:870202403   公众号:VTK忠粉前言本文分享VTK样例Animation,希望对各位小伙伴有所帮助!感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!你的点赞就是我的动力(^U^)ノ~YO1. Animation该样例介绍如何创建一个简单的动......
  • SpringValidation
    一、概述:​JSR303中提出了BeanValidation,表示JavaBean的校验,HibernateValidation是其具体实现,并对其进行了一些扩展,添加了一些实用的自定义校验注解。​Spring中集成了这些内容,你可以在Spring中以原生的手段来使用校验功能,当然Spring也对其进行了一点简单的扩展,以便其更适......
  • 【StableDiffusion】SD基础概念
    SD基础概念https://www.bilibili.com/video/BV1EM4m1Z7Hk?p=3&vd_source=d11276664e3a69665cdbcae735af16dc大模型外挂VAE模型CLIP终止层数......
  • clion中解决控制台输出中文时的乱码问题
    1.项目编码配置都建议设置为utf-8编码  2.按住Ctrl+Shift+Alt+/,选中Registry…,然后取消run.processes.with.pty  3.重新运行程序,乱码消除(不行的话,关闭clion,再打开试试) ......