標題: 無線幅頻儀制作(WiFi通信)-含STM32源程序,JAVA上位機與設(shè)計報告-國賽福利 [打印本頁]

作者: zb12138    時間: 2017-10-23 13:04
標題: 無線幅頻儀制作(WiFi通信)-含STM32源程序,JAVA上位機與設(shè)計報告-國賽福利
國賽福利四川省一等獎作品-2017-8
含完整的設(shè)計文檔,上位機(JAVA)和下位機(stm32),程序代碼,用WiFi通信


2017年全國大學生電子設(shè)計競賽試題設(shè)計文檔

遠程幅頻特性測試裝置(H題)

【本科組】

摘要:本裝置測量放大器的幅頻特性,并將數(shù)據(jù)繪成直觀的圖線。系統(tǒng)以32位高性能單片機STM32F103為主控制器,由數(shù)字式頻率合成器AD9854產(chǎn)生所需信號,通過鍵盤與OLED顯示屏直觀控制掃頻、點頻等模式與頻率、幅值等參數(shù),產(chǎn)生一路穩(wěn)定幅值的正弦掃頻信號。信號通過自制的0~40dB可調(diào)增益放大器,經(jīng)均值響應(yīng)功率檢波器AD8361檢波后得到直流信號,即放大器輸出信號的幅值信息;再經(jīng)單片機內(nèi)部模/數(shù)轉(zhuǎn)換器采樣,處理計算后,將幅值、頻率信息發(fā)送至Wi-Fi模塊ESP-32,使得局域網(wǎng)內(nèi)的設(shè)備可以獲取幅頻特性數(shù)據(jù)。作品另配有計算機應(yīng)用程序和安卓APP,可以方便地顯示幅頻特性曲線,從而實現(xiàn)放大器的遠程幅頻特性測試。

一 系統(tǒng)方案
1.1 比較與選擇
本系統(tǒng)主要由控制器、信號源模塊、放大器模塊、鍵盤顯示模塊、網(wǎng)絡(luò)模塊、電源模塊組成,下面分別論證這幾個模塊的選擇。
1.1.1 控制器的論證與選擇
方案一:采用51單片機控制。51系列單片機是廉價、易得的微控制器,但由于其采用集中指令結(jié)構(gòu),運行速度不夠可觀。在執(zhí)行大型程序時,51單片機容易顯現(xiàn)出功耗大、不穩(wěn)定的缺點。
方案二:采用FPGA控制。FPGA即現(xiàn)場可編程門陣列,是作為專用集成電路領(lǐng)域中的一種半定制電路而出現(xiàn)的,解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點。FPGA一般來說功耗較低。但在開發(fā)過程中往往需要快速增減一些簡單功能,如串口通信等,而此類功能有可能占用過多的邏輯門資源,因此采用FPGA開發(fā)整個系統(tǒng)則較為不便。
方案三:采用STM32單片機控制。STM32系列單片機具有開發(fā)方便、I/O口數(shù)量多等特點。ARM內(nèi)核使得其運行速度明顯優(yōu)于51系列單片機。STM32F103屬于增強型系列,是同類產(chǎn)品中性能最高的產(chǎn)品。
綜合以上兩種方案與實際情況,選擇方案三。
1.1.2 信號源的論證與選擇
方案一:采用分立元件和中小規(guī)模集成電路構(gòu)成波形發(fā)生器采用RC串并聯(lián)振蕩器生成正弦信號。該方案的優(yōu)點:技術(shù)成熟,可供參考的資料較多。缺點:外圍元器件多,調(diào)試工作量較大,頻率穩(wěn)定度和準確度差,很難滿足頻率變化的范圍要求,更難準確地實現(xiàn)頻率步進的要求。
方案二:利用專用直接數(shù)字合成DDS芯片AD9851實現(xiàn)波形發(fā)生器。AD9851可以產(chǎn)生一個穩(wěn)定的頻率和相位且可數(shù)字化編程的模擬正弦波輸出。但是該芯片理論上可達到70MHz,其實在實際應(yīng)用中,當頻率達到30MHz時,波形就失真了,而且外圍電路較為復雜,需耗費大量時間。
方案三:采用AD9854芯片構(gòu)成信號源。AD9854芯片可產(chǎn)生一高穩(wěn)定的頻率、相位、幅度可編程的正弦和余弦信號,允許輸出的信號頻率高達150MHz,而數(shù)字調(diào)制輸出頻率可達100MHz,滿足項目40M的要求。
綜合以上三種方案,選擇方案三。
1.1.3 放大器模塊的論證與選擇
方案一:選用兩級電壓反饋運算放大器OPA847放大,再由數(shù)字衰減器PE4302衰減。OPA847是寬帶超低噪聲電壓反饋運算放大器,常被用于前級放大,且?guī)捒筛哌_3.9GHz,噪聲極小。數(shù)字衰減器可以實現(xiàn)對DC~4.0GHz信號產(chǎn)生最大31.5dB的衰減,步進為0.5dB,但不可以實現(xiàn)系統(tǒng)增益連續(xù)可變。
方案二:選擇運放AD8009。通過調(diào)AD8009 R1和Rf,實驗發(fā)現(xiàn)可以實現(xiàn)單片運放0~40dB的要求,但是不能滿足項目輸入阻抗600Ω的要求。
方案三:選擇壓控正益放大器VCA824級聯(lián),外加AD690調(diào)節(jié)輸入阻抗,滿足項目要求。
綜合以上三種方案,選擇方案三。
1.1.4 鍵盤與顯示模塊的論證與選擇
(1)鍵盤:
方案一:獨立鍵盤。控制簡單,但是占用單片機IO口資源太多。
方案二:矩陣鍵盤。控制較為復雜,但是占用單片機IO口資源少。
方案三:周立功鍵盤�?刂戚^為復雜,操作點單,但功能強大。
(2)顯示器:
方案一:TFT。功能強大,但是用于控制DDS顯得過于復雜。
方案二:OLED。IIC通信方式,占用單片機IO口資源少,滿足需求。
方案三:12864。操作簡單,但占用單片機IO口資源多而且費電。
綜合以上幾種方案,選擇周立功鍵盤和OLED。
1.1.5 網(wǎng)絡(luò)通信模塊的論證與選擇
方案一:使用ESP-8266作為TCP客戶端,與主機建立一對一通信。ESP-8266常被用作單片機WiFi模塊使用,可以通過串口傳輸AT指令加以控制。
方案二:使用ESP-32建立TCP服務(wù)端,供局域網(wǎng)內(nèi)其他設(shè)備訪問。ESP-32是上海樂鑫公司出品的性能更強的物聯(lián)網(wǎng)模塊,同時也可以單獨作為單片機使用。另外,設(shè)立TCP服務(wù)端,也使得讓電腦客戶端軟件和手機APP同時訪問成為可能。
綜合以上兩種方案,選擇方案二。

1.2 方案描述
根據(jù)上文得出方案:系統(tǒng)以STM32為主控板,以ZLG鍵盤和OLED屏為交互方式,控制DDS AD9854進行掃頻,經(jīng)過自制的放大器,由均值檢波器AD8361讀出幅值信息。幅頻特性數(shù)據(jù)通過ESP-32實現(xiàn)串口透傳,由特別編寫的計算機程序和安卓APP接收和繪制。

二 理論分析與計算2.1 信號發(fā)生器的電路設(shè)計

經(jīng)討論后,我們決定采用DDS AD9854。我們按照官方提供的電路,完成了如下設(shè)計。
圖1 正交掃頻信號源子系統(tǒng)電路原理圖(大圖見附錄)
2.2 放大器設(shè)計

為了達到放大性能、帶寬、輸入阻抗和帶載能力的要求,我們以O(shè)PA690跟隨器為第一級,設(shè)定輸入阻抗600Ω,繼而用兩級VCA824達到信號0~40dB放大的要求。經(jīng)測試,20MHz下,該系統(tǒng)可完成0~44.6dB連續(xù)可調(diào)的要求。
圖2 放大器系統(tǒng)電路原理圖(大圖見附錄)
2.3 頻率特性測試儀器
由于示波器有X Y輸入模式,由單片機DA產(chǎn)生的電壓信息直接輸入通道CH1、CH2,當掃描足夠快時,由于視覺暫留現(xiàn)象,屏幕上便會留下幅頻特性曲線。
三 電路與程序設(shè)計

3.1 電路設(shè)計
圖4系統(tǒng)電路原理圖

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

5 計算機客戶端效果

圖6 安卓客戶端效果


四 測試方案與測試結(jié)果
4.1 測試方案及測試條件
在未帶放大器網(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 測試結(jié)果完整性
              由于篇幅限制,省略了放大器的數(shù)據(jù)。在之后的測量中,獲得了放大器的幅頻特性曲線,并在 RIGOL示波器DS1054上正確顯示:

圖6
4.3 測試結(jié)果分析
測試初步確定了方案總體正確,甚至使幅頻曲線的部分細節(jié)得到了正確顯示。但由于示波器DS1054刷新頻率較慢,因此效果仍未達到最佳狀態(tài)。
附錄1:電路原理圖


圖1   正交掃頻信號源子系統(tǒng)電路原理圖
圖2 放大器系統(tǒng)電路原理圖

附錄1:部分代碼ESP-32主程序代碼
  1. //2017-08-10
  2. //該程序用于ESP-32建立TCP Server并實現(xiàn)串口透傳
  3. //修改自ESP-32庫的Example>WiFi>WiFiTelnetToSerial
  4. //WiFiTelnetToSerial - Example Transparent UART to Telnet Server for ESP32
  5. #include <WiFi.h>
  6. #include <WiFiMulti.h>

  7. WiFiMulti wifiMulti;

  8. //how many clients should be able to telnet to this ESP32
  9. #define MAX_SRV_CLIENTS 3//此處設(shè)置WiFi最大連接數(shù)(請至少允許2個設(shè)備連接,保證電腦端和安卓端同時正常運行)
  10. const char* ssid = "NUEDC2017-H";//SSID
  11. const char* password = "nuedc2017-h";//密碼

  12. WiFiServer server(2323);//設(shè)備端口(TCP Server服務(wù)器與端口:192.168.0.3:2323)
  13. WiFiClient serverClients[MAX_SRV_CLIENTS];
  14. //此處開啟了G16、G17作為串口,此應(yīng)用下可不理會
  15. HardwareSerial Serial1(2);  // UART1/Serial1 pins 16,17

  16. void setup() {
  17.   Serial.begin(9600);//此處應(yīng)與上位機波特率一致
  18.   Serial.println("\nConnecting");

  19.   wifiMulti.addAP(ssid, password);
  20.   //wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
  21.   //wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");

  22.   Serial.println("Connecting Wifi ");
  23.   for (int loops = 10; loops > 0; loops--) {
  24.     if (wifiMulti.run() == WL_CONNECTED) {
  25.       Serial.println("");
  26.       Serial.print("WiFi connected ");
  27.       Serial.print("IP address: ");
  28.       Serial.println(WiFi.localIP());
  29.       break;
  30.     }
  31.     else {
  32.       Serial.println(loops);
  33.       delay(1000);
  34.     }
  35.   }
  36.   if (wifiMulti.run() != WL_CONNECTED) {
  37.     Serial.println("WiFi connect failed");
  38.     delay(1000);
  39.     ESP.restart();
  40.   }

  41.   //start UART and the server
  42.   Serial1.begin(9600);
  43.   server.begin();
  44.   server.setNoDelay(true);

  45.   Serial.print("Ready! Use Telnet ");
  46.   Serial.print(WiFi.localIP());
  47.   Serial.println(":2323 to connect");
  48. }

  49. void loop() {
  50.   uint8_t i;
  51.   if (wifiMulti.run() == WL_CONNECTED) {
  52.     //check if there are any new clients
  53.     if (server.hasClient()){
  54.       for(i = 0; i < MAX_SRV_CLIENTS; i++){
  55.         //find free/disconnected spot
  56.         if (!serverClients[i] || !serverClients[i].connected()){
  57.           if(serverClients[i]) serverClients[i].stop();
  58.           serverClients[i] = server.available();
  59.           if (!serverClients[i]) Serial.println("available broken");//?
  60.           Serial.print("New client: ");
  61.           Serial.print(i); Serial.print(' ');
  62.           Serial.println(serverClients[i].remoteIP());
  63.           break;
  64.         }
  65.       }
  66.       if (i >= MAX_SRV_CLIENTS) {
  67.         //no free/disconnected spot so reject
  68.         server.available().stop();
  69.       }
  70.     }
  71.     //check clients for data
  72.     for(i = 0; i < MAX_SRV_CLIENTS; i++){
  73.       if (serverClients[i] && serverClients[i].connected()){
  74.         if(serverClients[i].available()){
  75.           //get data from the telnet client and push it to the UART
  76.           while(serverClients[i].available()) Serial1.write(serverClients[i].read());
  77.         }
  78.       }
  79.       else {
  80.         if (serverClients[i]) {
  81.           serverClients[i].stop();
  82.         }
  83.       }
  84.     }
  85.     //check UART for data
  86.     if(Serial.available()){
  87.       size_t len = Serial.available();
  88.       uint8_t sbuf[len];
  89.       Serial.readBytes(sbuf, len);
  90.       //push UART data to all connected telnet clients
  91.       for(i = 0; i < MAX_SRV_CLIENTS; i++){
  92.         if (serverClients[i] && serverClients[i].connected()){
  93.           serverClients[i].write(sbuf, len);
  94.           delay(1);
  95.         }
  96.       }
  97.     }
  98.   }
  99.   else {
  100.     Serial.println("WiFi not connected!");
  101.     for(i = 0; i < MAX_SRV_CLIENTS; i++) {
  102.       if (serverClients[i]) serverClients[i].stop();
  103.     }
  104.     delay(1000);
  105.   }
  106. }
復制代碼

stm32單片機下位機源程序如下:

  1. #include "stm32f10x.h"
  2. #include "LED_TEST_VET6.H"
  3. #include "delay.h"
  4. #include "dac.h"
  5. #include "math.h"
  6. #include "adc.h"
  7. #include "usart.h"
  8. #include "AD9854.h"
  9. #include "zlg7290.h"
  10. #include "exti.h"
  11. #include "oled.h"

  12. #define Vppin_up 409
  13. #define Vppin_low 1
  14. #define sweep_step_up 2000
  15. #define sweep_step_low 10
  16. int Vppin100mv[50]={98,98,99,101,100,101,102,103,104,105,
  17.                                         106,107,105,108,108,108,109,109,110,110,
  18.                                         110,111,113,113,113,113,113,113,113,113,
  19.                                         112,111,109,108,107,105,104,103,102,101,
  20.                                         101,101,101,101,101,101,101,104,105,107};

  21. float Vpp_num[50];
  22. char Mode=4;
  23. //PB5 INT ;PB7 SDA; PB6 SCL
  24. float Mhz=1.0;
  25. float Vpp=0;
  26. int Vppin=5;//5~100mv
  27. int sweep_step=1000;//Khz
  28. float sweep_start=1;
  29. float sweep_end=50;
  30.                                        
  31. void sweep(void);
  32. void Test_key(void);
  33. void num_goback(void);
  34. float GetVpp(void);
  35. float GetVpp1(void);
  36. void sweep3(void);
  37. void sweep_100mv(void);
  38. void sweep3_100mv(void);
  39. int main(void)
  40. {               

  41.          
  42.         LED_Init();//初始化
  43.         delay_init();

  44.         OLED_Init();                        //初始化OLED  
  45.         OLED_Clear();  
  46.         Dac1_Init();//DAC通道1初始化        
  47.         Dac2_Init();//DAC通道2初始化        

  48.         EXTIX_Init();
  49.         uart_init(9600);
  50.         AD9854_Init();
  51. //        AD9854_SetSine_double(27000000,1844);
  52.         Adc_Init();
  53.         ZLG7290_Init();
  54.         while(1)
  55.         {
  56.                 if(Mode==1)
  57.         AD9854_SetSine_double(Mhz*1000000,Vppin*10);
  58.                 if(Mode==2)
  59.                         sweep();
  60.                 if(Mode==3)
  61.                         sweep3_100mv();
  62.                 if(Mode==4)
  63.                         sweep_100mv();
  64.         }
  65. }
  66. float GetVpp()//PA1
  67. {        u16 adcx;
  68.         float temp;
  69.         adcx=Get_Adc_Average(ADC_Channel_1,10);
  70.         temp=(float)adcx*(3.3/4096);
  71. return temp;
  72. }        
  73. float GetVpp1()//PA0
  74. {        u16 adcx;
  75.         float temp;
  76.         adcx=Get_Adc_Average(ADC_Channel_0,10);
  77.         temp=(float)adcx*(3.3/4096);
  78. return temp;
  79. }

  80. void sweep()
  81. {
  82. for(Mhz=sweep_start;Mhz<sweep_end;Mhz=sweep_step/1000.0+Mhz)
  83.         {
  84.         AD9854_SetSine_double(Mhz*1000000.0,Vppin*10);
  85.                 delay_ms(10);
  86.         }
  87. for(Mhz=sweep_end;Mhz>sweep_start;Mhz=-sweep_step/1000.0+Mhz)        
  88.         {
  89.         AD9854_SetSine_double(Mhz*1000000.0,Vppin*10);
  90.                 delay_ms(10);
  91.         }
  92. }
  93. void sweep_100mv()
  94. {
  95.         char i=0;
  96.         {
  97.         for(i=1;i<=50;i++)
  98.         {AD9854_SetSine_double(i*1000000.0,Vppin100mv[i-1]*10);
  99.         Vpp=GetVpp();
  100.         printf("A%d,%f\r\n",i,Vpp);
  101.         printf("A%f,%f\r\n",i+0.5,Vpp);        
  102.         OLED_ShowNum(48,4,Vpp,4,16);
  103.         OLED_ShowNum(48,2,i,4,16);
  104.         }
  105.         for(i=50;i>1;i--)
  106.         {AD9854_SetSine_double(i*1000000.0,Vppin100mv[i-1]*10);
  107.         Vpp=GetVpp();
  108.         printf("A%d,%f\r\n",i,Vpp);
  109.         printf("A%f,%f\r\n",i+0.5,Vpp);        
  110.         OLED_ShowNum(48,4,Vpp,4,16);
  111.         OLED_ShowNum(48,2,i,4,16);
  112.         }
  113.         }
  114. }
  115. void sweep3_100mv()
  116. {
  117.         u8 i;
  118.         u8 j;
  119.         {
  120.         for(i=1;i<=50;i++)
  121.         {AD9854_SetSine_double(i*1000000.0,Vppin100mv[i-1]*10);
  122.         Vpp=GetVpp();
  123.         Vpp_num[i-1]=Vpp;
  124.         OLED_ShowNum(48,4,Vpp,4,16);
  125.         OLED_ShowNum(48,2,i,4,16);
  126.         }
  127.         
  128. for(j=0;j<200;j++)
  129. {
  130.         for(i=1;i<50;i++)
  131.         {
  132.         Dac1_Set_Vol(i*66);//PA4
  133.         Dac2_Set_Vol((Vpp_num[i-1]-0.5)*1650);//PA5
  134.         delay_us(100);
  135.         }
  136. }
  137.         
  138. //        for(i=50;i>1;i--)
  139. //        {AD9854_SetSine_double(i*1000000.0,Vppin100mv[i-1]*10);
  140. //        Vpp=GetVpp();
  141. //        Vpp_num[i-1]=Vpp;

  142. //        }
  143. //        for(i=50;i>1;i--)
  144. //        {
  145. //        Dac1_Set_Vol(i*66);//PA4
  146. //        Dac2_Set_Vol((Vpp_num[i-1]-0.5)*1650);//PA5
  147. //        delay_us(100);
  148. //        }
  149.         }
  150. }
  151. void Test_key()
  152. {
  153. u8 KeyValue=0;
  154. u8 RepeatCnt=0;
  155. u8 FnKeyValue=0;
  156.         ZLG7290_ReadReg(ZLG7290_Key,&KeyValue);
  157.         ZLG7290_ReadReg(ZLG7290_RepeatCnt,&RepeatCnt);
  158.         ZLG7290_ReadReg(ZLG7290_FunctionKey,&FnKeyValue);
  159. {                        AD9854_Init();
  160. printf("%d\r\n",KeyValue);
  161. if(Mode==1)//點頻
  162. {
  163.         switch (KeyValue)
  164.         {
  165.         case 4:
  166.                 Mhz++;
  167.                 break;
  168.         case 3:        
  169.                 Mhz--;
  170.                 break;
  171.         case 2:
  172.                 Vppin+=1;
  173.         break;
  174.         case 1:
  175.                 Vppin-=1;
  176.         break;
  177.         
  178.         case 20:
  179.                 Mhz+=10;
  180.         break;
  181.         case 19:
  182.                 Mhz-=10;
  183.         break;
  184.         case 18:
  185.                 Vppin+=10;
  186.         break;
  187.         case 17:
  188.                 Vppin-=10;
  189.         break;
  190.         }

  191.         num_goback();
  192.         OLED_ShowNum(48,2,Mhz,4,16);
  193.         OLED_ShowNum(48,4,Vppin,4,16);
  194. }

  195. if(Mode==2)
  196. {
  197.         if(FnKeyValue==255)
  198.         {
  199.                 switch (KeyValue)
  200.                 {
  201.                 case 4:
  202.                         sweep_step+=10;;
  203.                         break;
  204.                 case 3:        
  205.                         sweep_step-=10;
  206.                         break;
  207.                 case 2:
  208.                         Vppin+=1;
  209.                 break;
  210.                 case 1:
  211.                         Vppin-=1;
  212.                 break;
  213.                 case 20:
  214.                         sweep_step+=100;
  215.                 break;
  216.                 case 19:
  217.                         sweep_step-=100;
  218.                 break;
  219.                 case 18:
  220.                         Vppin+=10;
  221.                 break;
  222.                 case 17:
  223.                         Vppin-=10;
  224.                 break;
  225.                 }
  226.         num_goback();
  227.         OLED_ShowNum(48,2,sweep_step,4,16);
  228.         OLED_ShowNum(48,4,Vppin,4,16);
  229.         }
  230.         if(FnKeyValue==254)//調(diào)范圍
  231.         {        switch (KeyValue)
  232.                 {
  233.                 case 4:
  234.                         sweep_start+=1;
  235.                         break;
  236.                 case 3:        
  237.                         sweep_start-=1;
  238.                         break;
  239.                 case 2:
  240.                         sweep_end+=1;
  241.                 break;
  242.                 case 1:
  243.                         sweep_end-=1;
  244.                 break;
  245.                 case 20:
  246.                         sweep_start+=10;
  247.                 break;
  248.                 case 19:
  249.                         sweep_start-=10;
  250.                 break;
  251.                 case 18:
  252.                         sweep_end+=10;
  253.                 break;
  254.                 case 17:
  255.                         sweep_end-=10;
  256.                 break;
  257.                
  258.                 }        
  259.                 num_goback();
  260.                 OLED_ShowNum(48,6,sweep_start,2,16);        
  261.                 OLED_ShowNum(72,6,sweep_end,2,16);        
  262.         }
  263. }
  264. if(KeyValue>=9&&KeyValue<=12)
  265. {
  266. OLED_Clear();
  267. switch (KeyValue)
  268. {        
  269.         case 12:
  270.                 Mode=1;
  271.                 showCinese_byrow(0,0,0,"45860");
  272.                 showCinese_byrow(0,1,0,"018");
  273.                 showCinese_byrow(0,2,0,"238");
  274.                 OLED_ShowNum(48,2,Mhz,4,16);
  275.                 OLED_ShowNum(48,4,Vppin,4,16);
  276.                 OLED_ShowString(96,2,"Mhz",16);
  277.                 OLED_ShowString(96,4,"mV",16);

  278. …………限于本文篇幅 余下代碼請從51黑下載附件…………

復制代碼



全部資料下載(含完整的源碼與word格式的文檔):
無線幅頻儀設(shè)計資料.7z (4.46 MB, 下載次數(shù): 130) ,求評分鼓勵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
王修宇 發(fā)表于 2019-7-25 20:22
上位機源代碼有嗎 學習一下

參考http://www.torrancerestoration.com/bbs/dpj-96630-1.html




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1