找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4158|回复: 5
打印 上一主题 下一主题
收起左侧

STM32系统示波器设计 C#上位机及下位机源程序,硬件电路图

  [复制链接]
跳转到指定楼层
楼主
用于STM32F103V的示波器制作 。
有2个通道
个人爱好设计都DIY可以用20MHZ这样
专的的200MHZ以上去买现成的。

设计指标:
主控:                    STM32F103ZET6
液晶屏:                  4.3寸TFT480×272  65K彩色LCD显示屏  FSMC
AD:                      12位1MHz采样速率
最高实时取样率:        1Msps  8Bits
取样缓冲器深度:        5K  
垂直灵敏度:            5V,1V,500mV,200mV,100mV,50mV,20mV,10mV;  
水平时基范围:2S,1S,500mS,200mS,100mS,50mS,20mS,10mS,5mS,2mS,1mS,500uS,200uS,100uS,50uS,20uS,10uS,5uS,2uS,1uS
输入阻抗:                ≥1MΩ
最高输入电压:            30Vpp
耦合方式:                AC/DC
触发功能:                实现自动、常规、单次触发方式 ,上升或下降边沿触发  
参数计算:                频率、周期、占空比、交流峰-峰值、平均值
触发电平:                触发电平高低位置可调,触发时基位置可调
实现RUN/STOP功能

功能预留:
1、波形发生器:使用STM32一路DA实现正弦,三角波,方波输出。 任意一种波形幅值在
               0-3.3V任意可调、频率在一定范围任意可调、方波占空比可调。调节选项
               可以通过触摸屏完成设置。
2、SD卡存储: SD卡波形存储输出,能够对当前屏幕截屏,以JPG格式存储在SD卡上。能够存储1S内的波形数据,可以随时调用查看。
3、数据传输:  用C#编写上位机,通过串口完成对下位机的控制。初步功能为:(1)实现STOP/RUN功能(2)输出波形电压、时间参数(3)控制截屏(4)控制波形发生器(5)其他
4、图形接口:  完成UCGUI的移植和使用工作。
5、远期计划:  添加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、被测信号的各种参数屏幕显示,包括频率、电压峰峰值等。

硬件电路
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)

Multisim原理图如下(仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /*------------------------------------------------------------------------------------
  2.                                      STM32+UCOS+UCGUI示波器
  3.            
  4.                                                        任务列表
  5.            +---------------------+-------------+-----------+
  6.            |      任务名称       | 任务优先级  |  任务堆栈 |
  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. 时间: 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.                                 声明任务栈
  44. UCOSII的任务堆栈没有8字节对齐,在声明任务堆
  45. 栈时,强制8字节对齐就可以了,系统默认是4字节
  46. 对齐.否则sprintf时会出问题,系统会崩溃.
  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值,坐标值
  59. extern void BSP_Init(void);

  60. extern  WaveType    WaveInfo;                          //波形参数
  61. extern  WaveMode    WaveCtrl;                          //控制参数
  62. extern  FG_WaveType FG_WaveInfo;              //信号发生器参数
  63. /*-----------------------------------------
  64.                             开始任务
  65. ------------------------------------------*/
  66. void Task_Start(void *pdata)
  67. {
  68.           pdata = pdata;
  69.          BSP_Init();                //完成片上外设的初始化
  70.          OSStatInit();                //初始化统计任务
  71.          
  72.          while(1)
  73.          {         
  74. //                  ShowWelcomeScreen();
  75. //                 OSTimeDlyHMSM(0,0,3,0);
  76.                   /*触摸屏任务*/
  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.         /*实时时钟任务*/
  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卡任务*/
  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任务*/
  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.                 /*主任务*/
  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);                            //蜂鸣器响起提示系统启动成功
  130.         OSTaskSuspend(OS_PRIO_SELF);   //挂起Task_Start任务               
  131.          }
  132. }
  133. /*-----------------------------------------
  134.                             触摸屏任务
  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);         //计算触摸坐标
  143.                 TouchEventDetected();                         //检测触摸事件
  144.                 BOARD_LED1 = !BOARD_LED1;
  145.                 OSTimeDlyHMSM(0,0,0,100);
  146.         }
  147. }
  148. /*-----------------------------------------
  149.                             Real Time Clock任务
  150. ------------------------------------------*/
  151. void Task_RTC(void *pdata)
  152. {
  153.         pdata = pdata;        
  154.         while(1)
  155.         {        
  156.                 u8 AlarmTemp;
  157.                 GetFrequence();                   //获取时间参数并显示
  158.                 AlarmTemp = GetTempSensor();        
  159.                
  160.                 if(AlarmTemp>60)           //芯片保护温度报警定值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.                              主任务
  171. ------------------------------------------*/
  172. void Task_Main(void *pdata)
  173. {        
  174.         pdata = pdata;                                       
  175.         WaveCtrl.TimeBase = 99;                        //上电默认时基99
  176.         WaveCtrl.Gain = 3;                                //上电默认增益号3
  177.         while(1)
  178.         {
  179. //                TaskStackChack();                        //是否堆栈使用情况检查
  180.                 GetWaveADCValue();                        //核心函数
  181.                 IWDG_Feed();                               //1000ms内喂狗
  182.                 BOARD_LED2 = !BOARD_LED2;
  183.                 OSTimeDlyHMSM(0,0,0,50);
  184.         }        
  185. }
  186. /*-----------------------------------------
  187.                             SD任务
  188. ------------------------------------------*/
  189. void Task_SD(void *pdata)
  190. {
  191.         pdata = pdata;
  192.         while(1)
  193.         {
  194.                 SendDataToPC();                                //发送编码数据到上位机
  195.                  OSTimeDlyHMSM(0,0,0,999);
  196.         }
  197. }
  198. /*-----------------------------------------
  199.                             GUI任务
  200. ------------------------------------------*/

  201. void Task_GUI(void *pdata)
  202. {
  203.         pdata = pdata;
  204.         DrawControlPanel();
  205.         while(1)
  206.         {        
  207.                 DisplayWaveInfo();                          //显示参数        
  208.                 OSTimeDlyHMSM(0,0,0,500);
  209.         }
  210. }
复制代码

所有资料51hei提供下载:
上位机exe文件以及上位机源码.zip (6.59 MB, 下载次数: 112)
设计文档.zip (60.19 KB, 下载次数: 76)
硬件设计.zip (2.65 MB, 下载次数: 78)
程序.7z (1.07 MB, 下载次数: 78)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏17 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:117977 发表于 2022-5-5 16:56 | 只看该作者
PCB看起来很丑 功能缺很强大
回复

使用道具 举报

板凳
ID:203661 发表于 2022-5-14 09:55 | 只看该作者
上位机上个图看一下效果啊
回复

使用道具 举报

地板
ID:1063483 发表于 2023-5-5 20:33 | 只看该作者
这是本站最好的、完整的代码之一,谢谢!
回复

使用道具 举报

5#
ID:1063483 发表于 2023-5-5 20:36 | 只看该作者
C#上位机,刚刚下载,谢谢!

上位机图.PNG (92.46 KB, 下载次数: 67)

上位机运行图

上位机运行图
回复

使用道具 举报

6#
ID:291668 发表于 2023-5-7 15:01 | 只看该作者
高人的东西,一直值得学习借鉴!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表