找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 5305|回復(fù): 5
收起左側(cè)

STM32系統(tǒng)示波器設(shè)計(jì) C#上位機(jī)及下位機(jī)源程序,硬件電路圖

  [復(fù)制鏈接]
ID:478635 發(fā)表于 2019-7-7 15:15 | 顯示全部樓層 |閱讀模式
用于STM32F103V的示波器制作 。
有2個(gè)通道
個(gè)人愛好設(shè)計(jì)都DIY可以用20MHZ這樣
專的的200MHZ以上去買現(xiàn)成的。

設(shè)計(jì)指標(biāo):
主控:                    STM32F103ZET6
液晶屏:                  4.3寸TFT480×272  65K彩色LCD顯示屏  FSMC
AD:                      12位1MHz采樣速率
最高實(shí)時(shí)取樣率:        1Msps  8Bits
取樣緩沖器深度:        5K  
垂直靈敏度:            5V,1V,500mV,200mV,100mV,50mV,20mV,10mV;  
水平時(shí)基范圍:2S,1S,500mS,200mS,100mS,50mS,20mS,10mS,5mS,2mS,1mS,500uS,200uS,100uS,50uS,20uS,10uS,5uS,2uS,1uS
輸入阻抗:                ≥1MΩ
最高輸入電壓:            30Vpp
耦合方式:                AC/DC
觸發(fā)功能:                實(shí)現(xiàn)自動(dòng)、常規(guī)、單次觸發(fā)方式 ,上升或下降邊沿觸發(fā)  
參數(shù)計(jì)算:                頻率、周期、占空比、交流峰-峰值、平均值
觸發(fā)電平:                觸發(fā)電平高低位置可調(diào),觸發(fā)時(shí)基位置可調(diào)
實(shí)現(xiàn)RUN/STOP功能

功能預(yù)留:
1、波形發(fā)生器:使用STM32一路DA實(shí)現(xiàn)正弦,三角波,方波輸出。 任意一種波形幅值在
               0-3.3V任意可調(diào)、頻率在一定范圍任意可調(diào)、方波占空比可調(diào)。調(diào)節(jié)選項(xiàng)
               可以通過觸摸屏完成設(shè)置。
2、SD卡存儲(chǔ): SD卡波形存儲(chǔ)輸出,能夠?qū)Ξ?dāng)前屏幕截屏,以JPG格式存儲(chǔ)在SD卡上。能夠存儲(chǔ)1S內(nèi)的波形數(shù)據(jù),可以隨時(shí)調(diào)用查看。
3、數(shù)據(jù)傳輸:  用C#編寫上位機(jī),通過串口完成對(duì)下位機(jī)的控制。初步功能為:(1)實(shí)現(xiàn)STOP/RUN功能(2)輸出波形電壓、時(shí)間參數(shù)(3)控制截屏(4)控制波形發(fā)生器(5)其他
4、圖形接口:  完成UCGUI的移植和使用工作。
5、遠(yuǎn)期計(jì)劃:  添加FFT等等
1、采樣速率:600Sa/s,6kSa/s ,60kSa/s,600kSa/s ,3MSa/s,,6MSa/s,30MSa/s ,60MSa/s
2、水平掃速:250 ns*、500ns、1μs、5 μs、10μs、50μs、500 μs、5ms 、50ms
3、垂直電壓靈敏度:10mV/div, 20mV/div, 50mV/div, 0.1V/div, 0,2V/div, 0.5V/div, 1V/div,
2V/div, 5V/div
4、被測信號(hào)的各種參數(shù)屏幕顯示,包括頻率、電壓峰峰值等。

硬件電路
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png 0.png
Multisim原理圖如下(仿真工程文件可到本帖附件中下載)
0.png

單片機(jī)源程序如下:
  1. /*------------------------------------------------------------------------------------
  2.                                      STM32+UCOS+UCGUI示波器
  3.            
  4.                                                        任務(wù)列表
  5.            +---------------------+-------------+-----------+
  6.            |      任務(wù)名稱       | 任務(wù)優(yōu)先級(jí)  |  任務(wù)堆棧 |
  7.            +---------------------+-------------+-----------+           
  8.            |   TASK_MAIN         |     11      |   2048    |
  9.            +---------------------+-------------+-----------+
  10.            |   TASK_RTC                |     12      |    512    |
  11.            +---------------------+-------------+-----------+
  12.            |   TASK_SD                 |     13      |    512    |
  13.            +---------------------+-------------+-----------+
  14.            |   TASK_TOUCHSCREEN         |     14      |    512    |
  15.            +---------------------+-------------+-----------+
  16.            |   TASK_GUI                          |     15      |   1024    |
  17.            +---------------------+-------------+-----------+
  18.            |   TASK_START             |     5       |    64     |
  19.            +---------------------+-------------+-----------+
  20.            

  21. 時(shí)間: 2013年11月13日       BoX編寫                                
  22. -------------------------------------------------------------------------------------*/  
  23. #include "ucos_ii.h"   
  24. #include "stdio.h"
  25. #include "app.h"
  26. #include "pincfg.h"
  27. #include "delay.h"
  28. #include "tft_api.h"
  29. #include "oscilloscope.h"
  30. #include "indkey.h"
  31. #include "timer.h"
  32. #include "EXTI.H"
  33. #include "adc.h"
  34. #include "iwdg.h"
  35. #include "tsc2046.h"

  36. #include "task_main.h"
  37. #include "task_gui.h"
  38. #include "task_rtc.h"
  39. #include "task_sd.h"
  40. #include "task_touchscreen.h"

  41. #include "GUI.h"
  42. /*-----------------------------------------
  43.                                 聲明任務(wù)棧
  44. UCOSII的任務(wù)堆棧沒有8字節(jié)對(duì)齊,在聲明任務(wù)堆
  45. 棧時(shí),強(qiáng)制8字節(jié)對(duì)齊就可以了,系統(tǒng)默認(rèn)是4字節(jié)
  46. 對(duì)齊.否則sprintf時(shí)會(huì)出問題,系統(tǒng)會(huì)崩潰.
  47. ------------------------------------------*/
  48. __align(8) OS_STK Task_TouchScreen_Stk[TASK_TOUCHSCREEN_STK_SIZE];
  49. __align(8) OS_STK Task_Main_Stk[TASK_MAIN_STK_SIZE];
  50. __align(8) OS_STK Task_RTC_Stk[TASK_RTC_STK_SIZE];
  51. __align(8) OS_STK Task_SD_Stk [TASK_SD_STK_SIZE];
  52. __align(8) OS_STK Task_GUI_Stk[TASK_GUI_STK_SIZE];
  53. /*-----------------------------------------
  54.                             聲明變量
  55. ------------------------------------------*/
  56. extern u16  ADC1_DMA_Value;
  57. extern u8   LCD_Buffer[LCD_BUFFER_SIZE];
  58. extern u16  Tpx,Tpy,ZBX,ZBY;                  //觸摸屏AD值,坐標(biāo)值
  59. extern void BSP_Init(void);

  60. extern  WaveType    WaveInfo;                          //波形參數(shù)
  61. extern  WaveMode    WaveCtrl;                          //控制參數(shù)
  62. extern  FG_WaveType FG_WaveInfo;              //信號(hào)發(fā)生器參數(shù)
  63. /*-----------------------------------------
  64.                             開始任務(wù)
  65. ------------------------------------------*/
  66. void Task_Start(void *pdata)
  67. {
  68.           pdata = pdata;
  69.          BSP_Init();                //完成片上外設(shè)的初始化
  70.          OSStatInit();                //初始化統(tǒng)計(jì)任務(wù)
  71.          
  72.          while(1)
  73.          {         
  74. //                  ShowWelcomeScreen();
  75. //                 OSTimeDlyHMSM(0,0,3,0);
  76.                   /*觸摸屏任務(wù)*/
  77.                  
  78.                    OSTaskCreateExt(Task_TouchScreen,
  79.                             (void *)0,
  80.                             &Task_TouchScreen_Stk[TASK_TOUCHSCREEN_STK_SIZE - 1],
  81.                             TASK_TOUCHSCREEN_PRIO,
  82.                             TASK_TOUCHSCREEN_PRIO,
  83.                             &Task_TouchScreen_Stk[0],
  84.                             TASK_TOUCHSCREEN_STK_SIZE,
  85.                             (void *)0,
  86.                             OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
  87.                
  88.         /*實(shí)時(shí)時(shí)鐘任務(wù)*/
  89.         OSTaskCreateExt(Task_RTC,
  90.                             (void *)0,
  91.                             &Task_RTC_Stk[TASK_RTC_STK_SIZE - 1],
  92.                             TASK_RTC_PRIO,
  93.                             TASK_RTC_PRIO,
  94.                             &Task_RTC_Stk[0],
  95.                             TASK_RTC_STK_SIZE,
  96.                             (void *)0,
  97.                             OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
  98.         /*SD卡任務(wù)*/
  99.         OSTaskCreateExt(Task_SD,
  100.                             (void *)0,
  101.                             &Task_SD_Stk[TASK_SD_STK_SIZE - 1],
  102.                             TASK_SD_PRIO,
  103.                             TASK_SD_PRIO,
  104.                             &Task_SD_Stk[0],
  105.                             TASK_SD_STK_SIZE,
  106.                             (void *)0,
  107.                             OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
  108.                 /*GUI任務(wù)*/
  109.                 OSTaskCreateExt(Task_GUI,
  110.                             (void *)0,
  111.                             &Task_GUI_Stk[TASK_GUI_STK_SIZE - 1],
  112.                             TASK_GUI_PRIO,
  113.                             TASK_GUI_PRIO,
  114.                             &Task_GUI_Stk[0],
  115.                             TASK_GUI_STK_SIZE,
  116.                             (void *)0,
  117.                             OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

  118.                 /*主任務(wù)*/
  119.                 OSTaskCreateExt(Task_Main,
  120.                             (void *)0,
  121.                             &Task_Main_Stk[TASK_MAIN_STK_SIZE - 1],
  122.                             TASK_MAIN_PRIO,
  123.                             TASK_MAIN_PRIO,
  124.                             &Task_Main_Stk[0],
  125.                             TASK_MAIN_STK_SIZE,
  126.                             (void *)0,
  127.                             OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
  128.               
  129. //                PinCfg_Beep(1);                            //蜂鳴器響起提示系統(tǒng)啟動(dòng)成功
  130.         OSTaskSuspend(OS_PRIO_SELF);   //掛起Task_Start任務(wù)               
  131.          }
  132. }
  133. /*-----------------------------------------
  134.                             觸摸屏任務(wù)
  135. ------------------------------------------*/         
  136. void Task_TouchScreen(void *pdata)
  137. {
  138.         pdata = pdata;
  139.         while(1)
  140.         {        
  141.                 TP_Read(&Tpx,&Tpy);
  142.                 TP_ADtoZB(&Tpx,&Tpy,&ZBX,&ZBY);         //計(jì)算觸摸坐標(biāo)
  143.                 TouchEventDetected();                         //檢測觸摸事件
  144.                 BOARD_LED1 = !BOARD_LED1;
  145.                 OSTimeDlyHMSM(0,0,0,100);
  146.         }
  147. }
  148. /*-----------------------------------------
  149.                             Real Time Clock任務(wù)
  150. ------------------------------------------*/
  151. void Task_RTC(void *pdata)
  152. {
  153.         pdata = pdata;        
  154.         while(1)
  155.         {        
  156.                 u8 AlarmTemp;
  157.                 GetFrequence();                   //獲取時(shí)間參數(shù)并顯示
  158.                 AlarmTemp = GetTempSensor();        
  159.                
  160.                 if(AlarmTemp>60)           //芯片保護(hù)溫度報(bào)警定值60℃
  161.                         BEEP = 1;
  162.                 else if(AlarmTemp>50)
  163.                         PinCfg_Beep(3);           //接近紅線短鳴3聲
  164.                 else
  165.                         BEEP = 0;
  166.                  OSTimeDlyHMSM(0,0,1,500);
  167.         }         
  168. }
  169. /*-----------------------------------------
  170.                              主任務(wù)
  171. ------------------------------------------*/
  172. void Task_Main(void *pdata)
  173. {        
  174.         pdata = pdata;                                       
  175.         WaveCtrl.TimeBase = 99;                        //上電默認(rèn)時(shí)基99
  176.         WaveCtrl.Gain = 3;                                //上電默認(rèn)增益號(hào)3
  177.         while(1)
  178.         {
  179. //                TaskStackChack();                        //是否堆棧使用情況檢查
  180.                 GetWaveADCValue();                        //核心函數(shù)
  181.                 IWDG_Feed();                               //1000ms內(nèi)喂狗
  182.                 BOARD_LED2 = !BOARD_LED2;
  183.                 OSTimeDlyHMSM(0,0,0,50);
  184.         }        
  185. }
  186. /*-----------------------------------------
  187.                             SD任務(wù)
  188. ------------------------------------------*/
  189. void Task_SD(void *pdata)
  190. {
  191.         pdata = pdata;
  192.         while(1)
  193.         {
  194.                 SendDataToPC();                                //發(fā)送編碼數(shù)據(jù)到上位機(jī)
  195.                  OSTimeDlyHMSM(0,0,0,999);
  196.         }
  197. }
  198. /*-----------------------------------------
  199.                             GUI任務(wù)
  200. ------------------------------------------*/

  201. void Task_GUI(void *pdata)
  202. {
  203.         pdata = pdata;
  204.         DrawControlPanel();
  205.         while(1)
  206.         {        
  207.                 DisplayWaveInfo();                          //顯示參數(shù)        
  208.                 OSTimeDlyHMSM(0,0,0,500);
  209.         }
  210. }
復(fù)制代碼

所有資料51hei提供下載:
上位機(jī)exe文件以及上位機(jī)源碼.zip (6.59 MB, 下載次數(shù): 118)
設(shè)計(jì)文檔.zip (60.19 KB, 下載次數(shù): 79)
硬件設(shè)計(jì).zip (2.65 MB, 下載次數(shù): 82)
程序.7z (1.07 MB, 下載次數(shù): 84)
回復(fù)

使用道具 舉報(bào)

ID:117977 發(fā)表于 2022-5-5 16:56 | 顯示全部樓層
PCB看起來很丑 功能缺很強(qiáng)大
回復(fù)

使用道具 舉報(bào)

ID:203661 發(fā)表于 2022-5-14 09:55 | 顯示全部樓層
上位機(jī)上個(gè)圖看一下效果啊
回復(fù)

使用道具 舉報(bào)

ID:1063483 發(fā)表于 2023-5-5 20:33 | 顯示全部樓層
這是本站最好的、完整的代碼之一,謝謝!
回復(fù)

使用道具 舉報(bào)

ID:1063483 發(fā)表于 2023-5-5 20:36 | 顯示全部樓層
C#上位機(jī),剛剛下載,謝謝!

上位機(jī)運(yùn)行圖

上位機(jī)運(yùn)行圖
回復(fù)

使用道具 舉報(bào)

ID:291668 發(fā)表于 2023-5-7 15:01 | 顯示全部樓層
高人的東西,一直值得學(xué)習(xí)借鑒!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表