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