目录
此项目是基于普中准端-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);
}
点击下方链接下载源码
5万+

被折叠的 条评论
为什么被折叠?



