stm32霍尔编码器电机测速原理

2023-11-17

        本次选用的编码器电机为13线的霍尔编码器电机,电机减速比为30:1,转动一圈输出13*30=390个脉冲。轮胎直径为75mm,轮胎周长为pi*d=3*75=225mm.定时器采用四倍频计数,则一圈输出390*4=1560个脉冲。具体编码器知识这里就不多说了。

         根据测速原理:假设编码器输出的脉冲数为N,而电机转动一圈输出1569个脉冲,转动一圈轮子将前进225mm。那输出脉冲数为N时前进的距离就应该为225*(N/1560)mm,再除以时间及可得速度。

下面为具体代码:

encoder.c文件

#include "encoder.h"

void Encoder_TIM2_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		//开时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;							//配置IO口
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;				//定时器初始化
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period = 65535;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
	
	//定时器编码器模式初始化
	TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
	
	TIM_ICInitTypeDef TIM_ICInitStruct; 						//输入捕获单元配置
	TIM_ICStructInit(&TIM_ICInitStruct);
	TIM_ICInitStruct.TIM_ICFilter = 10;
	TIM_ICInit(TIM2, &TIM_ICInitStruct);
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	TIM_SetCounter(TIM2, 0);
	
	TIM_Cmd(TIM2, ENABLE);
}

void Encoder_TIM4_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period = 65535;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 0;
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
	
	TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
	
	
	TIM_ICInitTypeDef TIM_ICInitStruct; 
	TIM_ICStructInit(&TIM_ICInitStruct);
	TIM_ICInitStruct.TIM_ICFilter = 10;
	TIM_ICInit(TIM4, &TIM_ICInitStruct);
	
	TIM_ClearFlag(TIM4, TIM_FLAG_Update);
	
	TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
	
	TIM_SetCounter(TIM4, 0);
	
	TIM_Cmd(TIM4, ENABLE);
}

int Read_Spead(int TIMx)			//读取编码器输出脉冲数
{
	int value_1;
	switch(TIMx)
	{
		case 2:value_1 = (short)TIM_GetCounter(TIM2);TIM_SetCounter(TIM2, 0);break;
		case 4:value_1 = (short)TIM_GetCounter(TIM4);TIM_SetCounter(TIM4, 0);break;
		default:value_1 = 0;
	}
	return value_1;
}

void TIM2_IRQHander(void)
{
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) == 1)
	{
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

void TIM4_IRQHander(void)
{
	if(TIM_GetITStatus(TIM4, TIM_IT_Update) == 1)
	{
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
	}
}

        我使用的是简单的delay一下来采集定时器捕获的编码器脉冲数,不过我建议使用定时器中断来处理编码器采集。此函数只采集右轮脉冲进行计算

主函数循环体内函数:

while(1)
	{
		delay_s(1);
		{
			uint16_t right = Read_Spead(2);//采集右轮脉冲数
			displacement = 0.225 * (right / 1560);//计算位移
			speed = displacement;//由于我设置的为延时一秒就不用除时间
			OLED_Float(0, 0, speed, 4);//通过OLED显示速度
			set_PWM(999);//设置电机PWM
			TIM_SetCounter(TIM2, 0);//下一次一秒计数前再一次将计数清零
		}
	}

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

stm32霍尔编码器电机测速原理 的相关文章

  • C/C++---------------LeetCode第509. 斐波那契数

    斐波那契数列 题目及要求 暴力递归 备忘录的递归 动态规划 题目及要求 斐波那契数 通常用 F n 表示 形成的序列称为 斐波那契数列 该数列由 0 和 1 开始 后面的每一项数字都是前面两项数字的和 也就是 F 0 0 F 1 1 F n
  • 华为OD机试真题-密码解密-2023年OD统一考试(C卷)

    题目描述 给定一段 密文 字符串s 其中字符都是经过 密码本 映射的 现需要将 密文 解密并且输出 映射的规则 a i 分别用 1 9 表示 j z 分别用 10 26 表示 约束 映射始终唯一 输入描述 密文 字符串 输出描述 明文字符串
  • 华为OD机试真题-查找一个有向网络的头节点和尾节点-2023年OD统一考试(C卷)

    题目描述 给定一个有向图 图中可能包含有环 图使用二维矩阵表示 每一行的第一列表示起始节点 第二列表示终止节点 如 0 1 表示从0到1的路径 每个节点用正整数表示 求这个数据的首节点与尾节点 题目给的用例会是一个首节点 但可能存在多个尾节
  • C语言入门引导

    第一章 概述 第一节 引例 第二节 C语言的基本字符与关键字 第三节 算法及其表示 第二章 数据类型 运算符与表达式 第一节 C语言的数据类型 第二节 常量与变量 第三节 运算符与表达式 第四节 数据类型转换 第三章 顺序结构与程序设计 第
  • 你好,C++(3)2.1 一个C++程序的自白

    第2部分 与C 第一次亲密接触 在浏览了C 三分天下 的世界版图之后 便对C 有了基本的了解 算是一只脚跨入了C 世界的大门 那么 怎样将我们的另外一只脚也跨入C 世界的大门呢 是该即刻开始编写C 程序 还是 正在我们犹豫的时候 便看到前面
  • 华为OD机试真题-螺旋数字矩阵-2023年OD统一考试(C卷)

    题目描述 疫情期间 小明隔离在家 百无聊赖 在纸上写数字玩 他发明了一种写法 给出数字 个数n 和 行数m 0 lt n 999 0 lt m 999 从左上角的1开始 按照 顺时针螺旋向内写 方式 依次写出2 3 n 最终形成一个 m行矩
  • C 库函数 - mktime()

    描述 C 库函数 time t mktime struct tm timeptr 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数 发生错误时返回 1 声明 下面是 mktime 函数的声明 time
  • C/C++编程中的算法实现技巧与案例分析

    C C 编程语言因其高效 灵活和底层的特性 被广大开发者用于实现各种复杂算法 本文将通过10个具体的算法案例 详细探讨C C 在算法实现中的技巧和应用 一 冒泡排序 Bubble Sort 冒泡排序 Bubble Sort 是一种简单的排序
  • C 库函数 - gmtime()

    描述 C 库函数 struct tm gmtime const time t timer 使用 timer 的值来填充 tm 结构 并用协调世界时 UTC 也被称为格林尼治标准时间 GMT 表示 声明 下面是 gmtime 函数的声明 st
  • 华为OD机试真题-部门人力分配-2023年OD统一考试(C卷)

    题目描述 部门在进行需求开发时需要进行人力安排 当前部门需要完成N个需求 需求用requirements 表示 requirements i 表示第i个需求的工作量大小 单位 人月 这部分需求需要在M个月内完成开发 进行人力安排后每个月的人
  • 《妙趣横生的算法》(C语言实现)- 第6章 数学趣题(二)

    6 1 连续整数固定和问题 找出任意输入的整数n的全部的连续整数固定和 题目分析 至少要找出两个连续整数的固定和 一个整数的话就是本身了呢 那如何确定这些连续整数呢 想明白了 第一个整数设为a 第二个整数是a 1 假设有m个连续整数 那么第
  • linux ARM64 处理器内存屏障

    一 内存类型 ARMv8架构将系统中所有的内存 按照它们的特性 划分成两种 即普通内存和设备内存 并且它们是互斥的 也就是说系统中的某段内存要么是普通内存 要么是设备内存 不能都是 1 普通内存 Normal Memory 普通内存的特性是
  • 华为OD机试真题-部门人力分配-2023年OD统一考试(C卷)

    题目描述 部门在进行需求开发时需要进行人力安排 当前部门需要完成N个需求 需求用requirements 表示 requirements i 表示第i个需求的工作量大小 单位 人月 这部分需求需要在M个月内完成开发 进行人力安排后每个月的人
  • linux ARM64 处理器内存屏障

    一 内存类型 ARMv8架构将系统中所有的内存 按照它们的特性 划分成两种 即普通内存和设备内存 并且它们是互斥的 也就是说系统中的某段内存要么是普通内存 要么是设备内存 不能都是 1 普通内存 Normal Memory 普通内存的特性是
  • 【C++项目】【报错】[错误] new: No such file or directory, compilation terminated【及解决方法】

    一 问题描述 C源代码文件在编译过程中报错 错误 new No such file or directory compilation terminated 代码如下 include
  • C语言——!(--x)和!(-x)以及while(!(--x)) 和 while(!(-x))

    一 x 和 x 1 x 这个表达式表示先对变量 x 执行自减操作 即 x 的值减去 1 然后对自减后得到的结果取逻辑非 如果自减后的 x 等于 0 则逻辑非运算的结果为真 值为 1 否则结果为假 值为 0 2 x 这个表达式表示对 x 取反
  • 华为OD机试真题-反射计数-2023年OD统一考试(C卷)

    题目描述 给定一个包含 0 和 1 的二维矩阵 给定一个初始位置和速度 一个物体从给定的初始位置触发 在给定的速度下进行移动 遇到矩阵的边缘则发生镜面反射 无论物体经过 0 还是 1 都不影响其速度 请计算并给出经过 t 时间单位后 物体经
  • /lib64/libstdc++.so.6库缺失

    问题 lib64 libstdc so 6 version CXXABI 1 3 8 not found lib64 libstdc so 6 version CXXABI 1 3 9 not found lib64 libstdc so
  • 华为OD机试真题-API集群负载统计-Java-OD统一考试(C卷)

    题目描述 某个产品的RESTful API集合部署在服务器集群的多个节点上 近期对客户端访问日志进行了采集 需要统计各个API的访问频次 根据热点信息在服务器节点之间做负载均衡 现在需要实现热点信息统计查询功能 RESTful API的由多
  • 用栈实现队列(OJ中报错的处理)

    用栈实现队列 ERROR AddressSanitizer myQueueFree函数中栈的释放处现了问题 没有调用StackDestory而是直接free了 这个是栈初始化时 capacity与malloc申请的空间大小没有匹配 请你仅使

随机推荐

  • 方法简单手把手教你,空闲时间在家剪辑视频,一天收入300多

    做一个视频剪辑号 不开玩笑 认真做一个月真的能做到1w 有不少人都不知道 我们平时在手机上刷到的横屏视频都是可以赚钱的 而且也可以不用露脸拍摄视频 下班在家也可以赚取一份额外收入 很多人就会有疑问了 不露脸 不拍摄视频怎么赚钱 其实做视频剪
  • 【netty】netty HashedWheelTimer 延时队列

    1 概述 想要研究这个是因为 Flink Flink 写入 Clickhouse 大对象直接进入老年代 导致OOM 遇到了这个问题 在这个问题中 我将时间轮改小了 时间轮 512改成16个 Netty中提供的HashedWheelTimer
  • 代码实现对selenium的驱动器WebDrive的配置

    1 条件 1 使用的浏览器是Microsoft Edge 2 简述过程 代码实现 1 pip 安装 2 下载 3 解压 4 运行 3 发现一个报错 1 原因 在给出代码之前 我发现一个报错 很离谱 且听笔者慢慢细说 首先 安装了seleni
  • 编译 - Make 命令教程 以及Makefile - 学习/实践

    1 应用场景 主要用于学习和使用make命令进行软件编译安装 2 学习 操作 1 文档阅读 Make 命令教程 阮一峰的网络日志 Make GNU Project Free Software Foundation 第21讲 如何使用脚本语言
  • 关系表的构成要素主键_数据库:关系型数据库的基本术语有哪些?

    一 关系 relation 关系就是二维表 二维表的名字就是关系的名字 二 属性 attribute 二维表中的每个列就称为一个属性 或叫字段 每个属性有一个名字 称为属性名 三 值域 domain 二维表中属性的取值范围称为值域 四 元组
  • 分治法篇:卷一:最简单的分治法应用例子

    2023年4月25日 周二早上 我想从最简单的分治法应用例子开始 而不是从经典的例子开始 用分治法求解数组中的最大值 纯享版 include
  • 《基于 Vue 组件库 的 Webpack5 配置》6.将字体库和图片等静态资料,编译后打包至指定文件夹

    参考 Rule generator filename package json 的配置如下 module exports module test png svg jpg jpeg gif i type asset resource gene
  • 【C语言-进阶】指针进阶

    1 字符指针 字符指针的基本使用略了 把常量字符串 abcdef 的首元素地址放在字符型指针p中 p中存储的就是字符a的地址 而因为他们是在内存中连续存储的 且字符串末尾有自动添加到 0 所以可以用printf形式打印出来 这时如果用指针p
  • C++复习笔记--STL的常见遍历、查找和排序算法的使用

    目录 1 STL常用算法的概述 2 常用遍历算法 2 1 for each 2 2 transform 3 常用查找算法 3 1 find 3 1 1 查找内置类型元素 3 1 2 查找自定义类型元素 3 2 find if 3 2 1 查
  • unity3d IK动画

    IK动画 反向动力学 Inverse Kinematics 就是反过来的呗 即用物体带动骨骼运动 IK动画绑定 void OnAnimatorIK int layerIndex 看向准星 if front sign null animato
  • bootstrap使用之stickUp(固定导航栏)

    1 stickUp是jQuery下的一个导航栏插件 当界面较长时 导航栏会固定在顶部 不会移动 如下图 2 废话少说 下载http www bootcss com p stickup 在里面有示例文档 只是注意看index的时候js写在下面
  • 2 QT—资料文件管理 动作使用设置快捷键

    图标文件下载 https wwa lanzoui com iiZODwjcsbc 项目文件下载 https wwa lanzoui com is9N5wjct3a 1 创建主窗口菜单 1 新建 Qt Widgets 应用 项目名称为 myM
  • JAVA读取USB扫描枪

    利用JAVA程序获取扫描枪的数据 package barcode import java util concurrent BlockingQueue import java util concurrent LinkedBlockingQue
  • Vue实战项目开发--Vue中的动画特效

    项目的源代码在GitHub上 点击查看 目录 vue中的css动画原理 在Vue中使用Animate css库 在Vue中同时使用过渡属性和动画 Vue中的Js动画与Velocity js的结合 Vue中多个元素或组件的过渡 vue中的列表
  • 基于深度学习的高精度人体摔倒行为检测识别系统(PyTorch+Pyside6+YOLOv5模型)

    摘要 基于深度学习的高精度人体摔倒行为检测识别系统可用于日常生活中或野外来检测与定位人体摔倒行为目标 利用深度学习算法可实现图片 视频 摄像头等方式的人体摔倒行为目标检测识别 另外支持结果可视化与图片或视频检测结果的导出 本系统采用YOLO
  • android 对话框学习

    首先需要创建ProgressDialog对象 然后使用线程控制进度条显示 具体源代码 view source print 001 package com yarin android TestOnPDialog 002 003 import
  • hdu 1080 Human Gene Functions

    Problem acm hdu edu cn showproblem php pid 1080 Meaning 给出一个二维表 similarity 表示对应核苷酸配对时的相似度值 横杠 表示用空格代替一个核苷酸 给出两个DNA序列 a 和
  • PCB添加图片或logo的方法

    系列文章目录 1 元件基础 2 电路设计 3 PCB设计 4 元件焊接 6 程序设计 文章目录 前言 一 图片预处理 转为 BMP格式 二 给Altium designer安装PCB LOGO Creator脚本插件 三 给PCB添加图片或
  • 【读书笔记->数据分析】BDA教材《数据分析》书籍介绍

    BDA教材 数据分析 书籍介绍 BDA BDA数据分析职业技能等级 旨在培养基于数据分析理论 计算机技术以及行业案例应用 三维一体 的大数据分析人才 培养数据管理 数据分析 数据挖掘 数据洞察方面的复合型和应用型专业人才 BDA数据分析师证
  • stm32霍尔编码器电机测速原理

    本次选用的编码器电机为13线的霍尔编码器电机 电机减速比为30 1 转动一圈输出13 30 390个脉冲 轮胎直径为75mm 轮胎周长为pi d 3 75 225mm 定时器采用四倍频计数 则一圈输出390 4 1560个脉冲 具体编码器知