建设银行信用卡网站下载,wordpress 新浪微博登入,今天杭州新闻最新消息,wordpress 游客访问一、背景 本以为“掌上单片机实验室”这一主题已告一段落#xff0c;可最近在测试一批新做的“轮式驱动单元”时#xff0c;发现原来的测速算法存在问题。 起因是#xff1a;由于轮式驱动单元的连线较长#xff0c;PCB体积也小#xff0c;导致脉冲信号有干扰#xff0c;加…一、背景 本以为“掌上单片机实验室”这一主题已告一段落可最近在测试一批新做的“轮式驱动单元”时发现原来的测速算法存在问题。 起因是由于轮式驱动单元的连线较长PCB体积也小导致脉冲信号有干扰加之脉冲周期正好和定时器溢出的周期相近使得很多产品在测试过程中PID调速不成功。先是怀疑硬件焊接存在问题可连接示波器监测脉冲信号后发现输出的脉冲是正确的推测应该是软件上还有不完善之处。加之我一直对目前的测速算法有点不满意觉得太过复杂连自己隔段时间再看程序都有点晕所以决心彻底完善一下。 这个算法断断续续搞了10多年了一开始因为只是做示例程序没有太花心思只是将曾在工作中用过的思路搬了过来以解决所做的小车编码器分辨率较低的问题实现用低分辨率码盘实现测速、调速。测试虽不完美但能实现也就没有再深究。后来因为各种原因小车的事情也是断断续续测速的问题也就被搁置了。 这次重拾小车感觉应该彻底解决一下不留遗憾调速PID自整定问题解决了测速就成了小车能否可靠调速的唯一障碍。所以再次审视自己原来的构思是否设计上就存在不合理之处。
二、问题发现及完善方案 目前的测速方式是利用前一脉冲的周期计算当前测速周期结束时不完整脉冲的当量从而提高测量精度。 因为目前小车硬件所提供的码盘分辨率较低脉冲频率一般在10 ~ 200Hz之间如果将测速周期定为100ms用计数法每次只有不到20个脉冲一般在10个一下量化误差太大。 所以才想出所谓基于前一脉冲周期倍频的方式。但实施下来发现为了避免各种意外导致计算出错尤其是采集脉冲通常使用中断计算则在中断外完成为了消除由此可能产生的异常在程序上逐步增加了不少代码导致可读性极差且并未真正消除。 这次在轮式驱动单元的成品测试中对照示波器采集的脉冲信号就发现了由于上述原因导致的粗大误差。 重新思考原来的测速构思发现自己有点“自寻烦恼“折腾了半天把代码搞得那么复杂其最后的实质就是用测周期方式代替计数法测速也就是频率所有的问题以及增加的防护代码都源于最后那个不完整的脉冲是否计入本次测速的计算。可实质是即便实现了也是基于前一脉冲周期的推测而非实际情况没有价值。 所以决定只使用周期计算放弃最后一个不完整脉冲。但为了避免单个脉冲的波动由于结构上的问题存在这种可能导致速度变化不真实取前N个脉冲的平均周期作为计算依据。如针对我所做的轮式驱动单元以及FIRA小车轮子转一圈的脉冲分别为100、60假设用10个脉冲的平均周期计算实质上只对应了轮子1/101/6圈也就是说可以一圈中调整106次速度完全可以满足需求。 替换为这个算法后程序大大简化了逻辑很清楚。 原来程序设计的脉冲周期采集方式我觉得还不错保留不变具体方式是 建立一个连续的 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