使用stm32f103ZET制作低电压示波器

2024-01-05 07:10

本文主要是介绍使用stm32f103ZET制作低电压示波器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一.信号的采集

1.ADC配置

2.引脚连接方式

二.数据的处理

三.电压显示与人机交互

1.电压显示

2.人机交互

     此项目是基于普中准端-Z300开发板开发的简单示波器,显示屏采用的是TFT_ILI9488触摸屏,采样信号的电压范围为0——3.3V

(最大输入电压由ADC参考电压决定)。将PC2连接信号输入端,另一端接地就可以显示采样。

一.信号的采集

       信号的采集主要是依靠ADC2通道进行采样。通过延时控制每次采样的时间间隔,通过延时控制信号点的显示间隔。由于信号采样没有采用外部信号触发,使用软件触发,主要通过延时函数控制采用频率。由于信号的采样和显示是顺序进行的,所以信号的采样频率主要由信号点的刷新频率所决定。此案例用到的是ADC2的通道12(即PC2口)进行数据的采样。

1.ADC配置

//ADC2初始化
void ADC2_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量ADC_InitTypeDef       ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC2,ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14MGPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//ADCGPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;	//模拟输入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//禁止触发检测,使用软件中断ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐ADC_InitStructure.ADC_NbrOfChannel = 1;//只转换规则序列1 ADC_Init(ADC2, &ADC_InitStructure);//ADC初始化ADC_Cmd(ADC2, ENABLE);//¿ªÆôADת»»Æ÷ADC_ResetCalibration(ADC2);//ÖØÖÃÖ¸¶¨µÄADCµÄУ׼¼Ä´æÆ÷while(ADC_GetResetCalibrationStatus(ADC2));//»ñÈ¡ADCÖØÖÃУ׼¼Ä´æÆ÷µÄ״̬ADC_StartCalibration(ADC2);//¿ªÊ¼Ö¸¶¨ADCµÄУ׼״̬while(ADC_GetCalibrationStatus(ADC2));//»ñȡָ¶¨ADCµÄУ׼³ÌÐòADC_SoftwareStartConvCmd(ADC2, ENABLE);//ʹÄÜ»òÕßʧÄÜÖ¸¶¨µÄADCµÄÈí¼þת»»Æô¶¯¹¦ÄÜ
}//将通道ch的值取times次取平均值得到采样的信号值float Get_ADC2_Value(float ch,float times)
{float temp_val=0;u8 t;//指定ADC的规则组通道ADC_RegularChannelConfig(ADC2, ch, 1, ADC_SampleTime_239Cycles5);	//239.5个采样周期,提高采样周期可以提高采样精度		    for(t=0;t<times;t++){ADC_SoftwareStartConvCmd(ADC2, ENABLE);//使能指定ADC的软件转换启动功能while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC ));//等待转换结束temp_val+=ADC_GetConversionValue(ADC2);delay_ms(5);}return temp_val/times;
} //将ADC2采样信号转换为电压大小float ADC2_Value_Convert(u8 channel,u8 sample)
{float result;result=3.3*Get_ADC2_Value(channel,sample)/4096;return result;
}

2.引脚连接方式


信号输入-------------------------PC2
GND------------------------GND


二.数据的处理

由于LCD驱动程序中没有浮点数的显示接口,我自己定义了一个浮点数的转换显示函数

实时电压浮点数转换处理与显示

void LCD_show_float_num(u16 x,u16 y,u8 len,u8 size,float num)
{int i=0;int conv_num=0;int num_thousand=0,num_hundred=0,num_ten=0,num_single=0;int save_num[5];conv_num=num*1000;num_thousand=conv_num/1000;num_hundred=conv_num%1000/100;num_ten=conv_num%100/10;num_single=conv_num%10;save_num[1]=num_thousand;save_num[2]=num_hundred;save_num[3]=num_ten;save_num[4]=num_single;LCD_ShowChar(size+x+10,y,'.',16,0);LCD_ShowChar(size*5+x,y,'V',16,0);for(i=1;i<len+1;i++){LCD_ShowNum(x+i*size,y,save_num[i],1,size);}
}

三.电压显示与人机交互

1.电压显示

	    //获取ADC2的实时电压,在72Mhz的主频下相当于50Khz的采样率voltage_value=ADC2_Value_Convert(12,1);LCD_ShowFontString(150,280,65,16,"实时电压:",16,0);LCD_show_float_num(220,280,4,16,voltage_value);

2.人机交互

人机交互通过TFTLCD_ILI9488触摸屏实现点击控制示波器的信号点显示大小,采样频率,信号放大幅度,采样点间隔及单次采样的信号点个数。点击屏幕会出现相关设置的选择界面,点击对应按键即可实现示波器相关参数的修改。

参数调整界面如下所示:

 

	        //触模扫描tp_dev.scan(0);//当屏幕被点击时if(tp_dev.sta&TP_PRES_DOWN){    		 caption=(u8*)LCD_displayer_set[Language];res=app_items_sel((tftlcd_data.width-160)/2+offset_x,(tftlcd_data.height-72-font_size*6)/2+offset_y,list_width,vertical_display_height+font_size*6,(u8**)LCD_displayer_function_first[Language],5,(u8*)&l00sel,0X90,caption);//µ¥Ñ¡ if(res==0){caption=(u8*)LCD_displayer_function_first[Language][l00sel];switch(l00sel){case 0://信号点大小res=app_items_sel((tftlcd_data.width-160)/2+sub_offset_x,(tftlcd_data.height-72-font_size*2)/2+offset_y,list_width,vertical_display_height+font_size*2,(u8**)LCD_displayer_function_second[Language],2,(u8*)&l10sel,0X90,caption);//µ¥Ñ¡if(res==0){if(l10sel==0) signal_point_size++;	else signal_point_size--; if(signal_point_size==0)signal_point_size=2;}break;case 1://刷新频率res=app_items_sel((tftlcd_data.width-160)/2+sub_offset_x,(tftlcd_data.height-72-font_size*2)/2+offset_y,list_width,vertical_display_height+font_size*2,(u8**)LCD_displayer_function_third[Language],2,(u8*)&l11sel,0X90,caption);//µ¥Ñ¡if(res==0){if(l11sel==0) signal_refresh_frequency-=50;	else signal_refresh_frequency+=50; if(signal_refresh_frequency==0)signal_refresh_frequency=100;}break;case 2://采样点个数 res=app_items_sel((tftlcd_data.width-160)/2+sub_offset_x,(tftlcd_data.height-72-font_size*2)/2+offset_y,list_width,vertical_display_height+font_size*2,(u8**)LCD_displayer_function_forth[Language],2,(u8*)&l12sel,0X90,caption);//µ¥Ñ¡if(res==0){if(l12sel==0) signal_sampling_point_num+=5;	else signal_sampling_point_num-=5;if(signal_sampling_point_num==0)signal_sampling_point_num=20;}break;case 3://放大幅度res=app_items_sel((tftlcd_data.width-160)/2+sub_offset_x,(tftlcd_data.height-72-font_size*2)/2+offset_y,list_width,vertical_display_height+font_size*2,(u8**)LCD_displayer_function_fifth[Language],2,(u8*)&l13sel,0X90,caption);//µ¥Ñ¡if(res==0){if(l13sel==0) signal_amplify+=5;	else signal_amplify-=5;if(signal_amplify==0)signal_amplify=10;}break;case 4://采样间隔res=app_items_sel((tftlcd_data.width-160)/2+sub_offset_x,(tftlcd_data.height-72-font_size*2)/2+offset_y,list_width,vertical_display_height+font_size*2,(u8**)LCD_displayer_function_sixth[Language],2,(u8*)&l14sel,0X90,caption);//µ¥Ñ¡if(res==0){if(l14sel==0) signal_step*2;	else signal_step/2; if(signal_step==0)signal_step=1;}break;}			}LCD_Clear(BLACK);} 

点击下方链接下载源码

工程文件下载地址

这篇关于使用stm32f103ZET制作低电压示波器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572061

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.