当前位置: 首页 > news >正文

电机测试方法的介绍与功能实现(T测试方法)

目录

概述

1 理论介绍

2 实现原理

2.1 旋转式编码器原理

2.2 系统实现框图

2.3 测速原理 

2.4 计算速度值

3 STM32Cube配置项目

3.1 软件版本信息

3.2 配置项目

4 代码实现

4.1 电机速度控制

4.2 速度计算函数

4.3 功能实现

5 测试


概述

本文主要介绍测试电机速度方法(T测试方法)的实现原理与功能实现,笔者使用STM32F103芯片作为主控,并使用光电编码器作为测速装置,基于定时器和PWM实现电机速度测试和速度控制功能。还应该STM32Cube搭建项目实现测速的功能。

1 理论介绍

T 法:又叫做周期测量法。这种方法是建立一个已知频率的高频脉冲并对其计数,计数时间由捕获到的编码器相邻两个脉冲的间隔时间 T 决定,计数值为 M1。设编码器单圈总脉冲数为 C,高频脉冲的频率为 F0,则转速 n 的计算公式为:


公式中的参数介绍:

C:   编码器单圈总脉冲数

F0:  高频脉冲频率

M1:  编码器相邻两个脉冲的间隔时间计数

从公式可以看出,在电机高转速的时候,编码器脉冲间隔时间 TE 很小,使得测量周期内的高频脉冲计数值 M1 也变得很少,导致测量误差变大,而在低转速时, TE 足够大,测量周期内的 M1 也足够多,所以 T 法和 M 法刚好相反,更适合测量低速
 

2 实现原理

2.1 旋转式编码器原理

旋转编码器内部大都由码盘、光电检测装置和信号处理电路等部分构成。码盘上刻了若干圈线槽,线槽等距并且可透光,当码盘旋转时就会周期性的透过和遮挡来自光电检测装置的光线,这样检测装置就会周期性的生成若干电信号。但是这些电信号通常比较微弱,需要加入一套处理电路对信号进行放大和整形,最后把信号整形为脉冲信号并向外输出。

旋转式编码器的原理示例图:

2.2 系统实现框图

系统使用STM32F103作为主控芯片,TIMER-8定时器用于产生两路PWM信号驱动电机;使用IO 输入中断捕捉编码器的脉冲信号;TIMER-7产生高频信号用于统计两个编码器脉冲之间的高频脉冲个数。

2.3 测速原理 

参数介绍:

M0:  两个编码器脉冲之间的时间间隔

F0:  高频脉冲的个数

测速原理描述:

Step-1: 当M0上升沿时开启F0的计数

Step-2:    当M0第二次发生上升沿中断时,停止计数

2.4 计算速度值

已知参数:

轮胎直径(R): 6.8 (cm)

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

一个M0时间内测试到F0的:CNT

F0的周期为:    T(us)

计算公式如下:

V = (R/20)/(T*CNT)(cm/s)

3 STM32Cube配置项目

3.1 软件版本信息

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

3.2 配置项目

1)配置编码器IO,使能输入IO中断( External interrupt )

2)配置定时器计数中断,中断间隔时间为10us ( MCU系统工作时间为72M)

 

 3)定时器Timer-8产生PWM,其周期为10ms

 Timer-8的参数:

PWM的参数:

 

 配置参数完成后,就可以生成项目代码:

4 代码实现

4.1 电机速度控制

通过改变PWM的占空比来调整电机的转速,具体实现代码如下:

void pwm_ctrl_Init( void )
{HAL_TIM_Base_Stop( &htim8 );HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_1);    // PC6 HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_2);    // PC7HAL_TIM_SetPWM_Pulse( 1500, TIM_CHANNEL_1);HAL_TIM_SetPWM_Pulse( 0, TIM_CHANNEL_2);
}

4.2 速度计算函数

通过第二章节的原理可知,码盘间隔、轮胎直径、测试定时器频率已知。根据这些参数就能计算电机的转速。

#define  PI                             3.14159
#define  R                              6.8              // unit: cm
#define  DIV_CNT                        20
#define  CYCLE_TIME                     20               // us
#define  CYC_INTEV                     ((PI*R)/DIV_CNT)  //cm
#define  PARA                           CYC_INTEV*(1000000/CYCLE_TIME)#if 1#define pr_debug(fmt, args...)     printf("DEBUG: " fmt, ##args)
#else#define pr_debug(fmt, args...)
#endifstatic uint32_t mfreq_cnt = 0;
static bool enable_cnt = false;float  calculate_speeds( uint32_t cnt )
{float speeds;speeds = PARA/cnt;pr_debug("run count: %d, speeds: %0.3f cm/s\r\n", cnt, speeds);return  speeds;
}

4.3 功能实现

代码48行: 重新EXTI中断函数

代码52行: 判断码盘的脉冲

代码56行: 记录第一次的脉冲位置

代码62行: 记录第二次的脉冲位置

代码63行: 禁止计数

代码64行: 计算速度

代码71行:定时器计数函数,该函数被HAL_TIM_PeriodElapsedCallback调用

源代码:

#define  PI                             3.14159
#define  R                              6.8              // unit: cm
#define  DIV_CNT                        20
#define  CYCLE_TIME                     20               // us
#define  CYC_INTEV                      ((PI*R)/DIV_CNT)  //cm
#define  PARA                           CYC_INTEV*(1000000/CYCLE_TIME)#if 1#define pr_debug(fmt, args...)     printf("DEBUG: " fmt, ##args)
#else#define pr_debug(fmt, args...)
#endifstatic uint32_t mfreq_cnt = 0;
static bool enable_cnt = false;float  calculate_speeds( uint32_t cnt )
{float speeds;speeds = PARA/cnt;pr_debug("run count: %d, speeds: %0.3f cm/s\r\n", cnt, speeds);return  speeds;
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{static uint16_t trg_cn = 0;if( GPIO_Pin == INPUT_TRIGGER_Pin){switch( trg_cn ){default:case 0:mfreq_cnt = 0;trg_cn = 1;enable_cnt = true;break;case 1:enable_cnt = false;calculate_speeds(mfreq_cnt);trg_cn = 0;break;}}
}void HAL_TimerCnt( void )
{if( enable_cnt ){mfreq_cnt++;}
}

5 测试

1)测试1

 电机转速控制PWM 占空比配置为:1500/10000。测试得到的速度如下:

2)测试2

 电机转速控制PWM 占空比配置为:5000/10000。测试得到的速度如下:

 

相关文章:

电机测试方法的介绍与功能实现(T测试方法)

目录 概述 1 理论介绍 2 实现原理 2.1 旋转式编码器原理 2.2 系统实现框图 2.3 测速原理 2.4 计算速度值 3 STM32Cube配置项目 3.1 软件版本信息 3.2 配置项目 4 代码实现 4.1 电机速度控制 4.2 速度计算函数 4.3 功能实现 5 测试 概述 本文主要介绍测试电机速…...

多线程和多进程的快速入门

多线程和多进程的快速入门 学习自:莫烦Python www.mofanpy.com Threading - 多线程运算python程序 ​ 多线程的简单理解:把数据分成很多段,将每一段数据放入一个线程,将所有的线程同时开始,大大的节省了运算时间。相…...

【TensorFlow深度学习】经典卷积网络架构回顾与分析

经典卷积网络架构回顾与分析 经典卷积网络架构回顾与分析:从AlexNet到ResNet、VGGLeNet、ResNet、DenseNet的深度探索AlexNet ——深度学习的破冰点火VGGNet — 简洁的美ResNet — 深持续深度的秘钥DenseNet — 密集大成塔实战代码示例:ResNet-50模型结语…...

Salesforce推出Einstein 1 Studio:用于自定义Einstein Copilot并将人工智能嵌入任何CRM应用程序的低代码人工智能工具

一、关键要点 1. Salesforce管理员和开发人员现在可以在每个Salesforce应用程序和工作流程中构建、定制和嵌入人工智能,包括Einstein Copilot。 2. Einstein 1 Studio与数据云深度集成,通过对客户数据和元数据的全面理解,解锁并统一被捕获的…...

点赋科技:建设智能饮品高地,打造数字化产业先锋

在当今数字化时代的浪潮中,点赋科技以其敏锐的洞察力和卓越的创新能力,致力于建设智能饮品高地,打造数字化产业先锋。 点赋深知智能饮品机对于推动社会进步和满足人们日益增长的需求的重要性。因此,他们投入大量资源和精力&#x…...

ORACLE RAC的一些基本理论知识

一 . Oracle RAC 的发展历程 1. Oracle Parallel Server (OPS) 早期阶段:Oracle 6 和 7 Oracle Parallel Server(OPS)是 Oracle RAC 的前身。 通过多个实例并行访问同一个数据库来提高性能。 共享磁盘架构,利用分布式锁管理&am…...

CMake的作用域:public/private/interface

在 CMake 中,public、private和 interface是用来指定目标属性的作用域的关键字,这三个有什么区别呢?这些关键字用于控制属性的可见性和传递性,影响了目标之间的依赖关系和属性传递。 public 如果在一个目标上使用 public关键字时…...

设计模式基础知识点(七大原则、UML类图)

Java设计模式(设计模式七大原则、UML类图) 设计模式的目的设计模式七大原则单一职能原则(SingleResponsibility)接口隔离原则(InterfaceSegreation)依赖倒转原则(DependenceInversion&#xff0…...

Android开机动画的结束过程BootAnimation(基于Android10.0.0-r41)

文章目录 Android 开机动画的结束过程BootAnimation(基于Android10.0.0-r41) Android 开机动画的结束过程BootAnimation(基于Android10.0.0-r41) 路径frameworks/base/cmds/bootanimation/bootanimation_main.cpp init进程把我们的BootAnimation的二进制文件拉起来了&#xf…...

微软远程连接工具:Microsoft Remote Desktop for Mac 中文版

Microsoft Remote Desktop 是一款由微软开发的远程桌面连接软件,它允许用户从远程地点连接到远程计算机或虚拟机,并在远程计算机上使用桌面应用程序和文件。 下载地址:https://www.macz.com/mac/5458.html?idOTI2NjQ5Jl8mMjcuMTg2LjEyNi4yMz…...

【安规介绍】

文章目录 一、基础知识安规上的六类危险的防护:安全电压漏电流接触电流能量问题:火灾问题:热问题结构问题阻燃等级绝缘等级:对接地系统的要求:结构要求:电气要求: 二、设计的关键电气绝缘距离电气爬电距离:…...

[sylar]后端学习:配置环境(一)

1.介绍 基于sylar大神的C高性能后端网络框架来进行环境配置和后续学习。网站链接:sylar的Linux环境配置 2.下载 按照视频进行下载,并进行下载,并最好还要下载一个vssh的软件。可以直接在网上搜索即可。 sylar_环境配置,vssh下…...

XDMA原理及其应用和发展

XDMA原理 XDMA的主要原理是通过直接访问主机内存,实现数据的快速传输。在传统的DMA(Direct Memory Access)技术中,数据传输需要经过CPU的干预,而XDMA可以绕过CPU,直接将数据从外设读取到主机内存或者从主机…...

携程梁建章:持续投资创新与AI,开启旅游行业未来增长

5月30至31日,携程集团在上海和张家界举办Envision 2024全球合作伙伴大会,邀请超50个国家和地区的1600余名外籍旅游业嘉宾与会,共同探讨中国跨境旅游市场发展机遇,讲好中国故事。 携程国际业务增速迅猛,创新与AI解锁未…...

【网络安全的神秘世界】在win11搭建pikachu靶场

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 下载pikachu压缩包 https://github.com/zhuifengshaonianhanlu/pikachu 下载好的pikachu放在phpstudy_pro/www目录下 创建pikachu数据库 打开phpstudy软件…...

基于Java的零食管理系统的设计与实现(论文+源码)_kaic

摘 要 随着科技的进步,以及网络的普及,都为人们的生活提供了极大的方便。因此,在管理”三姆”宿舍在线零食商店时,与现代的网络联系起来是非常必要的,本次设计的系统在研发过程中应用到了Java技术,这在一定…...

【案例实操】银河麒麟桌面操作系统实例分享,V10SP1重启后网卡错乱解决方法

1.问题现象 8 个网口, 命名从 eth1 开始到 eth8。 目前在系统 grub 里面加了 net.ifnames0 biosdevname0 参数, 然后在 udev 规则中加了一条固定网卡和硬件 pci 设备号的规则文件。 最后在 rc.local 中加了两条重新安装网卡驱动的命令( rmmod…...

初级前端开发岗

定位: 日常任务的辅助执行者,前端基础建设的参与者。 素质要求: 是否遵循部门敏捷流程、规范、P0制度;具备良好的沟通和协作能力;负责日常迭代任务的落地执行;拥有较强的执行力,能够灵活解决问题; 职责&#xff1a…...

颠仆流离学二叉树2 (Java篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…...

柏林自由大学研究团队《Ecology Letters 》揭示AMF在植物对全球变化响应的作用

全球环境变化正在影响陆生植物生长。植物已经进化出各种策略来应对这些挑战,其中之一是与丛枝菌根真菌(AMF)形成共生关系(高达80%的陆生植物物种)。AMF为寄主植物提供各种益处,例如营养吸收、耐受性、食草动物防御和抗病能力,以换取糖和脂质(…...

libevent源码跨平台编译(windows/macos/linux)

1.windows编译: 克隆: git clone https://github.com/libevent/libevent.git 克隆成功 生成makefile 生成成功 默认不支持OpenSSL,MbedTLS,ZLIB这三个库 编译: cmake --build . --config release...

idea+tomcat+mysql 从零开始部署Javaweb项目(保姆级别)

文章目录 新建一个项目添加web支持配置tomcat优化tomcat的部署运行tomcatidea数据库连接java连接数据库 新建一个项目 new project;Java;选择jdk的版本;next;next;填写项目名字,选择保存的路径;…...

LeetCode 每日一题 2024/5/27-2024/6/2

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 5/27 2028. 找出缺失的观测数据5/28 2951. 找出峰值5/29 2981. 找出出现至少三次的最长特殊子字符串 I5/30 2982. 找出出现至少三次的最长特殊子字符串 II5/31 2965. 找出缺…...

BOOST_SREATCH

BOOST Boost是一个由C社区开发的开源库,为C语言标准库提供扩展。这个库由C标准委员会库工作组成员发起,旨在提供大量功能和工具,帮助C开发者更高效地编写代码。Boost库强调跨平台性和对标准C的遵循,因此与编写平台无关&#xff0…...

MySQL学习——获取数据库和表格的信息

如果忘记了数据库或表的名称,或者不确定给定表的结构(例如,其列的名称),该怎么办呢?MySQL通过几个语句解决了这个问题,这些语句提供了有关它支持的数据库和表的信息。 你之前已经看过SHOW DATA…...

Go语言redis框架 — go-redis

https://zhuanlan.zhihu.com/p/645669818 一、简述 1. API友好,命令名称和参数与Redis原生命令一致,使用简单方便。 2. 支持完整的Redis命令集,覆盖了字符串、哈希、列表、集合、有序集合、HyperLogLog等数据结构。 3. 支持连接池&#x…...

C++ | Leetcode C++题解之第125题验证回文串

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isPalindrome(string s) {int n s.size();int left 0, right n - 1;while (left < right) {while (left < right && !isalnum(s[left])) {left;}while (left < right && !isalnu…...

Spring创建对象的多种方式

一、对象分类 简单对象&#xff1a;使用new Obj()方式创建的对象 复杂对象&#xff1a;无法使用new Obj()方式创建的对象。例如&#xff1a; 1. AOP创建代理对象。ProxyFactoryBean; 2. Mybatis中的SqlSessionFactoryBean; 3. Hibernate中的SessionFactoryBean。二、创建对象方…...

宝塔部署前后端分离项目手册

文章目录 安装宝塔安装环境开始部署1. 前端Vue项目1.先本地启动前端项目&#xff08;记住端口号&#xff09;2.打包前端项目3.上传前端项目4.创建PHP站点5.安全里开放端口号6.测试前端 2. 后端boot项目1. 先在本地跑起来2.修改数据库的配置信息3. 项目打包4. nohup启动项目4.1 …...

Leetcode 第 397 场周赛题解

Leetcode 第 397 场周赛题解 Leetcode 第 397 场周赛题解题目1&#xff1a;3146. 两个字符串的排列差思路代码复杂度分析 题目2&#xff1a;思路代码复杂度分析 题目3&#xff1a;3148. 矩阵中的最大得分思路代码复杂度分析 题目4&#xff1a;3149. 找出分数最低的排列思路代码…...