當前位置:首頁 > 單片機 > 單片機
[導讀] 做一個數(shù)字采樣示波器一直是我長久以來的愿望,不過畢竟這個目標難度比較大,涉及的方面實在太多,模擬前端電路、高速ADC、單片機、CPLD/FPGA、通訊、上位機程序、數(shù)據(jù)處理等等,不是一下子就能成的,慢

 

做一個數(shù)字采樣示波器一直是我長久以來的愿望,不過畢竟這個目標難度比較大,涉及的方面實在太多,模擬前端電路、高速ADC、單片機、CPLD/FPGA、通訊、上位機程序、數(shù)據(jù)處理等等,不是一下子就能成的,慢慢一步步來唄,呵呵,好歹有個目標,一直在學習各方面的知識,也有動力:)由于高速ADC涉及到采樣后的數(shù)據(jù)存儲問題,大量的數(shù)據(jù)涌入使得單片機無法承受,因此通常需要用外部高速RAM加CPLD配合,或者干脆用大容量的 FPGA做數(shù)據(jù)存儲處理等,然后通知單片機將數(shù)據(jù)發(fā)送出去。這部分實在是難度比較大,電路非常復雜,自己是有心無力啊,還得慢慢地技術積累。。。
正好ST新推出市場的以CORTEX-M3為核心的STM32,內部集成了2個1Msps 12bit的獨立ADC,并且內部高達72MHZ的主頻,高達1.25DMIPS/MHZ的處理速度,高速的DMA傳輸功能,靈活強大的4個TIMER等等,這些真是非常有吸引力,何不用它來實現(xiàn)一個低頻的數(shù)字示波器功能呢,我的目標是暫時只要定量定性地分析20KHZ以下的低頻信號就行了,目標不高吧,用STM32可以方便地實現(xiàn),等有了一定經(jīng)驗之后慢慢再用FPGA和高速ADC搞個100Msps采樣的示波器!
說來也真是幸運,得到了GRANT兄相贈的STM32F103VB以及評估版的電路板,這些日子一直在學習STM32,不斷地做實驗,也算是稍微有點入門了,真是了解越多越喜歡這個芯片,呵呵。

想來這個論壇上對數(shù)據(jù)采樣以及數(shù)字示波器感興趣的朋友很多,下面我簡單描述下實現(xiàn)方式,發(fā)帖也跟大家分享下我的喜悅:)
1、 ADC轉換:STM32增強型芯片內置的2個獨立ADC,可以有16個通道,并且2個通道可以并行的同步采樣,觸發(fā)方式很靈活,可以通過TIMER以及外部電平等方式觸發(fā),并行方式下ADC2自動同步于ADC1;ADC在最高速采樣的時候需要1.5+12.5個ADC周期,在14M的ADC時鐘下達到 1Msps的速度,因為我主頻是72M所以4分頻后稍微高了點,18MHZ的ADC時鐘,采樣速度應該高于1M了。ADC 采樣2路同時采樣方式,用TIM2 CC2來生成時鐘信號觸發(fā)ADC來實現(xiàn)指定頻率的采樣。ADC1/ADC2采樣的結果是一個word

2、采樣頻率控制:由于STM32內部的4個TIMER非常強大,每個TIMER又有4個通道,再加上獨立的預分配器,實際上可以實現(xiàn)任意分頻,因此用TIM2 CC2來產生指定頻率的時鐘,用來觸發(fā)ADC1連續(xù)采樣。

3、采樣數(shù)據(jù)傳輸及每次采樣深度控制:ADC產生的轉換數(shù)據(jù)通過高速DMA 通道1來傳輸置指定的內部RAM中,并且將DMA通道一設置成最高優(yōu)先級,以保證數(shù)據(jù)準確,并且用DMA每次傳輸?shù)膫€數(shù)來控制采樣的深度,例如我要采集 100個點那么就設置DMA傳輸100個次,每次從32位ADC轉換寄存器傳輸一個word到RAM中,等完成了100次傳輸后,DMA通道自動停止(實際上ADC是一直按照要求的采樣頻率連續(xù)在后臺采樣,只是我去取數(shù)據(jù)而已),下次采集的時候我只要再設置下采樣的個數(shù)使能DMA CHANNEL1就行了。

4、與上位機通訊:通訊也是個難題,要達到快速地將大量數(shù)據(jù)發(fā)給上位機的目的,傳輸?shù)乃俾士隙ǖ筒涣?,開始我想先用串口,不過很快就放棄了,一則即使我用外部USB轉串口的芯片最高也只能達到1M的速度,并且數(shù)據(jù)會丟失;后來還是采用了網(wǎng)絡傳輸?shù)姆绞?,用SPI 接口的ENC28J60芯片,這個芯片我在MEGA32和AT91SAM7S64上都用過,接口簡單挺方便的,速度還可以,在SAM7S64上DMA凡是用UDP協(xié)議單向發(fā)送的速度可以達到400KB/S以上,這次用了STM32發(fā)現(xiàn)速度大增,經(jīng)過我用STM32的DMA傳輸后,同樣UDP協(xié)議單向發(fā)速度竟然達到了500KB/S以上,甚至最高可以達到600KB/S,這個真是意外的收獲。

5、上位機程序:還是用VS2005,我還是喜歡用C#,主要是微軟的C#做得是在太舒服了,編輯器智能化程度真高,我只要剛剛輸個開頭的字母,馬上就感知出來一堆讓你選擇,連挨個敲字符的功夫都省了,還不用擔心拼寫出錯到時候找原因的麻煩,呵呵,缺點就是程序執(zhí)行時候CPU利用率要高點,什么時候它的C++ 編輯器也到這個程度我就換回C++,哈哈。波形顯示還是用NI的measurementStudio8來實現(xiàn),一個是漂亮方便,另外最要緊的就是 MeasurementStudio8里面有一大堆數(shù)據(jù)處理的庫,從簡單的波形有效值計算,頻率計算,到各種各樣的函數(shù)濾波器功能,還有FFT頻域分析,時域分析等等,但凡要用到的儀器相關處理里面都有,另外本來我打算要在模擬前端里面加一個相位鎖定的電路,以固定顯示的波形起點,后來發(fā)現(xiàn) MeasurementStudio8里面有個PeakDetector的類,用這個來實現(xiàn)波形的鎖定連這個電路都可以省了。用 MeasurementStudio8來實現(xiàn)實在是非常方便,并且準確。只是我沒啥資料,還在探索當中

顯示的界面及部分照片:
數(shù)據(jù)采樣后輸出到PC上顯示的圖形很精確,包括MAX038產生的正弦波上部的小尖峰也很清楚,STM32的ADC精度很穩(wěn)定性相當好,對于音頻范圍的低頻信號來說,1Msps的采樣也基本夠用了。只要采集足夠的點送給measurementsudio提供的函數(shù)來分析,可以達到非常精確的程度,12BIT 的分辨率相當于數(shù)字表的3位半的效果,用來測試信號的頻率、真有效值、峰值、峰峰值等等非常方便和精確,和我用硬件實現(xiàn)的頻率計和真有效值的讀數(shù)相同(這也說明了我做的信號發(fā)生器的硬件是準確的,哈哈,之前跟數(shù)字表總對不上,看來是數(shù)字表準確度差),實現(xiàn)完全可以當作低頻示波器來用,再加上個模擬前端電路,完全可以實用化了

正弦波:
點擊查看圖片

上位機的程序:
上位機的程序還處在對于measuremenStudio的摸索當中,只是初步了解到了幾個函數(shù),用它來實現(xiàn)數(shù)據(jù)處理實在是方便,look public void DataReceived_Proc() //UDP數(shù)據(jù)接收、數(shù)據(jù)處理、數(shù)據(jù)顯示函數(shù)
{
try
{
while (bStates)
{
myudpcomm.Receive(ref CommReceiveBuffer);
Received_Command = Bytes2Struct(ref CommReceiveBuffer);
//textBox3.Text = Received_Command.SampleRate.ToString() + (acEstimate++).ToString();
dADC1_Result = new double[Received_Command.SampleDepth];
dADC2_Result = new double[Received_Command.SampleDepth];
//數(shù)據(jù)處理,將通訊接收區(qū)中的ADC數(shù)據(jù)傳入繪圖用數(shù)組中
for (int i = 0; i < (int)(Received_Command.SampleDepth); i++)
{
dADC1_Result = (BitConverter.ToUInt16(CommReceiveBuffer, 40 + 4 * (i + 0))) * (3.3 / 4096.0);
dADC2_Result = (BitConverter.ToUInt16(CommReceiveBuffer, 40 + 4 * (i + 0) + 2)) * (3.3 / 4096.0);
}
str = "通道A(綠色)\r\n";
//測試真有效值
Measurements.ACDCEstimator(dADC1_Result, out acEstimate, out dcEstimate);//交流(AC方式相當于信號通過一個電容隔直后進行測量)和直流(DC直通方式進行測量)真有效值測量
str += "AC方式有效值:" + ((int)(acEstimate * 1000)).ToString() + "mV" + "DC方式有效值" + ((int)(dcEstimate * 1000)).ToString() + "mV\r\n";
//測試信號頻率、振幅Vp
mySingleToneInformationADC1 = new SingleToneInformation(dADC1_Result, Received_Command.SampleRate);
str += "頻率:" + ((int)(acEstimate * 1000)==0 ? 0int )mySingleToneInformationADC1.Frequency).ToString() + "Hz" + "振幅Vp:" + ((int )mySingleToneInformationADC1.Amplitude*1000).ToString() + "mV\r\n";
str += "\r\n通道B(紅色)\r\n";
//測試真有效值
Measurements.ACDCEstimator(dADC2_Result, out acEstimate, out dcEstimate);//交流(AC方式相當于信號通過一個電容隔直后進行測量)和直流(DC直通方式進行測量)真有效值測量
str += "AC方式有效值:" + ((int)(acEstimate * 1000)).ToString() + "mV" + "DC方式有效值" + ((int)(dcEstimate * 1000)).ToString() + "mV\r\n";
//測試信號頻率、振幅Vp
mySingleToneInformationADC2 = new SingleToneInformation(dADC2_Result, Received_Command.SampleRate);
str += "頻率:" + ((int)(acEstimate * 1000) == 0 ? 0 : (int)mySingleToneInformationADC1.Frequency).ToString() + "Hz" + "振幅Vp:" + ((int)mySingleToneInformationADC1.Amplitude * 1000).ToString() + "mV\r\n";
textBox3.Text = str;
//ThresholdPeakDetector.Analyze用來找出從波谷到波峰上升沿頂點的數(shù)組序號
//可以用于固定顯示波形從上升沿的某固定點開始,相當與硬件的同步觸發(fā)電路功能
//b = ThresholdPeakDetector.Analyze(dADC2_Result, 2, 10);
//foreach (int k in b)
//{
//textBox3.Text += k.ToString() + " ";
//}
//for (int i = 0; i < Received_Command.SampleDepth - b[1]; i++)
{
//dADC1_Result = dADC2_Result[i + b[1]];
}
//textBox3.Text += b[b.Length - 1].ToString();
//bIsUdpDataReceived = true;//表示接收到了UDP數(shù)據(jù),允許進行再次發(fā)送
bIsDataReadyForPlot = true;
myGraphPlotProc();//繪圖輸出*/
//myD1 = new myMethodDelegate(h);
//myD1(1);
}
}
catch (Exception e1)
{
timer1.Enabled = false;
MessageBox.Show(e1.ToString());
}
finally
{
timer1.Enabled = false;
}
}
/************************************************************************************
* 繪圖輸出過程函數(shù)供,mygGraphPlotThread進程調用
* 始終循環(huán)檢測bIsDataReadyForPlot,一旦為真則進行繪圖,繪圖完成后置標志為false
* **********************************************************************************/
public void myGraphPlotProc()//繪圖輸出函數(shù)
{
//while (true )
{
if(bIsDataReadyForPlot)
{
waveformPlot1.PlotY(dADC1_Result);
waveformPlot2.PlotY(dADC2_Result);
bIsDataReadyForPlot = false;
}
}
}

下位機的程序:
下位機的程序,也還在完善,現(xiàn)在只做到了基本的功能,還不穩(wěn)定,主要問題還是在傳輸上的,這次為了一次傳輸比較多的數(shù)據(jù),要將UDP數(shù)據(jù)包分解,分成多個小于1518字節(jié)的幀發(fā)送,因此發(fā)現(xiàn)當數(shù)據(jù)發(fā)送快的時候很容易導致數(shù)據(jù)停止發(fā)送,以前用MEGA32和SAM7的時候沒注意過,當時的處理速度也慢,沒暴露出來,想來想去可能是由于連續(xù)發(fā)送的時候速度太快導致的沖突,ENC28J60出錯掛起了,還是ENC28J60沒有吃透,對于里面的流控、以太網(wǎng)沖突檢測這些還需要進一步研究。
/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
*STM32F10*** 雙通道ADC數(shù)據(jù)采集并通過ENC28J60實現(xiàn)UDP通訊傳輸
*作者:alien2006
*環(huán)境:keil for arm mdk 3.15b
*版本:V0.2
*時間:20071202
*說明:V0.2
*一、網(wǎng)絡通訊部分
*1、先采用STM32 SPI輪詢方式進行傳輸試驗,ping 192.168.1.100 -l 1400 -n 10
*在輪詢方式下未改進SPI1_SendByte()函數(shù)(內部直接用ST提供的函數(shù)語句)需 avg=9ms時間
*輪詢方式下將SPI1_SendByte()函數(shù)中的4條語句修改為直接寄存器存取后avg提高到7ms
*輪詢方式下取消SPI1_SendByte()直接代之以函數(shù)中四語句avg提高到6ms
*經(jīng)過上述的逐步修改,傳輸UDP1400個字符時雙向傳輸(接收1400個字節(jié)再發(fā)送這1400個字節(jié))間隔4MS可達210KB/S
*2、enc28j60.c修改增加STM32 SPI傳輸DMA和非DMA編譯選項,DMA方式下網(wǎng)絡最大傳輸速度測試達到350KB/S
*3、改進了ZYP_UDP.C實現(xiàn)了當要發(fā)送的UDP數(shù)據(jù)長度超過單幀所能容納時,將UDP數(shù)據(jù)
*自動進行分組,并可在編譯時自定義每個分組長度;
*改進了ENC28J60.C加入了ENC28J60DMA空閑和網(wǎng)絡發(fā)送完畢的判斷,解決了當發(fā)送速度過快時導
*致傳輸出錯問題。測試單向發(fā)送速度超過500KB/S;
*二、STM32數(shù)據(jù)采集部分
*1、ADC1/ADC2實現(xiàn)并行同時數(shù)據(jù)采集,12BIT最高可達1MSPS采樣速度并通過STM32的DMA傳輸放入內存中
*2、TIM2 CC2實現(xiàn)對ADC采樣的觸發(fā),ADC_Sample_Frequency_Set函數(shù)實現(xiàn)自定義TIM2 OC2頻率輸出,
*3、采樣的頻率和采樣個數(shù)通過接收到的UDP控制命令來指定
*采樣的頻率為20HZ~1MHZ;
*采樣深度為1~4000個數(shù)據(jù)(受限于STM32內存20KB容量,一個數(shù)據(jù)為2個12bitADC通道讀數(shù),需一個word)
*4、定義了簡單的UDP控制命令結構,用于實現(xiàn)與PC通訊和控制采樣頻率和采樣深度
*三、其他
*1、程序待解決問題:UDP分組發(fā)送出錯問題未完全解決,有待進一步解決
*2、期待增加模擬前端電路,并實現(xiàn)放大倍數(shù)程控,通過上位機程序可以設置
*
* V0.1:最初程序,實現(xiàn)簡單固定頻率和深度的并行ADC采樣和UDP通訊,并編制了簡單的上位機程序,
*可以進行采樣波形的顯示
*******************************************************************************/

 

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉