掌上单片机实验室 – 低分辨率编码器测速方式完善(24)

一、背景

        本以为“掌上单片机实验室”这一主题已告一段落,可最近在测试一批新做的“轮式驱动单元”时,发现原来的测速算法存在问题。

        起因是:由于轮式驱动单元的连线较长,PCB体积也小,导致脉冲信号有干扰,加之脉冲周期正好和定时器溢出的周期相近,使得很多产品在测试过程中,PID调速不成功。先是怀疑硬件焊接存在问题,可连接示波器监测脉冲信号后发现,输出的脉冲是正确的,推测应该是软件上还有不完善之处。加之我一直对目前的测速算法有点不满意,觉得太过复杂,连自己隔段时间再看程序,都有点晕,所以决心彻底完善一下。

        这个算法断断续续搞了10多年了,一开始因为只是做示例程序,没有太花心思,只是将曾在工作中用过的思路搬了过来,以解决所做的小车编码器分辨率较低的问题,实现用低分辨率码盘实现测速、调速。测试虽不完美,但能实现,也就没有再深究。后来因为各种原因,小车的事情也是断断续续,测速的问题也就被搁置了。

        这次重拾小车,感觉应该彻底解决一下,不留遗憾;调速PID自整定问题解决了,测速就成了小车能否可靠调速的唯一障碍。所以再次审视自己原来的构思,是否设计上就存在不合理之处。

二、问题发现及完善方案

        目前的测速方式是:利用前一脉冲的周期,计算当前测速周期结束时不完整脉冲的当量,从而提高测量精度。

        因为目前小车硬件所提供的码盘,分辨率较低,脉冲频率一般在10 ~ 200Hz之间,如果将测速周期定为100ms,用计数法,每次只有不到20个脉冲,一般在10个一下,量化误差太大。

        所以才想出所谓基于前一脉冲周期倍频的方式。但实施下来发现,为了避免各种意外导致计算出错,尤其是采集脉冲通常使用中断,计算则在中断外完成,为了消除由此可能产生的异常,在程序上逐步增加了不少代码,导致可读性极差,且并未真正消除。

        这次在轮式驱动单元的成品测试中,对照示波器采集的脉冲信号,就发现了由于上述原因导致的粗大误差。

        重新思考原来的测速构思,发现自己有点“自寻烦恼“,折腾了半天,把代码搞得那么复杂,其最后的实质就是用测周期方式代替计数法测速(也就是频率)!所有的问题以及增加的防护代码都源于最后那个不完整的脉冲是否计入本次测速的计算。可实质是:即便实现了,也是基于前一脉冲周期的推测,而非实际情况,没有价值。

        所以,决定只使用周期计算,放弃最后一个不完整脉冲。但为了避免单个脉冲的波动(由于结构上的问题,存在这种可能),导致速度变化不真实,取前N个脉冲的平均周期作为计算依据。如针对我所做的轮式驱动单元以及FIRA小车,轮子转一圈的脉冲分别为100、60,假设用10个脉冲的平均周期计算,实质上只对应了轮子1/10(1/6)圈,也就是说可以一圈中调整10(6)次速度,完全可以满足需求。

        替换为这个算法后,程序大大简化了,逻辑很清楚。

        原来程序设计的脉冲周期采集方式我觉得还不错,保留不变,具体方式是:

        建立一个连续的 us 计时器,每采集一个脉冲,对应记录一个时标,设置一个16个单元的环形缓存,可记录前16个脉冲对应的时标。计算时,用当前脉冲时标减前N个脉冲的时标,即可得到N个脉冲的平均周期。

        之前为了尽量使用 Arduino 原生函数,us定时器直接使用了 micro() 函数;由于采集是在中断程序中完成,似乎存在问题,没有去仔细研究这个函数是如何实现的,暂时放弃,改为使用硬件定时器。

        为了可靠采集脉冲周期,尝试使用了 HAL 函数,可行。使用时发现,STM32duino也在不断完善,以前在2.2.1版本中也用过,这次升级为 2.7.1,发现原来的方式不行了,阅读硬件定时器头文件发现,增加了获取硬件定时器句柄的函数:

        以便方便使用HAL库,从而使用定时器的一些高级功能。

        唯一增加的防护性代码是:

        因为作为时标的计时器设计为32位,高16位是硬件定时器溢出中断程序中软件计时实现的;而记录脉冲时标也是在中断中操作,如果出现读取计时值时正好计时器产生溢出中断,而此时由于正处于脉冲中断服务中无法响应,则会出现计时器高位少计,导致脉冲时标出错,防护方式如下:

        此外,新增加了脉冲干扰处理,因为正常脉冲宽度至少1ms(按目前设计,转速最快也不到1kHz),小于此宽度应该是干扰信号所致。正好使用了硬件定时器,启用通道比较功能,脉冲中断只是启动定时器延时(暂定延时500us),延时触发中断后,采集脉冲引脚,如脉冲信号仍然有效,则确定为有效脉冲,执行相应处理:

        这样修改后的测速计算如下:

        和原来的测速计算比较(可以看前面上传的程序),新的只有20行代码,原来的有约70行代码。关键是,修改后的测速效果更好、更可靠了;原来在绘制速度曲线时,总会出现一些异常值,这次完善后从未出现。实际效果如下:

1、自整定波形:

2、调速波形:

        十分满意,圆梦小车应该说画上了一个完美的句号,因为作为小车底盘部分,测速、调试是核心功能。

三、结语

        圆梦小车从2005年开始做,测速、调速一直是困扰着小车,因为宗旨是作为学习素材,初衷就是要基于低端的电机、简易的编码器实现小车的测速和调速。通过开模,在轮毂上实现了60、100线的简单编码器,控制小车行走距离尚可,精度大约在2~3mm左右,作为测速就十分勉强了,只有通过算法弥补。这些年一直没有沉下心来去完善,这次总算是了了一桩心事。

        最近GPT比较热,能够自动生成代码,我在上述优化算法过程中,也尝试了 AI,它给出的代码猛一看,煞有介事,仔细一琢磨,似是而非。尤其是单片机应用这种和硬件直接相关,且很多时候是为了弥补硬件局限性、不一致性所构思的代码,似乎 AI 目前还无法应对。或者说这类代码网上分享的太少,类似于前面写的内容在网上占比很低,没有提供给AI足够的学习素材。看来在ChatGPT引来的职业哀鸣中,似乎嵌入式硬件工程师还能多存在一会儿。

————————————

完善后的单片机程序:

链接:https://pan.baidu.com/s/1L_iUJLdNrUkOCDE3acZGXw

提取码:132v

配套完善后的PC端程序:

链接:https://pan.baidu.com/s/1NBOYZzWUpszxQmsnMMfbww

提取码:ospn

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

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

相关文章

使用 Postman 发送 get 请求的简易教程

在API开发与测试的场景中,Postman 是一种普遍应用的工具,它极大地简化了发送和接收HTTP请求的流程。要发出GET请求,用户只需设定正确的参数并点击发送即可。 如何使用 Postman 发送一个GET请求 创建一个新请求并将类型设为 GET 首先&#…

CAN\CANFD数据记录仪汽车电子售后神器

随着汽车工业的快速发展,CAN总线已成为汽车电子控制网络的标准。因此,对CAN总线数据的记录和分析变得尤为重要。 CAN数据记录仪在汽车电子售后领域的应用主要包括以下几个方面: 故障诊断和排查:通过实时记录总线上的数据&#xf…

TCP的三次握手,四次挥手

三次握手 第一次握手:客户端发送SYN报文,井发送seq为x序列号给服务端,等待服务端的确认第二次握手:服务端发送SYNACK报文,并发送seq为Y的序列号,在确认序列号为x1第三次握手:客户端发送ACK报文&…

画图案例分享

案例 1 from scipy.misc import derivative from scipy.integrate import quad import matplotlib.pyplot as plt import numpy as np import pandas as pd from scipy.stats import norm import warningsplt.style.use(ggplot) np.random.seed(37) warnings.filterwarnings(i…

VMware workstation安装SUSE Linux Enterprise Server 12 SP5虚拟机并配置网络

VMware workstation安装SUSE Linux Enterprise Server 12 SP5虚拟机并配置网络 SUSE Linux Enterprise Server是企业级Linux系统,适合企业应用。该文档适用于在VMware workstation平台安装SUSE Linux Enterprise Server虚拟机。 1.安装准备 1.1安装平台 Windows…

如何用GPT进行论文润色与改写?

详情点击链接:如何用GPT/GPT4进行论文润色与改写?一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二…

前端(html+css+javascript)作业--展现家乡的网页

期末期间,老师布置了前端作业,现在放到这里,给各位同志参考。 桂平市是广西壮族自治区的一个美丽的城市,拥有丰富的历史文化和自然景观,属于贵港市管辖,那为什么是看起来是市级而不是县级,其实他…

史上最全在IDEA中部署并使用Tomcat,图文并茂一看包会!

前言 之前自己迷茫过怎样在idea中使用Tomcat,因此查了很多资料,在这做个总结。 一、建立过程 1.新建一个JAVA文件 2.添加框架 在项目的创建区内,右击项目名,在弹窗中选择“添加框架支持”;选择“Web应用程序4.0”&…

Eclipse闪退 打开eclipse闪退 打开eclipse图标一闪而过 eclipse闪退 eclipse打不开

Eclipse闪退 打开eclipse闪退 打开eclipse图标一闪而过 eclipse闪退 eclipse打不开 问题描述切换为命令行启动 查看异常日志 问题描述 双击图标,窗口一闪而过,马上关闭了 切换为命令行启动 查看异常日志 进入Eclipse安装目录,运行终端启动…

指向未来: 量子纠缠的本质是一个指针

指向未来: 量子纠缠的本质是一个指针 概述基本概念理解量子纠缠PythonJavaC 理解波粒二象性PythonJavaC 理解量子隧穿理解宇宙常量PythonJavaC 概述 量子纠缠 (Quantum Entanglement) 是量子系统重两个或多个粒子间的一种特殊连接, 这种连接使得即使相隔很远, 这些粒子的状态也…

1. SpringBoot3 基础

文章目录 1. SpringBoot 概述2. SpringBoot 入门3. SpringBoot 配置文件3.1 SpringBoot 配置文件基本使用3.2 yml 配置文件 4. SpringBoot 整合 Mybatis5. Bean 管理5.1 Bean 扫描5.2 Bean 注册5.3 注册条件 6. 组合注解7. 自动配置原理8. 自定义 Starter 1. SpringBoot 概述 …

力扣hot100 完全平方数 完全背包 滚动数组 四平方和定理

Problem: 279. 完全平方数 文章目录 思路💖 完全背包💖 滚动数组优化💖 四平方和定理 思路 👨‍🏫 三叶神解 👨‍🏫 数学解法 💖 完全背包 ⏰ 时间复杂度: O ( n 2 n ) O(n^2 …

072:vue+mapbox 点击某图层feature,高亮这部分

第072个 点击查看专栏目录 本示例是介绍如何在vue+mapbox中点击某图层feature,高亮这部分。思路是通过点击,获取点击部分的feature信息,生成一个新的source和layer,如果这个图层不为空,则清除之,相当于点击了别的地方,原有的高亮会删除掉,在别的地方高亮。 直接复制下…

探寻编码时代的潮流旋律

🚩本文介绍 随着技术的不断演进,编程语言作为软件开发的基石也在不断发展。作为一名扎根运维领域的工程师,我深感了解和把握编程语言的新趋势对于个人职业发展至关重要。在这篇博客中,我们将深入探讨当前编程语言领域的最新动态&…

VMware虚拟机自定义网段及物理机ping不通虚拟机问题解决

Vmware网络介绍🛜 VMware虚拟机提供了几种网络模式,其中包括桥接模式(Bridged Mode)、NAT模式(Network Address Translation Mode)和仅主机模式(Host-Only Mode)。这些模式允许虚拟…

Android应用开发:基础小游戏开发

手机游戏成为人们日常娱乐的重要组成部分。如果您想踏入这个充满创意和技术挑战的领域,制作一个Android基础小游戏是个不错的开始。以下是从零开始制作Android小游戏的基础指南。 1选择开发环境和工具 Android Studio 是官方推荐的开发环境,它提供了强大…

《2023大数据产业年度创新技术突破》榜重磅发布丨第六届金猿奖

‍ 第六届年度金猿榜单/奖项 “第六届年度金猿季策划活动——2023大数据产业创新技术突破榜单/奖项”由金猿X数据猿X上海大数据联盟共同推出。 大数据产业创新服务媒体 ——聚焦数据 改变商业 第六届 “年度金猿季大型主题策划活动”由金猿、数据猿、上海大数据联盟共同组成的…

【playwright】新一代自动化测试神器playwright+python系列课程18_playwritht元素相关操作_等待元素到某种状态

元素相关操作_等待元素到某种状态 对于自动化测试来说,本质上就是定位元素、操作元素。网页上的元素有不同状态,有些元素本来不在网页的DOM中,经过某一步操作后才出现。有些元素是本来就已经在DOM中但是是隐藏的状态,经过某一步操…

JVM知识总结

1.概述 JVM指的是Java虚拟机,本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件,作用是为了支持跨平台特性。 功能: 装载字节码,解释/编译为机器码 管理数据存储和垃圾回收 优化热点代码提升效率 …

uniapp中uview组件库的NoticeBar 滚动通知 使用方法

目录 #平台差异说明 #基本使用 #配置主题 #配置图标 #配置滚动速度 #控制滚动的开始和暂停 #事件回调 #API #Props #Events 该组件用于滚动通告场景,有多种模式可供选择 #平台差异说明 AppH5微信小程序支付宝小程序百度小程序头条小程序QQ小程序√√√√…