今天欣賞來自北方工業大學的大一學生【pvfcd】所做的模擬電壓表。項目已開源在電子森林,可點擊“閱讀原文”獲取鏈接,轉載請注明出處。
1
項目介紹

?2
設計思路

3
板卡介紹

?




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
????def?drawcircle(self,?x,y,r,color=WHITE):'''畫半圓傳入參數:x,y:圓心坐標r:半徑color:顏色'''a = 0b = rwhile (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 - 1a = 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 = 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)
'''測試用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,dmm2dmm1 = CH1.read_u16()dmm2 = CH2.read_u16()
def adcshow():global dmm1voltshow,dmm2voltshowadcread()# 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,lastvaluetvalue = value*100if (value > 0):# print(value)if (adc == 0):xposi = (tvalue//(int((ADC0_full_range/140)*100)))+50else:xposi = (tvalue//(int((ADC2_full_range/140)*100)))+50if 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 = xposilastyposi = yposi
>>> 32768//327.6899.0>>> 3276800//32768100
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
硬禾學堂
硬禾團隊一直致力于給電子工程師和相關專業的同學,帶來規范的核心技能課程,幫助大家在學習和工作的各個階段,都能有效地提升自己的職業能力。

硬禾學堂
我們一起在電子領域探索前進
關注硬禾公眾號,隨時直達課堂

點擊閱讀原文查看更多