本文主要是介绍使用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制作低电压示波器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!