使用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最大时间不能超过14M
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//ADC
	GPIO_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);
 			} 

点击下方链接下载源码

工程文件下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值