今天欣赏来自北方工业大学的大一学生【pvfcd】所做的模拟电压表。项目已开源在电子森林,可点击“阅读原文”获取链接,转载请注明出处。
1
项目介绍
2
设计思路
3
板卡介绍
4
程序分析
import machine
from machine import ADC, Pin,Timer
import utime
import st7789 as st7789
from fonts import vga2_8x8 as font1
from fonts import vga1_16x32 as font2
import math
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
"""pin设置部分"""
pinout = Pin(22, Pin.OUT)
calib = Pin(6, Pin.IN, Pin.PULL_UP)#即为板子上的按键A
'''ADC选择部分'''
# 排针
CH1 = ADC(Pin(26))
CH2 = ADC(Pin(27))
adc = 0
# 摇杆
# CH1 = ADC(Pin(28))
# CH2 = ADC(Pin(29))
# adc = 1
'''st7789设置部分'''
st7789_res = 0
st7789_dc = 1
disp_width = 240
disp_height = 240
spi_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)
'''测试用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()
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)
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
>>> 32768//327.68
99.0
>>> 3276800//32768
100
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
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
硬禾学堂
硬禾团队一直致力于给电子工程师和相关专业的同学,带来规范的核心技能课程,帮助大家在学习和工作的各个阶段,都能有效地提升自己的职业能力。
硬禾学堂
我们一起在电子领域探索前进
关注硬禾公众号,随时直达课堂
点击阅读原文查看更多