標題: 無線幅頻儀制作(WiFi通信)-含STM32源程序,JAVA上位機與設計報告-國賽福利 [打印本頁]
作者: zb12138 時間: 2017-10-23 13:04
標題: 無線幅頻儀制作(WiFi通信)-含STM32源程序,JAVA上位機與設計報告-國賽福利
國賽福利四川省一等獎作品-2017-8
含完整的設計文檔,上位機(JAVA)和下位機(stm32),程序代碼,用WiFi通信
IMG_20170914_220505.jpg (634.74 KB, 下載次數: 111)
下載附件
2017-10-23 13:00 上傳
IMG_20170902_211848.jpg (3.3 MB, 下載次數: 83)
下載附件
2017-10-23 12:59 上傳
IMG_20170902_212135.jpg (3.96 MB, 下載次數: 71)
下載附件
2017-10-23 13:00 上傳
捕獲.JPG (59.91 KB, 下載次數: 68)
下載附件
2017-10-23 13:00 上傳
2017年全國大學生電子設計競賽試題設計文檔
遠程幅頻特性測試裝置(H題)
【本科組】
摘要:本裝置測量放大器的幅頻特性,并將數據繪成直觀的圖線。系統以32位高性能單片機STM32F103為主控制器,由數字式頻率合成器AD9854產生所需信號,通過鍵盤與OLED顯示屏直觀控制掃頻、點頻等模式與頻率、幅值等參數,產生一路穩定幅值的正弦掃頻信號。信號通過自制的0~40dB可調增益放大器,經均值響應功率檢波器AD8361檢波后得到直流信號,即放大器輸出信號的幅值信息;再經單片機內部模/數轉換器采樣,處理計算后,將幅值、頻率信息發送至Wi-Fi模塊ESP-32,使得局域網內的設備可以獲取幅頻特性數據。作品另配有計算機應用程序和安卓APP,可以方便地顯示幅頻特性曲線,從而實現放大器的遠程幅頻特性測試。
一 系統方案1.1 比較與選擇本系統主要由控制器、信號源模塊、放大器模塊、鍵盤顯示模塊、網絡模塊、電源模塊組成,下面分別論證這幾個模塊的選擇。
1.1.1 控制器的論證與選擇方案一:采用51單片機控制。51系列單片機是廉價、易得的微控制器,但由于其采用集中指令結構,運行速度不夠可觀。在執行大型程序時,51單片機容易顯現出功耗大、不穩定的缺點。
方案二:采用FPGA控制。FPGA即現場可編程門陣列,是作為專用集成電路領域中的一種半定制電路而出現的,解決了定制電路的不足,又克服了原有可編程器件門電路數有限的缺點。FPGA一般來說功耗較低。但在開發過程中往往需要快速增減一些簡單功能,如串口通信等,而此類功能有可能占用過多的邏輯門資源,因此采用FPGA開發整個系統則較為不便。
方案三:采用STM32單片機控制。STM32系列單片機具有開發方便、I/O口數量多等特點。ARM內核使得其運行速度明顯優于51系列單片機。STM32F103屬于增強型系列,是同類產品中性能最高的產品。
綜合以上兩種方案與實際情況,選擇方案三。
1.1.2 信號源的論證與選擇方案一:采用分立元件和中小規模集成電路構成波形發生器采用RC串并聯振蕩器生成正弦信號。該方案的優點:技術成熟,可供參考的資料較多。缺點:外圍元器件多,調試工作量較大,頻率穩定度和準確度差,很難滿足頻率變化的范圍要求,更難準確地實現頻率步進的要求。
方案二:利用專用直接數字合成DDS芯片AD9851實現波形發生器。AD9851可以產生一個穩定的頻率和相位且可數字化編程的模擬正弦波輸出。但是該芯片理論上可達到70MHz,其實在實際應用中,當頻率達到30MHz時,波形就失真了,而且外圍電路較為復雜,需耗費大量時間。
方案三:采用AD9854芯片構成信號源。AD9854芯片可產生一高穩定的頻率、相位、幅度可編程的正弦和余弦信號,允許輸出的信號頻率高達150MHz,而數字調制輸出頻率可達100MHz,滿足項目40M的要求。
綜合以上三種方案,選擇方案三。
1.1.3 放大器模塊的論證與選擇方案一:選用兩級電壓反饋運算放大器OPA847放大,再由數字衰減器PE4302衰減。OPA847是寬帶超低噪聲電壓反饋運算放大器,常被用于前級放大,且帶寬可高達3.9GHz,噪聲極小。數字衰減器可以實現對DC~4.0GHz信號產生最大31.5dB的衰減,步進為0.5dB,但不可以實現系統增益連續可變。
方案二:選擇運放AD8009。通過調AD8009 R1和Rf,實驗發現可以實現單片運放0~40dB的要求,但是不能滿足項目輸入阻抗600Ω的要求。
方案三:選擇壓控正益放大器VCA824級聯,外加AD690調節輸入阻抗,滿足項目要求。
綜合以上三種方案,選擇方案三。
1.1.4 鍵盤與顯示模塊的論證與選擇(1)鍵盤:
方案一:獨立鍵盤。控制簡單,但是占用單片機IO口資源太多。
方案二:矩陣鍵盤。控制較為復雜,但是占用單片機IO口資源少。
方案三:周立功鍵盤。控制較為復雜,操作點單,但功能強大。
(2)顯示器:
方案一:TFT。功能強大,但是用于控制DDS顯得過于復雜。
方案二:OLED。IIC通信方式,占用單片機IO口資源少,滿足需求。
方案三:12864。操作簡單,但占用單片機IO口資源多而且費電。
綜合以上幾種方案,選擇周立功鍵盤和OLED。
1.1.5 網絡通信模塊的論證與選擇方案一:使用ESP-8266作為TCP客戶端,與主機建立一對一通信。ESP-8266常被用作單片機WiFi模塊使用,可以通過串口傳輸AT指令加以控制。
方案二:使用ESP-32建立TCP服務端,供局域網內其他設備訪問。ESP-32是上海樂鑫公司出品的性能更強的物聯網模塊,同時也可以單獨作為單片機使用。另外,設立TCP服務端,也使得讓電腦客戶端軟件和手機APP同時訪問成為可能。
綜合以上兩種方案,選擇方案二。
1.2 方案描述根據上文得出方案:系統以STM32為主控板,以ZLG鍵盤和OLED屏為交互方式,控制DDS AD9854進行掃頻,經過自制的放大器,由均值檢波器AD8361讀出幅值信息。幅頻特性數據通過ESP-32實現串口透傳,由特別編寫的計算機程序和安卓APP接收和繪制。
二 理論分析與計算2.1 信號發生器的電路設計
經討論后,我們決定采用DDS AD9854。我們按照官方提供的電路,完成了如下設計。
圖1 正交掃頻信號源子系統電路原理圖(大圖見附錄)
2.2 放大器設計
為了達到放大性能、帶寬、輸入阻抗和帶載能力的要求,我們以OPA690跟隨器為第一級,設定輸入阻抗600Ω,繼而用兩級VCA824達到信號0~40dB放大的要求。經測試,20MHz下,該系統可完成0~44.6dB連續可調的要求。
圖2 放大器系統電路原理圖(大圖見附錄)

2.3 頻率特性測試儀器由于示波器有X Y輸入模式,由單片機DA產生的電壓信息直接輸入通道CH1、CH2,當掃描足夠快時,由于視覺暫留現象,屏幕上便會留下幅頻特性曲線。
三 電路與程序設計

3.1 電路設計圖4系統電路原理圖

3.2 程序設計
這里主要對兩個設備進行了編程:STM32和ESP-32。STM32使用μVision官方SDK,ESP-32使用新興的嵌入式綜合開發平臺PlatformIO設計,也可以在ArduinoIDE內進行開發。程序詳見附錄2。
計算機客戶端采用Java編寫,手機端APP使用AndroidSDK進行設計。
圖

5 計算機客戶端效果
0.png (6.43 KB, 下載次數: 90)
下載附件
2017-10-23 15:53 上傳
圖6 安卓客戶端效果
四 測試方案與測試結果
4.1 測試方案及測試條件在未帶放大器網絡的條件下,采用DDS掃頻,獲得如下數據:
0,0.476953
1,0.510791
2,0.567187
3,0.678369
4,0.838696
5,0.982910
6,1.115845
7,1.256836
8,1.376074
9,1.508203
10,1.605688
11,1.710425
12,1.741846
13,1.865918
14,1.915869
15,1.962598
16,2.002881
17,2.026245
18,2.062500
19,2.076196
20,2.077808
21,2.106812
22,2.145483
23,2.148706
24,2.154346
25,2.157568
26,2.153540
27,2.156763
28,2.155151
29,2.149512
30,2.132593
31,2.130176
32,2.127759
33,2.129370
34,2.124536
35,2.059277
36,2.039136
37,2.035913
38,2.041553
39,2.021411
40,2.030273
41,2.031079
42,2.027856
43,2.037524
44,2.047998
45,2.046387
46,2.047192
47,2.060083
48,2.080225
49,2.104394
50,2.066528
4.2 測試結果完整性 由于篇幅限制,省略了放大器的數據。在之后的測量中,獲得了放大器的幅頻特性曲線,并在 RIGOL示波器DS1054上正確顯示:
圖6
4.3 測試結果分析測試初步確定了方案總體正確,甚至使幅頻曲線的部分細節得到了正確顯示。但由于示波器DS1054刷新頻率較慢,因此效果仍未達到最佳狀態。
附錄1:電路原理圖
圖1 正交掃頻信號源子系統電路原理圖
圖2 放大器系統電路原理圖
附錄1:部分代碼ESP-32主程序代碼
stm32單片機下位機源程序如下:
- #include "stm32f10x.h"
- #include "LED_TEST_VET6.H"
- #include "delay.h"
- #include "dac.h"
- #include "math.h"
- #include "adc.h"
- #include "usart.h"
- #include "AD9854.h"
- #include "zlg7290.h"
- #include "exti.h"
- #include "oled.h"
- #define Vppin_up 409
- #define Vppin_low 1
- #define sweep_step_up 2000
- #define sweep_step_low 10
- int Vppin100mv[50]={98,98,99,101,100,101,102,103,104,105,
- 106,107,105,108,108,108,109,109,110,110,
- 110,111,113,113,113,113,113,113,113,113,
- 112,111,109,108,107,105,104,103,102,101,
- 101,101,101,101,101,101,101,104,105,107};
- float Vpp_num[50];
- char Mode=4;
- //PB5 INT ;PB7 SDA; PB6 SCL
- float Mhz=1.0;
- float Vpp=0;
- int Vppin=5;//5~100mv
- int sweep_step=1000;//Khz
- float sweep_start=1;
- float sweep_end=50;
-
- void sweep(void);
- void Test_key(void);
- void num_goback(void);
- float GetVpp(void);
- float GetVpp1(void);
- void sweep3(void);
- void sweep_100mv(void);
- void sweep3_100mv(void);
- int main(void)
- {
-
- LED_Init();//初始化
- delay_init();
- OLED_Init(); //初始化OLED
- OLED_Clear();
- Dac1_Init();//DAC通道1初始化
- Dac2_Init();//DAC通道2初始化
- EXTIX_Init();
- uart_init(9600);
- AD9854_Init();
- // AD9854_SetSine_double(27000000,1844);
- Adc_Init();
- ZLG7290_Init();
- while(1)
- {
- if(Mode==1)
- AD9854_SetSine_double(Mhz*1000000,Vppin*10);
- if(Mode==2)
- sweep();
- if(Mode==3)
- sweep3_100mv();
- if(Mode==4)
- sweep_100mv();
- }
- }
- float GetVpp()//PA1
- { u16 adcx;
- float temp;
- adcx=Get_Adc_Average(ADC_Channel_1,10);
- temp=(float)adcx*(3.3/4096);
- return temp;
- }
- float GetVpp1()//PA0
- { u16 adcx;
- float temp;
- adcx=Get_Adc_Average(ADC_Channel_0,10);
- temp=(float)adcx*(3.3/4096);
- return temp;
- }
- void sweep()
- {
- for(Mhz=sweep_start;Mhz<sweep_end;Mhz=sweep_step/1000.0+Mhz)
- {
- AD9854_SetSine_double(Mhz*1000000.0,Vppin*10);
- delay_ms(10);
- }
- for(Mhz=sweep_end;Mhz>sweep_start;Mhz=-sweep_step/1000.0+Mhz)
- {
- AD9854_SetSine_double(Mhz*1000000.0,Vppin*10);
- delay_ms(10);
- }
- }
- void sweep_100mv()
- {
- char i=0;
- {
- for(i=1;i<=50;i++)
- {AD9854_SetSine_double(i*1000000.0,Vppin100mv[i-1]*10);
- Vpp=GetVpp();
- printf("A%d,%f\r\n",i,Vpp);
- printf("A%f,%f\r\n",i+0.5,Vpp);
- OLED_ShowNum(48,4,Vpp,4,16);
- OLED_ShowNum(48,2,i,4,16);
- }
- for(i=50;i>1;i--)
- {AD9854_SetSine_double(i*1000000.0,Vppin100mv[i-1]*10);
- Vpp=GetVpp();
- printf("A%d,%f\r\n",i,Vpp);
- printf("A%f,%f\r\n",i+0.5,Vpp);
- OLED_ShowNum(48,4,Vpp,4,16);
- OLED_ShowNum(48,2,i,4,16);
- }
- }
- }
- void sweep3_100mv()
- {
- u8 i;
- u8 j;
- {
- for(i=1;i<=50;i++)
- {AD9854_SetSine_double(i*1000000.0,Vppin100mv[i-1]*10);
- Vpp=GetVpp();
- Vpp_num[i-1]=Vpp;
- OLED_ShowNum(48,4,Vpp,4,16);
- OLED_ShowNum(48,2,i,4,16);
- }
-
- for(j=0;j<200;j++)
- {
- for(i=1;i<50;i++)
- {
- Dac1_Set_Vol(i*66);//PA4
- Dac2_Set_Vol((Vpp_num[i-1]-0.5)*1650);//PA5
- delay_us(100);
- }
- }
-
- // for(i=50;i>1;i--)
- // {AD9854_SetSine_double(i*1000000.0,Vppin100mv[i-1]*10);
- // Vpp=GetVpp();
- // Vpp_num[i-1]=Vpp;
- // }
- // for(i=50;i>1;i--)
- // {
- // Dac1_Set_Vol(i*66);//PA4
- // Dac2_Set_Vol((Vpp_num[i-1]-0.5)*1650);//PA5
- // delay_us(100);
- // }
- }
- }
- void Test_key()
- {
- u8 KeyValue=0;
- u8 RepeatCnt=0;
- u8 FnKeyValue=0;
- ZLG7290_ReadReg(ZLG7290_Key,&KeyValue);
- ZLG7290_ReadReg(ZLG7290_RepeatCnt,&RepeatCnt);
- ZLG7290_ReadReg(ZLG7290_FunctionKey,&FnKeyValue);
- { AD9854_Init();
- printf("%d\r\n",KeyValue);
- if(Mode==1)//點頻
- {
- switch (KeyValue)
- {
- case 4:
- Mhz++;
- break;
- case 3:
- Mhz--;
- break;
- case 2:
- Vppin+=1;
- break;
- case 1:
- Vppin-=1;
- break;
-
- case 20:
- Mhz+=10;
- break;
- case 19:
- Mhz-=10;
- break;
- case 18:
- Vppin+=10;
- break;
- case 17:
- Vppin-=10;
- break;
- }
- num_goback();
- OLED_ShowNum(48,2,Mhz,4,16);
- OLED_ShowNum(48,4,Vppin,4,16);
- }
- if(Mode==2)
- {
- if(FnKeyValue==255)
- {
- switch (KeyValue)
- {
- case 4:
- sweep_step+=10;;
- break;
- case 3:
- sweep_step-=10;
- break;
- case 2:
- Vppin+=1;
- break;
- case 1:
- Vppin-=1;
- break;
- case 20:
- sweep_step+=100;
- break;
- case 19:
- sweep_step-=100;
- break;
- case 18:
- Vppin+=10;
- break;
- case 17:
- Vppin-=10;
- break;
- }
- num_goback();
- OLED_ShowNum(48,2,sweep_step,4,16);
- OLED_ShowNum(48,4,Vppin,4,16);
- }
- if(FnKeyValue==254)//調范圍
- { switch (KeyValue)
- {
- case 4:
- sweep_start+=1;
- break;
- case 3:
- sweep_start-=1;
- break;
- case 2:
- sweep_end+=1;
- break;
- case 1:
- sweep_end-=1;
- break;
- case 20:
- sweep_start+=10;
- break;
- case 19:
- sweep_start-=10;
- break;
- case 18:
- sweep_end+=10;
- break;
- case 17:
- sweep_end-=10;
- break;
-
- }
- num_goback();
- OLED_ShowNum(48,6,sweep_start,2,16);
- OLED_ShowNum(72,6,sweep_end,2,16);
- }
- }
- if(KeyValue>=9&&KeyValue<=12)
- {
- OLED_Clear();
- switch (KeyValue)
- {
- case 12:
- Mode=1;
- showCinese_byrow(0,0,0,"45860");
- showCinese_byrow(0,1,0,"018");
- showCinese_byrow(0,2,0,"238");
- OLED_ShowNum(48,2,Mhz,4,16);
- OLED_ShowNum(48,4,Vppin,4,16);
- OLED_ShowString(96,2,"Mhz",16);
- OLED_ShowString(96,4,"mV",16);
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (43.39 KB, 下載次數: 87)
下載附件
2017-10-23 14:50 上傳
0.png (47.63 KB, 下載次數: 107)
下載附件
2017-10-23 14:41 上傳
全部資料下載(含完整的源碼與word格式的文檔):
無線幅頻儀設計資料.7z
(4.46 MB, 下載次數: 130)
2021-8-24 17:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
,求評分鼓勵O(∩_∩)O
作者: world_all 時間: 2017-11-7 14:55
正好準備用AD9854
作者: Wolfcity 時間: 2018-5-22 20:40
謝謝分享!
作者: cnc2020 時間: 2018-6-24 19:31
謝謝分享
作者: Hxi 時間: 2018-9-13 10:16
很好的資料,剛好電賽可以用到,謝謝分享!
作者: Veis 時間: 2018-9-27 11:20
樓主,請問你的VCA824電路是怎么接的?單電源好像手冊都沒有參考電路
作者: xdnf 時間: 2019-3-1 23:52
17年大二,因為有事沒參加這次比賽
作者: 黃呀呀 時間: 2019-7-20 21:35
謝謝樓主分享。樓主很棒
作者: 王修宇 時間: 2019-7-25 20:22
上位機源代碼有嗎 學習一下
作者: 鵬博士PBs 時間: 2019-7-26 01:01
感謝分享 太棒了
作者: zb12138 時間: 2019-8-3 18:49
參考http://www.zg4o1577.cn/bbs/dpj-96630-1.html
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
国产精品久久久久久久午夜片
|
日本在线一区二区
|
亚洲欧美另类在线
|
日韩一区二区免费视频
|
综合久久亚洲
|
午夜影院视频
|
精品一区二区av
|
国产在线观看一区
|
天天爽夜夜骑
|
国产精品视频久久久久久
|
国内精品在线视频
|
国产精品一区在线观看
|
中文一级片
|
成人av网页
|
亚洲精品视频久久
|
亚洲视频在线观看免费
|
久久91精品
|
成人高清在线
|
国产91久久精品一区二区
|
大陆一级毛片免费视频观看
|
国产精品成人一区
|
亚洲成人免费视频在线
|
欧美xxxx日本
|
男人天堂视频在线观看
|
在线免费亚洲视频
|
亚洲第一福利视频
|
国产一区二区三区免费观看在线
|
日韩黄色av|
国产精品久久九九
|
www久久|
在线观看成年人视频
|
国产精品久久久久永久免费观看
|
一本一道久久a久久精品综合蜜臀
|
国产精品国产成人国产三级
|
黄色av网站免费看
|
欧美极品在线观看
|
国产精品区一区二
|
天天干狠狠操
|
久久久av|
欧美日韩成人
|
国产精品国产三级国产aⅴ中文
|