1. 程式人生 > >基於STM32的簡單數字示波器

基於STM32的簡單數字示波器

1. 平臺說明

    基於STM32F103ZET6晶片最小系統 + TFT液晶屏。     用到了:STM32內部ADC,DAC,DMA,FSMC等等。。

2. 基本原理

(1). 用STM32晶片內部的AD連續取樣 (2). 用DMA傳送到資料緩衝區 (3). 把取樣結果轉化為液晶屏上的座標位置 (4). 在液晶屏上面畫出來波形 (5). 回到(1) 一言概之,取樣&畫圖。

3. 結果展示

這個三角波是用STM32內部的DAC產生。

4. 遇到的問題

(1). 閃屏問題     問題描述:更新波形時候閃屏嚴重。     原因:一次重畫,需要經歷三次過程,首先清空波形圖所在矩形,然後畫波形座標的格子(方便檢視電壓大小),最後畫波形,因為刷屏速度本身不快,所以刷三遍後,閃屏很嚴重。     想到了三種解決方法:在重畫之前,先進行預處理,處理方式:         a方式: 每次先處理一條豎線上的資料,然後畫一條豎線,處理包括刷屏,格子,波形。這樣處理一條,畫一條,一次刷屏即可完成重畫。         b方式:開闢一塊與螢幕畫素數相同的緩衝區(16位),緩衝區與螢幕座標一一對應,每次刷屏操作都是修改緩衝區,當完成所有操作,然後再把緩衝區內容畫到螢幕上。         c方式:每次刷屏仍需三次操作,不過,之前是針對整個螢幕,而現在針對一條線,每次先畫完一條豎線,然後再畫完下一條。     理論上來說,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);

5. 功能拓展

    自己焊接了幾個按鍵,可以實現暫停,調節時間寬度的功能。調節時間寬度,通過改變ADC取樣時間來修改,ADC共有8種取樣時間,因此可以調節8個時間寬度。 程式碼比較長,內容也比較多,所以不能細細描述。 有興趣的可以去下載程式碼:http://download.csdn.net/detail/u013771867/9548642