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

3.1 電路設(shè)計(jì)圖4系統(tǒng)電路原理圖 
3.2 程序設(shè)計(jì) 這里主要對(duì)兩個(gè)設(shè)備進(jìn)行了編程:STM32和ESP-32。STM32使用μVision官方SDK,ESP-32使用新興的嵌入式綜合開(kāi)發(fā)平臺(tái)PlatformIO設(shè)計(jì),也可以在ArduinoIDE內(nèi)進(jìn)行開(kāi)發(fā)。程序詳見(jiàn)附錄2。 計(jì)算機(jī)客戶端采用Java編寫,手機(jī)端APP使用AndroidSDK進(jìn)行設(shè)計(jì)。 圖 
5 計(jì)算機(jī)客戶端效果
0.png (6.43 KB, 下載次數(shù): 90)
下載附件
2017-10-23 15:53 上傳
圖6 安卓客戶端效果
四 測(cè)試方案與測(cè)試結(jié)果
4.1 測(cè)試方案及測(cè)試條件在未帶放大器網(wǎng)絡(luò)的條件下,采用DDS掃頻,獲得如下數(shù)據(jù): 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 測(cè)試結(jié)果完整性 由于篇幅限制,省略了放大器的數(shù)據(jù)。在之后的測(cè)量中,獲得了放大器的幅頻特性曲線,并在 RIGOL示波器DS1054上正確顯示:
圖6 4.3 測(cè)試結(jié)果分析測(cè)試初步確定了方案總體正確,甚至使幅頻曲線的部分細(xì)節(jié)得到了正確顯示。但由于示波器DS1054刷新頻率較慢,因此效果仍未達(dá)到最佳狀態(tài)。
附錄1:電路原理圖
圖1 正交掃頻信號(hào)源子系統(tǒng)電路原理圖 圖2 放大器系統(tǒng)電路原理圖
附錄1:部分代碼ESP-32主程序代碼
stm32單片機(jī)下位機(jī)源程序如下:
- #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)//點(diǎn)頻
- {
- 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)//調(diào)范圍
- { 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);
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (43.39 KB, 下載次數(shù): 87)
下載附件
2017-10-23 14:50 上傳
0.png (47.63 KB, 下載次數(shù): 107)
下載附件
2017-10-23 14:41 上傳
全部資料下載(含完整的源碼與word格式的文檔):
無(wú)線幅頻儀設(shè)計(jì)資料.7z
(4.46 MB, 下載次數(shù): 130)
2021-8-24 17:43 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
,求評(píng)分鼓勵(lì)O(∩_∩)O
|