完整资料下载:
stm32 keil C程序源码.zip
(10.07 MB, 售价: 5 E币)
上位机源码C#.zip
(9.84 MB, 售价: 5 E币)
硬件PCB及模块电路仿真.zip
(2.77 MB, 售价: 5 E币)
设计文档.zip
(60.62 KB)
设计文档附件内容:
STM32示波器通信协议.xlsx
增益计算表.xlsx
用四个字节十六进制数表示单精度浮点数.docx
示波器时间表.docx
设计指标.docx
硬件pcb及模块电路仿真附件内容:
电平平移.ms12
示波器AD板.pdf
示波器AD板最终实物版图.PcbDoc
示波器上层板.pdf
示波器上层板最终实物版图.PcbDoc
示波器前端电路.ms12
耦合——衰减电路.ms12
设计指标:
主控:STM32F103ZET6
液晶屏:4.3寸TFT480×272 65K彩色LCD显示屏 FSMC
AD:12位1MHz采样率
最高实时取样率:1MSa/s 12Bits
取样缓冲器深度: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)控制完成FFT(6)波形的存储和显示
4、图形接口: UCGUI
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、被测信号的各种参数屏幕显示,包括频率、电压峰峰值等。
这是上位机的程序
测试时候的照片
测试正弦波
PCB
模拟电路板
侧面的照片
部分源码:(完整源码见相关附件)
- #include "stm32f10x.h"
- #include "adc.h"
- #include "oscilloscope.h"
- #include "ucos_ii.h"
- #include "tft_api.h"
- /*-----------------------------------------
- 声明变量
- ------------------------------------------*/
- extern WaveType WaveInfo;
- extern WaveMode WaveCtrl;
- volatile u16 ADCConvertedValue[SAMPDEPTH];//AD转换缓冲区,占用RAM 0.8KB
- /*-----------------------------------------
- ADC1端口初始化
- ------------------------------------------*/
- void ADC1_GPIO_Init(void)
- {
- GPIO_InitTypeDef IO_Init;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC,ENABLE);
- //C1模拟输入
- IO_Init.GPIO_Pin = GPIO_Pin_1;
- IO_Init.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOC,&IO_Init);
- }
- /* #define ADC1_DR_Address ((unsigned int)0x40012400+0x4c) */
- /* unsigned short int ADC1_DMA_Value; */
- /*--------------------------------------------------
- 函数说明:配置ADC1完成AD采集,是本示波器最核心的部分.
- 配置方案:ADC1由TIM3提供的触发事件进行触发AD转换,控
- 制TIM3的速率就可以完成采样率的改变.同时采
- 用DMA完成数据传输,注入通道1完成内部温度传
- 感器AD采集.
- --------------------------------------------------*/
- void ADC1_Mode_Config(void)
- {
- //配置DMA
- DMA_InitTypeDef DMA_csh;
- ADC_InitTypeDef ADC_csh;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- DMA_DeInit(DMA1_Channel1); //DMA复位,通道1
- DMA_csh.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC1地址
- DMA_csh.DMA_MemoryBaseAddr = (unsigned int)ADCConvertedValue; //内存地址
- DMA_csh.DMA_DIR = DMA_DIR_PeripheralSRC;
- DMA_csh.DMA_BufferSize = SAMPDEPTH; //缓冲大小为采样深度
- DMA_csh.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定
- DMA_csh.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增
- DMA_csh.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
- DMA_csh.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
- DMA_csh.DMA_Mode = DMA_Mode_Circular; //循环传输
- DMA_csh.DMA_Priority = DMA_Priority_High; //DMA优先级高
- DMA_csh.DMA_M2M = DMA_M2M_Disable;
- DMA_Init(DMA1_Channel1,&DMA_csh); //写入DMA1配置参数
- DMA_Cmd(DMA1_Channel1,ENABLE); //使能DMA1通道1
- DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); //使能DMA CH1中断
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- //配置TIM3工作在18MHz,为AD提供触发
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
- TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
- TIM_TimeBaseStructure.TIM_Period = 1;
- TIM_TimeBaseStructure.TIM_Prescaler = 99; //工作在18M,每格最大值时,不至于溢出
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
- TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update); //使用TIM3事件更新作为ADC触发
-
- //配置ADC
- ADC_csh.ADC_Mode = ADC_Mode_Independent; //独立ADC模式
- ADC_csh.ADC_ScanConvMode = DISABLE; //关闭扫描模式
- ADC_csh.ADC_ContinuousConvMode = DISABLE; //连续AD转换开启
- ADC_csh.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO; //由TIM3提供的触发事件进行触发AD转换
- ADC_csh.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐
- ADC_csh.ADC_NbrOfChannel = 1; //要转换的通道数目1
- ADC_Init(ADC1,&ADC_csh); //写入ADC1配置参数
- ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_1Cycles5);//采样速率1M
- ADC_DMACmd(ADC1,ENABLE); //使能ADC1 DMA
- ADC_ExternalTrigConvCmd(ADC1,ENABLE); //打开ADC1外部触发
-
- ADC_InjectedChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5); //配置ADC1通道16为注入通道1
- ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None); //软件触发注入通道的转换
- ADC_TempSensorVrefintCmd(ENABLE); //使能温度传感器
- ADC_Cmd(ADC1,ENABLE); //使能ADC1
- ADC_ResetCalibration(ADC1); //复位校准寄存器
- while(ADC_GetResetCalibrationStatus(ADC1)); //等待校准寄存器复位完成
- ADC_StartCalibration(ADC1); //开始校准
- while(ADC_GetCalibrationStatus(ADC1)); //等待校准完成
- TIM_Cmd(TIM3,ENABLE);
- }
- /*-----------------------------------------
- 函数说明:通过注入通道1转换内部温度传感器
- AD值,读取10次有效数据取平均返回
- ------------------------------------------*/
- u16 GetTempSensor(void)
- {
- u16 temp=0,i,k=0;
- for(i=0; i<10; )
- {
- ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE); //软件触发注入通道的转换
- k = (0x6EE - ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1)) / 0x05 + 25;
- if(k>0 && k<100)
- {
- temp += k;
- i++;
- }
- }
- temp /= 10;
- return temp;
- }
- /*-----------------------------------------
- 函数说明:ADC1初始化
- ------------------------------------------*/
- void ADC1_Init(void)
- {
- ADC1_GPIO_Init();
- ADC1_Mode_Config();
- }
- /*-----------------------------------------
- 函数说明:ADC传输DMA通道1中断服务程序
- DMA把AD值传输到缓冲区完成后关闭定
- 时器3(作为触发AD转换的定时器)同时
- 置更新完成标志位为1,开定时器3在应
- 用中开启.
- ------------------------------------------*/
- void DMA1_Channel1_IRQHandler()
- {
- OSIntNesting++;
- DMA_ClearFlag(DMA1_FLAG_TC1); //清除DMA传输完成中断
- TIM_Cmd(TIM3,DISABLE); //关闭TIM3
- WaveCtrl.UpdatTrue = 1; //已经完成一次波形FIFO,可以批量读出数据
- OSIntExit();
- }
- /*-----------------------------------------
- 函数说明:擦除AD缓冲区
- ------------------------------------------*/
- void Earse_AD_FIFO(void)
- {
- uint32_t i;
- for(i=0; i<sampdepth; i++)
- {
- ADCConvertedValue[i] = 0;
- }
- }
- ++++++完整密码详见附件+++++++
复制代码
上位机支持用visual studio 2022进行编译
Keil MDK 5编译无措
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|