基於STM32的簡單數字示波器

2021-07-13 11:22:57 字數 1345 閱讀 8722

基於stm32f103zet6晶元最小系統 + tft液晶屏。

用到了:stm32內部adc,dac,dma,fsmc等等。。

(1). 用stm32晶元內部的ad連續取樣

(2). 用dma傳送到資料緩衝區

(3). 把取樣結果轉化為液晶屏上的座標位置

(4). 在液晶屏上面畫出來波形

(5). 回到(1)

一言概之,取樣&畫圖。

這個三角波是用stm32內部的dac產生。

(1). 閃屏問題

問題描述:更新波形時候閃屏嚴重。

原因:一次重畫,需要經歷三次過程,首先清空波形圖所在矩形,然後畫波形座標的格仔(方便檢視電壓大小),最後畫波形,因為刷屏速度本身不快,所以刷三遍後,閃屏很嚴重。

想到了三種解決方法:在重畫之前,先進行預處理,處理方式:

a方式: 每次先處理一條豎線上的資料,然後畫一條豎線,處理包括刷屏,格仔,波形。這樣處理一條,畫一條,一次刷屏即可完成重畫。

b方式:開闢一塊與螢幕畫素數相同的緩衝區(16位),緩衝區與螢幕座標一一對應,每次刷屏操作都是修改緩衝區,當完成所有操作,然後再把緩衝區內容畫到螢幕上。

理論上來說,b方法效果最好,操作也較簡單。c方式效果相對最差,但操作方法最簡單。

b方式只是空想,空間上不符合現實。對於微控制器而言,ram本就不多。假如使用320*240屏,一共76800個畫素點,每個畫素點用rgb565的話,乙個點需要兩個位元組,那一共就是150kb。想法不錯,但是嚴重脫離群眾。

a方式可行,但是資料預處理也比較麻煩,只比c方式好了一點點,因此除非要求特高。。。

所以採用c方式,效果也不錯,沒有明顯的閃屏了。

(2). dma問題

問題描述:dma連續傳送時,在畫波形時資料可能部分被修改。而單次傳輸,如何快速重啟dma?

解決方法(dma重啟傳輸): dma初始化時選擇單次傳輸,傳輸過程中,buffersize會改變,實測資料位寬也改變了。因此先關閉dma,然後重新設定buffersize和資料位寬,再開啟dma就好了。

**:

dma_cmd(dma1_channel1, disable);

dma_setcurrdatacounter(dma1_channel1,n);

dma1_channel1->ccr &= 0xfffff0ff;

dma1_channel1->ccr |= 0x00000900;

dma_cmd(dma1_channel1, enable);

自己焊接了幾個按鍵,可以實現暫停,調節時間寬度的功能。調節時間寬度,通過改變adc取樣時間來修改,adc共有8種取樣時間,因此可以調節8個時間寬度。

**比較長,內容也比較多,所以不能細細描述。

STM32簡易示波器開發總結

一.stm32內部da作為訊號源 二.stm23內部ad不間斷取樣 匯流排72mhz,6分頻,55.5個週期的取樣時間,大概有160khz的取樣頻率 不知道現在數字示波器還是不是和模擬的一樣用掃瞄訊號,沒有仔細去找相關資料,但是感覺完全可以用足夠的取樣率和儲存深度恢復波形 三.dma匯流排傳輸 單次...

STM32山外示波器程式

給串列埠傳送1位元組 void usart1 send char u8 c 給串列埠傳送指定長度的資料 void usart1 putbuff u8 buff,u32 len 山外傳輸協議 void vcan sendware u8 wareaddr,u32 waresize u8 cmdr 2 u...

STM32示波器 訊號發生器

關於stm32的示波器,網上以經有很多了。這裡還是想把自己的設計思想發表出來。這個專案已經準備了很久。這裡首先要感謝以前的團隊,非常感覺陳師和覃總兩位經驗豐富的嵌入式工程師,獲得了不少多方面的考慮。如果不是工作調整等原因,很有可能會出產品。但最後沒有做完深感遺憾。這裡發表下我的設計流程,希望能給做示...