如何设计一款模拟电压表?2022年寒假在家练RP2040游戏机项目分享(七)

电子森林 2022-03-15 21:56

模拟电压表也能用RP2040 Game Kit制作?这个寒假同学们玩的很开心,我们也收货了很多有趣的项目。 


今天欣赏来自北方工业大学的大一学生【pvfcd】所做的模拟电压表。项目已开源在电子森林,可点击“阅读原文”获取链接,转载请注明出处。



1

项目介绍

感谢大家观看我制作的项目。目前我是一名大一的学生,平时对电子电路较为感兴趣,但是学校暂时还没有学习此类知识,所以对于对应的知识难免有些地方了解不够全面,系统。有什么讲解错误的,还望老师们指正。
这是我使用树莓派rp2040完成的电压表,显示的是测量2v电压。经过校准,精度还不错,只是最后两位会有几个字的跳动。12位ADC能达到这种精度,我还是很满意的。

 2

设计思路

机后先检测按键是否按下,按下后进校准程序,未按下进主程序。校准程序完成后也会进入主程序。

测量程序会一直读取ADC值,分散到0-3.3区间内,然后传到屏幕上。指针是将ADC值分散到140个区间内,正好是设定表针长度的两倍。然后利用勾股定理算出坐标,传到屏幕上。

流程图:

3

板卡介绍

电路由xt3406电压转换管为rp2040片内ADC提供电源,ADC部分需要高稳定性的电源供应,xt3406芯片指标很不错,纹波很低,虽然不能和专用的高精度电压芯片相比,但是对于这种精度还是很够用的。

 

ADC输入排针部分,电路板上没有标注丝印,听工作人员说是为了电路板设计美观。第一次测试的时候,因为没发现交互式物料清单这种好东西,我就直接把板子翻了面对照电路图看,结果插错线,不知道连到了什么地方,导致电脑弹出“USB端口上的电泳”,还好没有造成什么损失。不过后期分析电路,发现5v电源线明显粗,于是找对了正确的方向,应该是翻到背面,USB口朝下,才和电路图相匹配


模拟摇杆,原理就是两个滑动变阻器组成的分压电路,这为我测试提供了方便。

显示屏,采用st7789主控,spi总线,片选信号接地,无需特殊操作。还有一根复位线连接在单片机上。


quadspi线驱动的flash,由于器件替换的问题,用的Flash实际上是2MB的。使用过程中并未感觉到空间不足的情况。

到这里,我使用的电路部分分析完毕,我还录制了一个更详细的视频,有兴趣的可以看下。

4

程序分析

import machinefrom machine import ADC, Pin,Timerimport utimeimport st7789 as st7789from fonts import vga2_8x8 as font1from fonts import vga1_16x32 as font2import math


插入的库文件,可见使用了ADC,io,定时器这三种硬件,还使用了utime库来控制延时,math库来反解指针位置,st7789库即为板子中提供的示例库(这个库使用起来很慢,但是GitHub上的原作者也说这个库很慢)这个库中,我增加了一个划半圆的函数,即为:
    def drawcircle(self, x,y,r,color=WHITE):        '''画半圆        传入参数:        x,y:圆心坐标        r:半径        color:颜色        '''        a = 0        b = r        while (2 * b * b) >= (r * r):            self.pixel(x + a, y - b,color)            self.pixel(x - a, y - b,color) #           self.pixel(x - a, y + b,color) #           self.pixel(x + a, y + b,color)     #           self.pixel(x + b, y + a,color)             self.pixel(x + b, y - a,color)             self.pixel(x - b, y - a,color) #           self.pixel(x - b, y + a,color)                     a = a + 1;            num = ((a * a) + (b * b) )- (r*r);#计算画的点离圆心的距离            if num > 0:                b = b - 1                a = a - 1
这是我从stm32单片机上移植过来的代码,原作者应该是淘宝上的中景园电子。注释掉的两段是画整个圆的代码,释放后即可画出一个圆。

头文件中的font1和font2是两套字库,分别是8*8和16*32大小的字体。
"""pin设置部分"""pinout = Pin(22, Pin.OUT)calib = Pin(6, Pin.IN, Pin.PULL_UP)#即为板子上的按键A

io设置部分,使用了一个输入端口,即为板子上的按键a,来作为校准按键,按住此按键开机即可进入校准。还有一个输出端口,是用于输出pwm波的。
'''ADC选择部分'''# 排针CH1 = ADC(Pin(26))     CH2 = ADC(Pin(27))adc  = 0  
# 摇杆 # CH1 = ADC(Pin(28)) # CH2 = ADC(Pin(29))# adc = 1

ADC选择部分,通过此段程序的屏蔽和释放,可以切换输入源,以满足可以切换到12Pin扩展排针上的两个模拟通道输入端的要求。
'''st7789设置部分'''st7789_res = 0st7789_dc  = 1disp_width = 240disp_height = 240spi_sck=machine.Pin(2)spi_tx=machine.Pin(3)spi0=machine.SPI(0,baudrate=40000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)display = st7789.ST7789(spi0, disp_width, disp_height,reset=machine.Pin(st7789_res, machine.Pin.OUT),dc=machine.Pin(st7789_dc, machine.Pin.OUT),xstart=0, ystart=0, rotation=0)

st7789设置部分,设置spi线对应的引脚
'''测试用io口中断驱动程序'''timer = Timer()def timer_callback(timer):  pinout.toggle()timer.init(period=2000, mode=Timer.PERIODIC , callback=timer_callback)#创建一个定时器,用于反转电平

io口驱动程序,就是一直翻转一个io口的电平,以输出低频率的数字波形。rp2040没有dac,所以没法输出更多样的电压。
def adcread():  global dmm1,dmm2  dmm1 = CH1.read_u16()      dmm2 = CH2.read_u16()

ADC读取部分,就是调用两个read函数。dmm是digital multimeter的简写,意为数字多用表,未来可能会增加一些外围电路将其改造为数字多用表
def adcshow():  global dmm1voltshow,dmm2voltshow  adcread()  # print("dmm")  # print(dmm1)  # print(dmm2)  if (adc == 0):    dmm1volt = dmm1*(3.3/ADC0_full_range)    dmm1voltshow = round(dmm1volt,3)    dmm2volt = dmm2*(3.3/ADC1_full_range)    dmm2voltshow = round(dmm2volt,3)  else:    dmm1volt = dmm1*(3.3/ADC2_full_range)    dmm1voltshow = round(dmm1volt,3)    dmm2volt = dmm2*(3.3/ADC3_full_range)    dmm2voltshow = round(dmm2volt,3)  print("volt")  print(dmm1volt)  print(dmm2volt)  display.text(font2,"CH1:",0,10,st7789.WHITE)  display.text(font2,"CH2:",0,40,st7789.WHITE)  display.text(font2,str(dmm1voltshow),63,10,st7789.WHITE)   display.text(font2,str(dmm2voltshow),63,40,st7789.WHITE)  # print("show")  # print(dmm1voltshow)  # print(dmm2voltshow)  display.text(font2,"Volts",149,10)  display.text(font2,"Volts",149,40)

ADC读数展示部分,可以用来展示ADC的读数,程序大概就是把0-65536之间的数值分散到0-3.3之间,然后保留三位小数,再转换成字符串形式,送至屏幕输出。
def draw_point(value):  '''   value:ADC读取的电压值,例如32768之类的数字  46811:adc满量程为3.3v分散到140的区域上,正好是表针的长度  然后利用勾股定理,计算出y的位置  '''  global lastxposi,lastyposi,lastvalue  tvalue = value*100  if (value > 0):    # print(value)    if (adc == 0):      xposi = (tvalue//(int((ADC0_full_range/140)*100)))+50    else:      xposi = (tvalue//(int((ADC2_full_range/140)*100)))+50    if xposi != 0:      yposi = 200-int((math.sqrt(4900-((120-xposi)**2))))    else:      yposi = 200    # print(xposi,yposi)    display.line(120,200,xposi,yposi,st7789.RED)    if xposi != lastxposi:      display.line(120,200,lastxposi,lastyposi,st7789.BLACK)    lastxposi = xposi    lastyposi = yposi

表针显示部分,思路就是把ADC读出的数值分散在140个区间内,这个作为直角三角形的底边,斜边长度即为表针长度,这里我设为70像素,使用斜边长度的平方减去指针长度的平方就是高,再加上对应的偏移量就是表针尽头的坐标,把这一组坐标送入屏幕显示函数,就可以帮我画出指针。(没找到公式编辑器,不过这里应该不是很难)
有几个细节,就是为什么传入数据要乘100,因为可以试着使用python计算下
>>> 32768//327.6899.0>>> 3276800//32768100

虽然两组算式结果应该一模一样,但是因为浮点数运算的精度问题,导致了结果偏差较大。于是手动乘100修复它。

if判断是防止除数等于零的报错。本来有对于除数等于零的处理,但是经过测试,除数接近于零的时候,勾股定理反解出的指针位置和除数等于零的指针位置完全相同,所以删去除数等于零的处理。

还有一个保存上一位置的函数,这是用于清屏。因为前文提到过,这个驱动库很慢,所以当ADC数据改变时,我直接在原位置上画一条黑线,以达到变相加速的作用。
      display.text(font2,"CALIB ADC2",10,10,st7789.WHITE)      while(ADC2.read_u16() <55000):        if(ADC2.read_u16() > 55000):          display.text(font2,"WAIT......",10,10,st7789.WHITE)          utime.sleep_ms(5000)          ADC2_full_range = ADC2.read_u16()          print("ADC2",ADC2_full_range)          break

校准程序,有四段这样的程序,但除了ADC通道不同以外都一样,所以挑一段解释,就是把最大值记录至单片机内。因为测试中发现,ADC最大值经常不同,甚至有一组ADC输入3.3v,ADC只读出了60000多的数据,这是ADC精准度的一大影响。所以使用这个程序修正它。开机时会判断一下a键的电平,是低电平就会进入校准程序。
while(True):#主循环    adcshow()    draw_point(dmm1)
主循环,就是调用两个展示函数。

5

心得体会

记得第一次参加硬核学堂的活动,是我高二升高三的时候。当时是nxp的一款芯片,好像叫lpc824。当时我高估了我的水平,以为可以很快的做完,但是最终只做了ADC,就被轰去复习了。今年我大学,又看到硬核学堂的活动,当场决定参加。拿到板子后,微信群里的氛围非常好,所有人都在咨询项目相关的内容,也有些人在交流着我听不懂的话题,让我看到了我和大佬的差距。


接下来说下我做的这个项目。首先,为什么选ADC,因为我之前大一上参加了电赛,做的是那个用电器检测的题,对ADC有了一些相关的开发经验。但是后来发现,microPython的开发真的很简单,可以简单的使用。而且microPython调试程序也很方便,不用编译直接跑程序节省了大量的时间。


项目过程中,其实我是拿到板子后现学习的python,python有很多方便的函数库,我之前不知道,本来自己写了类似的,不完美的功能,然后上网一查,有个内置标准函数库就是干这个事情的。还有数学问题(毕竟数学一直很差),那个画圆的函数想了我好久,不过最后的结果还是很满意的。还有调库的问题,一开始我感觉自带的st7789的库太慢,而且没有gui库。而且可用的函数比较少,所以尝试使用GitHub上的microgui开发。总卡在spi总线的部分,虽然有逻辑分析仪,但是也很难定位问题所在,屏幕就是不显示。后来自己完成了一些gui的设计,虽然不是很完美,但最后呈现的效果还是不错的。


最后,感谢硬禾学堂带给我们这么好的活动,有了一个玩转就退钱的正向激励,督促着我在不想干的时候爬起来继续研究这个东西。这次也翻看了电子森林上的许多项目,感觉这个网站真的很神仙,中文的资料,还有完整的解释,让我受益匪浅。


 6

代码分享

  • 把这个仓库中所有文件克隆下来,上载到游戏机中,然后运行adcproject.py:https://github.com/pvfcd/rp2040_adc_mpy

  • 也可以直接把下面网盘里的程序全部上载到板子中
    链接:
    https://pan.baidu.com/s/1tNoPVDpSRnQeoIsb-Uqejg?pwd=fhh2
    提取码:fhh2


END


硬禾学堂

硬禾团队一直致力于给电子工程师和相关专业的同学,带来规范的核心技能课程,帮助大家在学习和工作的各个阶段,都能有效地提升自己的职业能力。

硬禾学堂

我们一起在电子领域探索前进

关注硬禾公众号,随时直达课堂


点击阅读原文查看更多



电子森林 讲述电子工程师需要掌握的重要技能: PCB设计、FPGA应用、模拟信号链路、电源管理等等;不断刷新的行业新技术 - 树莓派、ESP32、Arduino等开源系统;随时代演进的热点应用 - 物联网、无人驾驶、人工智能....
评论
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 530浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 463浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 471浏览
  • 食物浪费已成为全球亟待解决的严峻挑战,并对环境和经济造成了重大影响。最新统计数据显示,全球高达三分之一的粮食在生产过程中损失或被无谓浪费,这不仅导致了资源消耗,还加剧了温室气体排放,并带来了巨大经济损失。全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,艾迈斯欧司朗基于AS7341多光谱传感器开发的创新应用来解决食物浪费这一全球性难题。其多光谱传感解决方案为农业与食品行业带来深远变革,该技术通过精确判定最佳收获时机,提升质量控制水平,并在整个供应链中有效减少浪费。 在2024
    艾迈斯欧司朗 2025-01-14 18:45 68浏览
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 449浏览
  • 数字隔离芯片是现代电气工程师在进行电路设计时所必须考虑的一种电子元件,主要用于保护低压控制电路中敏感电子设备的稳定运行与操作人员的人身安全。其不仅能隔离两个或多个高低压回路之间的电气联系,还能防止漏电流、共模噪声与浪涌等干扰信号的传播,有效增强电路间信号传输的抗干扰能力,同时提升电子系统的电磁兼容性与通信稳定性。容耦隔离芯片的典型应用原理图值得一提的是,在电子电路中引入隔离措施会带来传输延迟、功耗增加、成本增加与尺寸增加等问题,而数字隔离芯片的目标就是尽可能消除这些不利影响,同时满足安全法规的要
    华普微HOPERF 2025-01-15 09:48 83浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 113浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 498浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 493浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 510浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 201浏览
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 328浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦