這是南信大馬尚清同學(xué)的作品
因?yàn)楸救艘矝]學(xué)幾天,學(xué)識(shí)淺薄,有錯(cuò)誤問題難以避免。
已經(jīng)實(shí)現(xiàn)的功能
Ain通道示波功能(量程為0-3.3V)
示波器相關(guān)數(shù)據(jù)顯示功能(通過二級(jí)菜單顯示)
波形自動(dòng)量程功能
仍需完善的功能
波形頻率測(cè)量(軟件測(cè)量波形周期代碼編寫過于簡單,測(cè)試對(duì)于規(guī)則的上下對(duì)稱的波形還可以測(cè)量,而對(duì)于其他的則測(cè)量偏差太大,仍需完善)
未能實(shí)現(xiàn)的功能
采樣速度的調(diào)節(jié)功能(對(duì)于采樣率,時(shí)鐘之間聯(lián)系的理解不夠,如果簡單的改變采樣間距會(huì)導(dǎo)致波形變形,造成偏差)
快速傅里葉變換(不太能理解快速傅里葉變換是如何實(shí)現(xiàn)的,直接帶入網(wǎng)上代碼也會(huì)導(dǎo)致占用空間過大)
上位機(jī)通訊功能(對(duì)于DMA理解不夠,不知道應(yīng)該如何將DMA中讀取到ADC的數(shù)據(jù)上傳到上位機(jī)中)
采集板上的音頻信號(hào)(采集信號(hào)波形與實(shí)際情況不合,故在設(shè)置中將MIC對(duì)應(yīng)的PA1管腳關(guān)閉,后續(xù)可以繼續(xù)優(yōu)化)
實(shí)現(xiàn)過程
這個(gè)項(xiàng)目是我第一次接觸stm32系列的項(xiàng)目,也是第一次用HAL庫來開發(fā)項(xiàng)目(雖然建議使用LL庫來減少空間的占用,但是對(duì)于LL庫,本人有點(diǎn)更難理解,所以就沒有采用)。所以在實(shí)現(xiàn)的過程中,遇到了很多的困難,加上HAL庫的教程也比較少,并且G031系列單片機(jī)也是比較新的產(chǎn)品線,所以沒有多少能夠借鑒的例子,所以一些看似很簡單的功能,在實(shí)現(xiàn)他們時(shí)反倒難住了我,包括OLED屏幕點(diǎn)亮,ADC采樣,波形顯示等等問題。
示波器實(shí)現(xiàn)過程的原理其實(shí)并不困難:由ADC采樣到數(shù)據(jù),將數(shù)據(jù)乘以330 除以4096,從而得到實(shí)時(shí)電壓值,在把數(shù)據(jù)進(jìn)行量化之后,儲(chǔ)存進(jìn)數(shù)組(數(shù)組內(nèi)成員個(gè)數(shù)需要大于波形顯示區(qū)域的橫向像素點(diǎn)),通過數(shù)組的比較函數(shù),得到數(shù)組內(nèi)的最大電壓以及最小電壓(由于數(shù)組的最大值與最小值受到之前測(cè)量數(shù)值的影響,于是我采用每隔一段時(shí)間就復(fù)位一次來達(dá)到最大值和最小值能夠隨著測(cè)量進(jìn)行不斷更新而不會(huì)卡死在某一數(shù)值)。
之后進(jìn)行需要將電壓值轉(zhuǎn)換成應(yīng)在應(yīng)該顯示在屏幕上的坐標(biāo)(其中我將128*64的OLED顯示屏的取107*47作為波形顯示部分,因此右側(cè)和下側(cè)顯示區(qū)域只留有不到16像素點(diǎn),而正常的OLED顯示程序里面字體是遠(yuǎn)大于此,所以我們需要使用0806字體,否則會(huì)造成字體顯示錯(cuò)位),如果是固定量程則是由測(cè)量值與量程之間的比值得到示波器縱向坐標(biāo)的比值,從而達(dá)到計(jì)算出點(diǎn)坐標(biāo)。如果是動(dòng)態(tài)范圍則是測(cè)量值與數(shù)組范圍內(nèi)最大值與最小值的差之間的比值得到,此外還需要根據(jù)最大值和最小值更新網(wǎng)格線旁邊的數(shù)值,這里就使用sprintf函數(shù)來達(dá)到不斷更新字符串的目的,在通過OLED的字符串顯示函數(shù)顯示到OLED屏幕的指定位置上。之后波形的繪制則是通過ADC不斷的采樣,寫入數(shù)組,讀取數(shù)組,進(jìn)行畫點(diǎn),更新數(shù)組,從而達(dá)到連續(xù)不斷的顯示輸入波形的效果。
而按鍵功能的實(shí)現(xiàn)可以通過按鍵中斷回調(diào)函數(shù)(本人使用過程中會(huì)出現(xiàn)中斷不了的現(xiàn)象,可能是中斷優(yōu)先級(jí)配置的問題)或者自行編寫按鍵判斷函數(shù),放入while函數(shù)中不斷循環(huán)運(yùn)行從而達(dá)到不斷掃描按鍵的效果。按鍵觸發(fā)的邏輯也需要自己仔細(xì)的考慮,否則會(huì)造成連擊,無法觸發(fā),循環(huán)觸發(fā)等出乎意料的現(xiàn)象。此外而按鍵功能的設(shè)計(jì)一定要有嚴(yán)密的執(zhí)行邏輯,否則容易造成按鍵沖突,或者程序卡死。此外需要設(shè)立按鍵標(biāo)志位,來判斷按鍵觸發(fā)的次數(shù),從而達(dá)到按鍵多用的功能。
項(xiàng)目的一些細(xì)節(jié)部分:
波形的顯示函數(shù)中加入插值函數(shù),這樣才能使得示波器有能夠輕易看出的連續(xù)波形,而不是一個(gè)個(gè)離散的點(diǎn)。
按鍵的讀取需要進(jìn)行延時(shí)消顫處理,并加上觸發(fā)判斷,不然按鍵會(huì)多次激發(fā),或者不激發(fā),影響操作。
按鍵多次觸發(fā)功能是通過按鍵中斷中簡單的計(jì)數(shù)函數(shù)來判斷按鍵被按下幾次,判斷按鍵是否進(jìn)行長按與短按則是通過延時(shí)判斷來的。
波形顯示時(shí),需要將超出量程的值限制為最大值,否則會(huì)導(dǎo)致顯示在其他區(qū)域。
自動(dòng)量程,通過測(cè)量值與最小值的差與數(shù)組內(nèi)最大值與最小值差的比來算得測(cè)量值應(yīng)該在OLED屏幕上的坐標(biāo),并且將示波器旁的數(shù)值改變?yōu)樽畲笾蹬c最小值,從而達(dá)到動(dòng)態(tài)量程的效果。
示波器的背景網(wǎng)格線最好不要使用圖片顯示,而使用間隔畫點(diǎn)功能,從而達(dá)到繪制背景網(wǎng)格線的效果。否則容易造成OLED顯示錯(cuò)亂和頻閃等情況。
在進(jìn)行單片機(jī)數(shù)值計(jì)算時(shí)候,一定要注意運(yùn)算完成后,數(shù)據(jù)類型已經(jīng)精度問題,否則容易造成數(shù)據(jù)不準(zhǔn)確,甚至錯(cuò)誤數(shù)據(jù)的出現(xiàn)。
實(shí)現(xiàn)功能注意事項(xiàng):
注意OLED屏幕顯示函數(shù)的位置坐標(biāo),有的代碼是以默認(rèn)的OLED最下方一排為0,有的進(jìn)行了反相。
OLED Clear()函數(shù)不能夠完全清屏,會(huì)有殘留。
使用OLED直接操縱點(diǎn)顯示的函數(shù)時(shí),一定要注意運(yùn)行頻率,否則會(huì)造成閃屏。
實(shí)現(xiàn)項(xiàng)目的感觸
通過這次寒假在家練項(xiàng)目,收獲頗豐。通過自己親自參與到項(xiàng)目的實(shí)現(xiàn)過程來,才能夠發(fā)現(xiàn)問題,分析問題,尋找解決思路,從而解決問題。作為剛剛接觸到STM32的萌新,這項(xiàng)項(xiàng)目讓我能夠快速學(xué)習(xí)。之前學(xué)習(xí)他人教程,覺得思路很清晰,實(shí)現(xiàn)起來很簡單。但是當(dāng)自己真正的接觸到一項(xiàng)陌生的項(xiàng)目,沒有現(xiàn)成的答案和結(jié)果等著自己的時(shí)候,才發(fā)現(xiàn)自己原來很多都不知道。正是由于項(xiàng)目中一個(gè)個(gè)出乎意料的問題的出現(xiàn),才能逼迫著自己去查找資料,學(xué)習(xí)大神們寫的代碼,并嘗試自己去解決。
未來完善功能
能夠兼容所有波形的頻率測(cè)算功能
學(xué)習(xí)快速傅里葉算法,簡化FFT函數(shù),使其能夠在單片機(jī)剩余空間內(nèi)實(shí)現(xiàn)
波形發(fā)生器以及其他附加功能的開發(fā)
原文標(biāo)題:具有自動(dòng)量程功能的簡易示波器
文章出處:【微信公眾號(hào):FPGA入門到精通】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
示波器
+關(guān)注
關(guān)注
113文章
6104瀏覽量
183399 -
電壓
+關(guān)注
關(guān)注
45文章
5425瀏覽量
115118
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論