娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年01月14日(星期二)

正在發生

2020年01月14日 | 基于STM32內置ADC實現簡易示波器的程序設計與實現

發布者:科技之翼 來源: elecfans關鍵字:STM32  內置ADC  簡易示波器 手機看文章 掃描二維碼
隨時隨地手機看文章

  做一個數字采樣示波器一直是我長久以來的愿望,不過畢竟這個目標難度比較大,涉及的方面實在太多,模擬前端電路、高速ADC、單片機、CPLD/FPGA、通訊、上位機程序、數據處理等等,不是一下子就能成的,慢慢一步步來唄,呵呵,好歹有個目標,一直在學習各方面的知識,也有動力:)由于高速ADC涉及到采樣后的數據存儲問題,大量的數據涌入使得單片機無法承受,因此通常需要用外部高速RAM加CPLD配合,或者干脆用大容量的 FPGA做數據存儲處理等,然后通知單片機將數據發送出去。這部分實在是難度比較大,電路非常復雜,自己是有心無力啊,還得慢慢地技術積累。。。


  正好ST新推出市場的以CORTEX-M3為核心的STM32,內部集成了2個1Msps 12bit的獨立ADC,并且內部高達72MHZ的主頻,高達1.25DMIPS/MHZ的處理速度,高速的DMA傳輸功能,靈活強大的4個TIMER等等,這些真是非常有吸引力,何不用它來實現一個低頻的數字示波器功能呢,我的目標是暫時只要定量定性地分析20KHZ以下的低頻信號就行了,目標不高吧,用STM32可以方便地實現,等有了一定經驗之后慢慢再用FPGA和高速ADC搞個100Msps采樣的示波器!


  1、 ADC轉換:STM32增強型芯片內置的2個獨立ADC,可以有16個通道,并且2個通道可以并行的同步采樣,觸發方式很靈活,可以通過TIMER以及外部電平等方式觸發,并行方式下ADC2自動同步于ADC1;ADC在最高速采樣的時候需要1.5+12.5個ADC周期,在14M的ADC時鐘下達到 1Msps的速度,因為我主頻是72M所以4分頻后稍微高了點,18MHZ的ADC時鐘,采樣速度應該高于1M了。ADC 采樣2路同時采樣方式,用TIM2 CC2來生成時鐘信號觸發ADC來實現指定頻率的采樣。ADC1/ADC2采樣的結果是一個word


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


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


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


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


  顯示的界面及部分照片:

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


  上位機的程序:

  上位機的程序還處在對于measuremenStudio的摸索當中,只是初步了解到了幾個函數,用它來實現數據處理實在是方便,look public void DataReceived_Proc() //UDP數據接收、數據處理、數據顯示函數


  {

  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];

  //數據處理,將通訊接收區中的ADC數據傳入繪圖用數組中

  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(綠色)rn”;

  //測試真有效值

  Measurements.ACDCEstimator(dADC1_Result, out acEstimate, out dcEstimate);//交流(AC方式相當于信號通過一個電容隔直后進行測量)和直流(DC直通方式進行測量)真有效值測量

  str += “AC方式有效值:” + ((int)(acEstimate * 1000)).ToString() + “mV” + “DC方式有效值” + ((int)(dcEstimate * 1000)).ToString() + “mVrn”;

  //測試信號頻率、振幅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() + “mVrn”;

  str += “rn通道B(紅色)rn”;

  //測試真有效值

  Measurements.ACDCEstimator(dADC2_Result, out acEstimate, out dcEstimate);//交流(AC方式相當于信號通過一個電容隔直后進行測量)和直流(DC直通方式進行測量)真有效值測量

  str += “AC方式有效值:” + ((int)(acEstimate * 1000)).ToString() + “mV” + “DC方式有效值” + ((int)(dcEstimate * 1000)).ToString() + “mVrn”;

  //測試信號頻率、振幅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() + “mVrn”;

  textBox3.Text = str;

  //ThresholdPeakDetector.Analyze用來找出從波谷到波峰上升沿頂點的數組序號

  //可以用于固定顯示波形從上升沿的某固定點開始,相當與硬件的同步觸發電路功能

  //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數據,允許進行再次發送

  bIsDataReadyForPlot = true;

  myGraphPlotProc();//繪圖輸出*/

  //myD1 = new myMethodDelegate(h);

  //myD1(1);

  }

  }

  catch (Exception e1)

  {

  timer1.Enabled = false;

  MessageBox.Show(e1.ToString());

  }

  finally

  {

  timer1.Enabled = false;

  }

  }

  /************************************************************************************

  * 繪圖輸出過程函數供,mygGraphPlotThread進程調用

  * 始終循環檢測bIsDataReadyForPlot,一旦為真則進行繪圖,繪圖完成后置標志為false

  * **********************************************************************************/

  public void myGraphPlotProc()//繪圖輸出函數

  {

  //while (true )

  {

  if(bIsDataReadyForPlot)

  {

  waveformPlot1.PlotY(dADC1_Result);

  waveformPlot2.PlotY(dADC2_Result);

  bIsDataReadyForPlot = false;

  }

  }

  }


  下位機的程序:

  下位機的程序,也還在完善,現在只做到了基本的功能,還不穩定,主要問題還是在傳輸上的,這次為了一次傳輸比較多的數據,要將UDP數據包分解,分成多個小于1518字節的幀發送,因此發現當數據發送快的時候很容易導致數據停止發送,以前用MEGA32和SAM7的時候沒注意過,當時的處理速度也慢,沒暴露出來,想來想去可能是由于連續發送的時候速度太快導致的沖突,ENC28J60出錯掛起了,還是ENC28J60沒有吃透,對于里面的流控、以太網沖突檢測這些還需要進一步研究。


  /******************** (C) COPYRIGHT 2007 STMicroelectronics ********************

  *STM32F10*** 雙通道ADC數據采集并通過ENC28J60實現UDP通訊傳輸

  *作者:alien2006

  *環境:keil for arm mdk 3.15b

  *版本:V0.2

  *時間:20071202

  *說明:V0.2

  *一、網絡通訊部分

  *1、先采用STM32 SPI輪詢方式進行傳輸試驗,ping 192.168.1.100 -l 1400 -n 10

  *在輪詢方式下未改進SPI1_SendByte()函數(內部直接用ST提供的函數語句)需 avg=9ms時間

  *輪詢方式下將SPI1_SendByte()函數中的4條語句修改為直接寄存器存取后avg提高到7ms

  *輪詢方式下取消SPI1_SendByte()直接代之以函數中四語句avg提高到6ms

  *經過上述的逐步修改,傳輸UDP1400個字符時雙向傳輸(接收1400個字節再發送這1400個字節)間隔4MS可達210KB/S

  *2、enc28j60.c修改增加STM32 SPI傳輸DMA和非DMA編譯選項,DMA方式下網絡最大傳輸速度測試達到350KB/S

  *3、改進了ZYP_UDP.C實現了當要發送的UDP數據長度超過單幀所能容納時,將UDP數據

  *自動進行分組,并可在編譯時自定義每個分組長度;

  *改進了ENC28J60.C加入了ENC28J60DMA空閑和網絡發送完畢的判斷,解決了當發送速度過快時導

  *致傳輸出錯問題。測試單向發送速度超過500KB/S;

  *二、STM32數據采集部分

  *1、ADC1/ADC2實現并行同時數據采集,12BIT最高可達1MSPS采樣速度并通過STM32的DMA傳輸放入內存中

  *2、TIM2 CC2實現對ADC采樣的觸發,ADC_Sample_Frequency_Set函數實現自定義TIM2 OC2頻率輸出,

  *3、采樣的頻率和采樣個數通過接收到的UDP控制命令來指定

  *采樣的頻率為20HZ~1MHZ;

  *采樣深度為1~4000個數據(受限于STM32內存20KB容量,一個數據為2個12bitADC通道讀數,需一個word)

  *4、定義了簡單的UDP控制命令結構,用于實現與PC通訊和控制采樣頻率和采樣深度

  *三、其他

  *1、程序待解決問題:UDP分組發送出錯問題未完全解決,有待進一步解決

  *2、期待增加模擬前端電路,并實現放大倍數程控,通過上位機程序可以設置

  *

  * V0.1:最初程序,實現簡單固定頻率和深度的并行ADC采樣和UDP通訊,并編制了簡單的上位機程序,

  *可以進行采樣波形的顯示

關鍵字:STM32  內置ADC  簡易示波器 引用地址:基于STM32內置ADC實現簡易示波器的程序設計與實現

上一篇:三分鐘就懂,使用示波器進行射頻信號測試
下一篇:怎么用數字示波器分析諸如電氣噪聲等隨機信號

0

推薦閱讀

全球領先的人機界面解決方案開發商Synaptics(NASDAQ:SYNA)與聲學元件全球領導者歌爾今天宣布,Synaptics? AudioSmart?混合自適應數字噪音消除技術已被歌爾在其先進的最新系列主動降噪(ANC)耳機中采用。Synaptics全新噪音消除技術是全球首款針對有線USB Type-C標準、集成在單一芯片上的混合自適應數字噪音消除解決方案。得益于深厚的ANC產品經驗,歌爾...
據報道,中聯重科全新打造的塔式起重機智能工廠11日在常德開園,這是全球最大的塔機智能工廠,擁有12條自動化生產線、100多臺工業機器人、1萬多個傳感器。百億級智能制造產業高地該智能工廠按照德國工業“4.0”標準打造,于2016年起投資7.8億元建設,集成應用智能控制、智能產線、智能物流、智能檢測技術四位一體,生產效率高、信息化管理水平高,平均每11...
英飛凌科技股份公司(FSE: IFX / OTCQX: IFNNY)攜手Rompower加強其開發高效、緊湊型通用充電器的能力。這些采用通用USB-C接口的USB-PD(電能輸送)充電器,可為顯示器或智能音箱等供電,也能為智能手機或平板電腦等移動終端的電池充電。如今,這些插頭還具備其它功能,比如給智能手機快速充電。使用USB-PD技術可讓智能手機在不到一小時內充滿電。USB-...
趕在發布會之前,知名爆料人士evleaks放出了三星Galaxy S21系列的真機照。  據悉,三星Galaxy S21系列分為S21、S21+、S21 Ultra三個版本,其中Galaxy S21、Galaxy S21+為直屏,Galaxy S21 Ultra為曲面屏?! ∑渲蠫alaxy S21 Ultra采用6.8英寸顯示屏,刷新率為120Hz,是GalaxyS系列表現最好的一塊屏幕?! 〔粌H如此,Galaxy S21 U...

史海拾趣

問答坊 | AI 解惑

常用晶體管,3極管資料大全

常用晶體管,3極管資料大全…

查看全部問答∨

RFIC是分布參數還是集總參數?

與各位探討: RFIC的整體電路結構和集總參數射頻電路區別不大,差異是因為在芯片里有些元件需要用工藝可以實現的方式設計。 集成電路有它的特點,例如在IC中,線間距離和線的尺寸都很小,由此在分立電路中不會出現或影響不顯著的一些物理效應( ...…

查看全部問答∨

無法打開包括文件:“ca_merge30.h”

在編譯時出現無法打開包括文件:“ca_merge30.h”,尋求大俠們幫忙。。。。謝謝…

查看全部問答∨

新手請教GPRS發手機短信中的PDU模式

我用GPRS調試發短信,但是不知道怎么把文本的轉換成PDU模式的,也可以是怎么把超級終端中收到的一堆16進制的轉換成中文?…

查看全部問答∨

關于傳感器采樣液體微量變化的問題?

關于傳感器采樣液體微量變化的問題?     想用傳感器采樣液體的微量變化,然后試了試掛吊瓶,用傳感器采樣滴液的變化情況,感覺液體在滴啊,但是采樣值卻是一會大一會小,完全沒有規律,一點也沒呈現出線性變小的趨勢。這是怎么回事? ...…

查看全部問答∨

pda上判斷是否有存儲卡或者內置存儲卡

用vc2005,ppc2003,請問各位大俠我該如何判斷pda上是否有存儲卡或內置的存儲卡并讀出名字呢…

查看全部問答∨

基于arm9的開發板運行一個wince系統,讀寫總線問題

基于arm9(EP9302)的開發板運行一個wince系統,讀寫總線問題: 在wince上寫了一個小的測試程序, while循環讀取一個虛擬地址(DI)的值, 再把這個值寫到另一個虛擬地址(DO)上. 結果是:用示波器測得總線上的寫信號正常, 讀信號間隔時間有時要幾秒鐘才 ...…

查看全部問答∨

據聞WINCE下能夠定制觸摸屏校準,具體如何定制呢?有大俠指教嗎?

據聞WINCE下能夠定制觸摸屏校準,具體如何定制呢?有大俠指教嗎?…

查看全部問答∨

OLEDB 方法中的IID_IRowsetIndex 中的seek相關問題

請問一下各位大俠,我在一個數據表中建了三列(即3個字段)都是WCHAR類型,我想根據第二或第三列的值查詢某一行的數據,請問要怎么實現???急急………

查看全部問答∨

問個wince5.0的中斷問題

就以SD卡為例子 注冊表 [HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\SDHC_SMDK2440]     "Order"=dword:21     "Dll"="sdhc_sc2440.dll"     "Prefix"="SDH"         ...…

查看全部問答∨
小廣播
添点儿料...
无论热点新闻、行业分析、技术干货……
最新測試測量文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 静安区| 兴和县| 行唐县| 肃宁县| 枣庄市| 西畴县| 临西县| 阿克陶县| 奎屯市| 绥化市| 靖远县| 凤凰县| 梁山县| 泾川县| 云南省| 辽宁省| 涞源县| 泰安市| 开封市| 界首市| 呈贡县| 嵩明县| 南溪县| 龙胜| 达日县| 肥乡县| 钟祥市| 霍州市| 延吉市| 金昌市| 同心县| 长治县| 昆山市| 平顶山市| 砚山县| 南雄市| 易门县| 合作市| 特克斯县| 梁河县| 华坪县|