找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23775|回复: 39
收起左侧

基于STM32虚拟示波器的制作

  [复制链接]
ID:184230 发表于 2017-5-7 11:25 | 显示全部楼层 |阅读模式
基于STM32虚拟示波器,有兴趣可以看看,附件里面包含全部的制作资料
0.png

1.  分析仪功能介绍

    以“低成本和高性能”为设计思想,借助虚拟仪器的概念和高速的数字信号处理算法将

传统的函数发生器、示波器、数据记录仪、频率计、谱分析仪以及滤波器设计和仿真等功能

高度集成、统一平台方便使用。

    软件环境支持声卡、USB          模块和虚拟仿真,三种模式。声卡模式,可以借助电脑的声

卡来完成对音频范围内信号的分析和处理;USB                    模块,可以完成对带宽允许内的信号的分

析和处理;其中演示模式采用软件模拟来实现所有的功能,便于教学和理论的演示。

    公开软件通信协议,可以按照协议将自己的硬件加入我们的软件环境,使用所有的分析

功能。


函数发生器

    支持产生“正弦波”、“三角波”、“矩形波”、“上锯齿波”、“下锯齿波”、“白噪声”和“合

成波形”,并提供峰值、频率、输出相位差的调整功能。

    波形文件输出,可以支持“正弦波”、“三角波”、“矩形波”、“上锯齿波”、“下锯齿波”、

“白噪声”和“合成波形”,提供峰值、频率、输出相位差的调整功能,支持以wav、txt、

hex 和mif 文件形式的输出。



示波器/谱分析仪

    可以工作在“声卡”、“USB          模块”、“仿真”和“串口捕获”四种模式。支持任意多画

面的同时显示,便于波形的多样分析;支持输入波形硬件和软件触发;支持输入波形的插值

和等效采样;支持输入波形的“相加”、“相减”和“相乘”合成;支持对输入波形加“矩形

窗”、“三角窗”、“海明窗”、“汉宁窗”和“布莱克曼窗”;支持对输入波形的滤波处理; 支

持对输入波形的“李萨茹图形”、“幅频”、“相频”、“对数幅频”、“自功率谱”、“对数自功率

谱”、“自相关”和“互相关”的分析。


0.png 0.png


说明:本协议中B 代表 bit,即8B=1 字节

1.重启序列  

   改序列用于整个下位机的重启,收到该序列后,需重新握手,其过程如下:  

   PC ---------->0xff,0xff,0xff,0xff,0xff,0x11,0x22,0x33,0x44,0x55

                         0xff,0xff,0xff,0xff,0xff,0x11,0x22,0x33,0x44,0x55<-------------CE

2.握手  

   握手用于上位机和下位机的相互识别过程。其过程如下:  

    PC ---------->XX XX XX XX XX (5 个随机数)

                                  XX XX XX XX XX    (5 个随机数)  <-------------CE

    PC---------->XX XX XX XX XX XX XX XX XX XX   (上面10 个随机数)

                                   版本信息                      <-------------CE

    PC---------->             AA

                              (握手成功)            55                <-------------CE



    版本信息(32B):  

    static const unsigned char banben[]=  

          {  ‘Y’,’i’,’X’,’i’,’n’,’g’,’d’,’i’,’a’,’n’,’z’,‘i’, 0, 0, 0, 0,  

             ‘S’,’t’,’u‘,’-’,’0’ ‘.’, ‘1’, 0, 0, 0, 0, 0, 0, 0, 0, 0,  

           };  



3.控制  

    控制协议用于PC 控制下位机工作和获得一些必要的信息。包含两种格式,第一种:“PC

控制特定通道”用于 PC 控制通道 ID 指定的下位机通道;第二种:“PC 控制所有通道”用

于 PC  控制下位机中支持的所有通道。例如发送 0x01,0x01,0x00 表示开启通道 0x01;发送

0xff,0x12,0x00 表示要求下位机的所有通道开始采集数据,并上传。

    需要说明的是,假如你有两个通道,则这两个通道的ID,默认为0x01 和0x02。PC 就

用这两个ID 两控制下位机响应的通道。



3.1 控制信息格式

     PC 控制特定通道:
      通道ID(8B)         控制码(8B)          控制信息(32B)        附加信息

     PC 控制所有通道:

       通道ID   (0xFF)    控制码(8B)         控制信息(32B)         附加信息

3.2 控制码

    开启                       控制码  01

    关闭                       控制码  10

    通道数                      控制码  02

    采样位数                     控制码  04

    采样符号                     控制码  08

    采集并上传数据                  控制码  12

3.3 CE 应答信息格式:

      通道ID(8B)           应答码(8B)      应答信息(32B)          附加信息

    成功                   应答码  01

    失败                   应答码  10

例如:

    通道数 控制码 02       回复信息:        0xFF(8B)       0x01(8B)     0x00000002(32B)

                                通道ID:所有通道       应答码:成功         应答信息:2 个通道

    采样位数 控制码  04 回复信息:             0xFF(8B)       0x01(8B)     0x00000008(32B)

                                通道ID:所有通道       应答码:成功         应答信息:8 位

    采样符号 控制码  08 回复信息: 0xFF(8B)                 0x01(8B)     0x00000001(32B)

                         通道ID:所有通道      应答码:成功      应答信息:有符号 1,无符号0

4.数据传输  

数据传输格式(CE---->PC)

通道数N(8B)     放大倍数  (N *32B)    偏置  (N *32B)    数据长度32B)        数据(n*8B)

    下位机传输采集数据的格式,通道数N 表示这次传输中的通道个数,N 个通道ID 的表

示后面的数据,各个通道的排列顺序,放大倍数,表示这次数据 N  个通道的每个的放大倍

数是多少。数据长度表示后面有多少字节数据。


例如:

0x02       0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x00

两个通道        通道 0x01 放大 1 倍  通道 0x02 放大2 倍          通道 0x01 偏置

0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00

   通道 0x01 偏置           256 字节数据

    0x11          0xA3             0x12       0x43………

通道 0x01 数据  通道0x02 数据  通道 0x01 数据  通道0x02 数据

  1. /*
  2. * Copyright (c) 2010 仪星电子
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * as published by the Free Software Foundation; either version 2
  7. * of the License, or (at your option) any later version.

  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. * GNU General Public License for more details.

  12. * You should have received a copy of the GNU General Public License
  13. * along with this program; if not, write to the Free Software
  14. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  15. */

  16. /*
  17. * 著作权所有(C) 2010 仪星电子
  18. *
  19. * 本程序为自由软件;您可依据自由软件基金会所发表的GNU通用公共授权条款规定,
  20. * 就本程序再为发布与/或修改;无论您依据的是本授权的第二版或(您自行选择的)
  21. * 任一日后发行的版本。

  22. * 本程序是基于使用目的而加以发布,然而不负任何担保责任;亦无对适售性或特定
  23. * 目的适用性所为的默示性担保。详情请参照GNU通用公共授权。

  24. * 您应已收到附随于本程序的GNU通用公共授权的副本;如果没有,请写信至自由软件
  25. * 基金会:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA。

  26. * Email yixingdianzi@126.com
  27. * Email/MSN yixingdianzi@hotmail.com
  28. * QQ 648887464
  29. */

  30. /******************** (C) COPYRIGHT 2009 STMicroelectronics ********************
  31. * File Name          : main.c
  32. * Author             : MCD Application Team
  33. * Version            : V3.1.0
  34. * Date               : 10/30/2009
  35. * Description        : Virtual Com Port Demo main file
  36. ********************************************************************************
  37. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  38. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  39. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  40. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  41. * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  42. * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  43. *******************************************************************************/

  44. /* Includes ------------------------------------------------------------------*/
  45. #include "stm32f10x.h"
  46. #include "stm32f10x_gpio.h"
  47. #include "usb_lib.h"
  48. #include "usb_desc.h"
  49. #include "usb_pwr.h"
  50. #include "qdmx_usb.h"
  51. #include "qdmx_adc.h"

  52. #define SEND 32

  53. /* Private typedef -----------------------------------------------------------*/
  54. /* Private define ------------------------------------------------------------*/
  55. /* Private macro -------------------------------------------------------------*/
  56. /* Private variables ---------------------------------------------------------*/
  57. /* Extern variables ----------------------------------------------------------*/
  58. extern __IO uint32_t count_in;
  59. extern uint8_t Controla_a;
  60. extern uint8_t Controla_b;

  61. /* Private function prototypes -----------------------------------------------*/
  62. /* Private functions ---------------------------------------------------------*/
  63. void Set_System(void);
  64. void Callback(uint8_t *p);
  65. void Delay(__IO uint32_t nCount);
  66. void GPIO_configure(void);                                       
  67. /*******************************************************************************
  68. * Function Name  : main.
  69. * Description    : Main routine.                                
  70. * Input          : None.
  71. * Output         : None.
  72. * Return         : None.
  73. *******************************************************************************/
  74. int main(void)
  75. {  
  76.         vu8 s;
  77.         /*设置系统时钟*/
  78.         Set_System();
  79.         
  80.         /*初始化USB模块*/  
  81.         Set_USBClock();
  82.         USB_Interrupts_Config();
  83.         USB_Init();
  84.         /*初始化AD模块*/
  85.         m_adc_clk_config();
  86.           m_adc_gpio_config();
  87.           m_adc_Interrupts_Config();
  88.           m_adc_init();

  89.         /*初始化GPIO引脚作为放大控制引脚*/
  90.         GPIO_configure();
  91.                                           
  92.           count_in=0;
  93.         /*默认初始值为放大1倍*/
  94.         GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  95.         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  96.         GPIO_ResetBits(GPIOA,GPIO_Pin_2);

  97.         GPIO_ResetBits(GPIOB,GPIO_Pin_12);
  98.         GPIO_ResetBits(GPIOB,GPIO_Pin_13);
  99.         GPIO_ResetBits(GPIOB,GPIO_Pin_14);

  100.           while (1)
  101.           {                 
  102.           }
  103. }

  104. void GPIO_configure(void)
  105. {
  106.         GPIO_InitTypeDef GPIO_InitStructure;

  107.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
  108.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
  109.         
  110.         RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
  111.         RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);               

  112.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
  113.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  114.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  115.           GPIO_Init(GPIOB, &GPIO_InitStructure);

  116.         
  117.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
  118.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  119.           GPIO_Init(GPIOA, &GPIO_InitStructure);
  120. }

  121. void Delay(__IO uint32_t nCount)
  122. {
  123.   for(; nCount != 0; nCount--);
  124. }


  125. void Callback(uint8_t *p)
  126. {
  127.         if (GetENDPOINT(ENDP1) & EP_DTOG_RX)
  128.         {
  129.                    FreeUserBuffer(ENDP1, EP_DBUF_IN);
  130.                    UserToPMABufferCopy((uint8_t*) p, ENDP1_TX1ADDR, SEND);
  131.                    SetEPDblBuf1Count(ENDP1,EP_DBUF_IN,SEND);
  132.         }
  133.         else
  134.         {
  135.                    FreeUserBuffer(ENDP1, EP_DBUF_IN);
  136.                    UserToPMABufferCopy((uint8_t*) p, ENDP1_TX0ADDR, SEND);
  137.                    SetEPDblBuf0Count(ENDP1,EP_DBUF_IN,SEND);
  138.         }
  139. }

  140. #ifdef USE_FULL_ASSERT
  141. /*******************************************************************************
  142. * Function Name  : assert_failed
  143. * Description    : Reports the name of the source file and the source line number
  144. *                  where the assert_param error has occurred.
  145. * Input          : - file: pointer to the source file name
  146. *                  - line: assert_param error line source number
  147. * Output         : None
  148. * Return         : None
  149. *******************************************************************************/
  150. void assert_failed(uint8_t* file, uint32_t line)
  151. {
  152.   /* User can add his own implementation to report the file name and line number,
  153.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  154.   /* Infinite loop */
  155.   while (1)
  156.   {}
  157. }
  158. #endif

  159. /*******************************************************************************
  160. * Function Name  : Set_System
  161. * Description    : Configures Main system clocks & power
  162. * Input          : None.
  163. * Return         : None.
  164. *******************************************************************************/
  165. void Set_System(void)
  166. {
  167.   ErrorStatus HSEStartUpStatus;
  168.   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
  169.   /* RCC system reset(for debug purpose) */
  170.   RCC_DeInit();

  171.   /* Enable HSE */
  172.   RCC_HSEConfig(RCC_HSE_ON);

  173.   /* Wait till HSE is ready */
  174.   HSEStartUpStatus = RCC_WaitForHSEStartUp();

  175.   if (HSEStartUpStatus == SUCCESS)
  176.   {
  177.     /* Enable Prefetch Buffer */
  178.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  179.     /* Flash 2 wait state */
  180.     FLASH_SetLatency(FLASH_Latency_2);

  181.     /* HCLK = SYSCLK */
  182.     RCC_HCLKConfig(RCC_SYSCLK_Div1);
  183.   
  184.     /* PCLK2 = HCLK */
  185.     RCC_PCLK2Config(RCC_HCLK_Div1);

  186.     /* PCLK1 = HCLK/2 */
  187.     RCC_PCLK1Config(RCC_HCLK_Div2);

  188. #ifdef STM32F10X_CL
  189.     /* Configure PLLs *********************************************************/
  190.     /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
  191.     RCC_PREDIV2Config(RCC_PREDIV2_Div5);
  192.     RCC_PLL2Config(RCC_PLL2Mul_8);

  193.     /* Enable PLL2 */
  194.     RCC_PLL2Cmd(ENABLE);

  195.     /* Wait till PLL2 is ready */
  196.     while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
  197.     {}

  198.     /* PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */
  199.     RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
  200.     RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
  201. #else
  202.     /* PLLCLK = 8MHz * 9 = 72 MHz */
  203.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  204. #endif

  205.     /* Enable PLL */
  206.     RCC_PLLCmd(ENABLE);

  207.     /* Wait till PLL is ready */
  208.     while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  209.     {
  210.     }

  211.     /* Select PLL as system clock source */
  212.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  213.     /* Wait till PLL is used as system clock source */
  214.     while(RCC_GetSYSCLKSource() != 0x08)
  215.     {
  216.     }
  217.   }
  218.   else
  219.   { /* If HSE fails to start-up, the application will have wrong clock configuration.
  220.        User can add here some code to deal with this error */   

  221.     /* Go to infinite loop */
  222.     while (1)
  223.     {
  224.     }
  225.   }

  226. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

资料下载:


STM32F103C8源工程.7z

236.57 KB, 下载次数: 314, 下载积分: 黑币 -5

多功能虚拟信号分析仪.rar

1.47 MB, 下载次数: 221, 下载积分: 黑币 -5

驱动.rar

2.26 KB, 下载次数: 184, 下载积分: 黑币 -5

使用说明书.rar

1.06 MB, 下载次数: 191, 下载积分: 黑币 -5

学习版协议.rar

113.39 KB, 下载次数: 174, 下载积分: 黑币 -5

原理图.rar

45.43 KB, 下载次数: 253, 下载积分: 黑币 -5

评分

参与人数 4黑币 +124 收起 理由
AAA_MCU + 18 很给力!
guoyiran + 5 很给力!
rebol + 1 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:232205 发表于 2017-12-14 11:40 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:223725 发表于 2017-12-15 14:18 | 显示全部楼层
全下了,慢慢学习
回复

使用道具 举报

ID:270223 发表于 2018-1-2 17:14 | 显示全部楼层
在那个原理图中   数字部分电路有一个没有芯片型号,那芯片型号是什么
回复

使用道具 举报

ID:270327 发表于 2018-1-2 18:54 | 显示全部楼层
STM32最高采样的频率能做到多少?
回复

使用道具 举报

ID:39808 发表于 2018-1-21 12:00 | 显示全部楼层
125du 发表于 2018-1-2 18:54
STM32最高采样的频率能做到多少?

1M,紫薯布丁
回复

使用道具 举报

ID:97068 发表于 2018-1-21 18:07 | 显示全部楼层
牛逼牛逼牛逼牛逼牛逼
回复

使用道具 举报

ID:97068 发表于 2018-1-21 18:08 | 显示全部楼层
STM32最高采样的频率也只能做到1M了
回复

使用道具 举报

ID:63312 发表于 2018-1-22 09:51 | 显示全部楼层
感谢楼主!
回复

使用道具 举报

ID:279445 发表于 2018-1-25 09:46 | 显示全部楼层
可以,很不错
回复

使用道具 举报

ID:179958 发表于 2018-2-4 14:40 来自手机 | 显示全部楼层
这个666了,学习了
回复

使用道具 举报

ID:187029 发表于 2018-5-15 10:20 | 显示全部楼层
666,下载学习一下
回复

使用道具 举报

ID:145279 发表于 2018-7-29 16:06 | 显示全部楼层
没发开始啊
回复

使用道具 举报

ID:377382 发表于 2018-8-24 14:35 | 显示全部楼层
非常好的 资料。。。谢谢、
回复

使用道具 举报

ID:186637 发表于 2018-10-19 22:03 | 显示全部楼层
谢谢分享!学习学习!
回复

使用道具 举报

ID:456386 发表于 2018-12-27 13:46 | 显示全部楼层
现在正在研究这个 借来用用
回复

使用道具 举报

ID:457555 发表于 2018-12-28 19:16 | 显示全部楼层
很齐全,谢谢楼主哈
回复

使用道具 举报

ID:468349 发表于 2019-1-15 10:11 | 显示全部楼层
现在正在研究这个 借来用用
回复

使用道具 举报

ID:399179 发表于 2019-1-16 16:08 来自手机 | 显示全部楼层
感觉好强大啊!
回复

使用道具 举报

ID:471926 发表于 2019-1-23 09:33 | 显示全部楼层
这个确实好东西,正在做这个项目,借来参考
回复

使用道具 举报

ID:196383 发表于 2019-3-18 08:16 | 显示全部楼层
想做个玩玩
回复

使用道具 举报

ID:441421 发表于 2019-3-23 14:16 | 显示全部楼层
协议不错
回复

使用道具 举报

ID:482226 发表于 2019-4-7 15:37 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:111676 发表于 2019-4-9 21:18 | 显示全部楼层
非常好的 资料
回复

使用道具 举报

ID:565822 发表于 2019-6-18 15:48 | 显示全部楼层
请问如何改放大倍数?默认是1
回复

使用道具 举报

ID:578547 发表于 2019-7-5 15:56 | 显示全部楼层
下载学习下!
回复

使用道具 举报

ID:33544 发表于 2019-7-15 08:45 | 显示全部楼层

666,下载学习一下
回复

使用道具 举报

ID:674237 发表于 2019-12-26 09:08 | 显示全部楼层
太厉害了
回复

使用道具 举报

ID:687983 发表于 2020-4-10 09:22 | 显示全部楼层
很好 , 很强大
回复

使用道具 举报

ID:726195 发表于 2020-4-10 13:25 | 显示全部楼层
以前做过一个类似的,有机会一起探讨一下
回复

使用道具 举报

ID:726950 发表于 2020-4-17 10:25 | 显示全部楼层
可玩性很高啊
回复

使用道具 举报

ID:658700 发表于 2020-4-29 21:30 | 显示全部楼层
zhaowenmin 发表于 2018-1-21 18:08
STM32最高采样的频率也只能做到1M了

对啊,而且在这个频率下,测得不准,根本当不了示波器
回复

使用道具 举报

ID:619787 发表于 2020-5-13 15:55 | 显示全部楼层
很齐全,谢谢楼主
回复

使用道具 举报

ID:342443 发表于 2021-5-14 11:13 | 显示全部楼层
是不是基于labview的
回复

使用道具 举报

ID:902479 发表于 2021-7-22 19:42 | 显示全部楼层
请问一下,原理图中数字部分电路那有一个芯片没有标上型号,请问那个是啥型号的芯片啊,谢谢。。。
回复

使用道具 举报

ID:97181 发表于 2021-11-21 06:04 | 显示全部楼层
hj2008ss 发表于 2021-7-22 19:42
请问一下,原理图中数字部分电路那有一个芯片没有标上型号,请问那个是啥型号的芯片啊,谢谢。。。

你想问的可能是一个DCDC电源模块,+5v转为-5v
回复

使用道具 举报

ID:977861 发表于 2021-11-25 12:45 | 显示全部楼层
好资料,51黑有你更精彩!收藏了
回复

使用道具 举报

ID:151108 发表于 2021-11-26 20:25 | 显示全部楼层
很有兴趣,学习一下
回复

使用道具 举报

ID:122260 发表于 2021-11-30 10:43 | 显示全部楼层
做成功了吗都正常不
回复

使用道具 举报

ID:97181 发表于 2021-11-30 20:59 | 显示全部楼层
没有,网上查了一下,上位机下位机都有问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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