/*********************************************************************************************** //Scope.h文档 ************************************************************************************************/ #ifndef SCOPE_H_ #define SCOPE_H_ #include "LCD_CON.h" #include "FFT.h" #include "SYS_CON.h" #include "SYS_VARIABLE.h" #include "Interface.h" #include "math.h" /************************************************************************************************ //在此位置增加新函数 //此段为新加代码,实现幅度自动控制,在Signal_Meas()函数中调用此函数 void Auto_ATT() { if (autoatt1==1){ if(AMP_MAX_CH1>246&&ATT_FLAG_CH1<8) ATT_FLAG_CH1++; else if(AMP_MAX_CH1<170&&ATT_FLAG_CH1>0) ATT_FLAG_CH1--; switch(ATT_FLAG_CH1) { case 0: sprintf(lcd_buffer,"CH1=^10mV/");(ATT_CON_VAR&=0XF7);CH1_VAMP_DATA=1611;break; case 1: sprintf(lcd_buffer,"CH1=^20mV/");(ATT_CON_VAR&=0XF7);CH1_VAMP_DATA=1460;break; case 2: sprintf(lcd_buffer,"CH1=^50mV/");(ATT_CON_VAR&=0XF7);CH1_VAMP_DATA=1255;break; case 3: sprintf(lcd_buffer,"CH1=100mV/");(ATT_CON_VAR&=0XF7);CH1_VAMP_DATA=1106;break; case 4: sprintf(lcd_buffer,"CH1=200mV/");(ATT_CON_VAR&=0XF7);CH1_VAMP_DATA=975;break; case 5: sprintf(lcd_buffer,"CH1=500mV/");(ATT_CON_VAR|=0X08);CH1_VAMP_DATA=1471;break; case 6: sprintf(lcd_buffer,"CH1=^^1V/^");(ATT_CON_VAR|=0X08);CH1_VAMP_DATA=1325;break; case 7: sprintf(lcd_buffer,"CH1=^^2V/^");(ATT_CON_VAR|=0X08);CH1_VAMP_DATA=1177;break; case 8: sprintf(lcd_buffer,"CH1=^^5V/^");(ATT_CON_VAR|=0X08);CH1_VAMP_DATA=984;break; } CH1_VPOS_DATA=CH1_VPOS_VAR[ATT_FLAG_CH1]+((unsigned int)((LEVEL_FLAG_CH1-128)*CH1_MULVAR)); display_ascii(180,313,0x0000,MENU_FULL_COLOR); } if (autoatt2){ if(AMP_MAX_CH2>246&&ATT_FLAG_CH2<8) ATT_FLAG_CH2++; else if(AMP_MAX_CH2<170&&ATT_FLAG_CH2>0) ATT_FLAG_CH2--; switch(ATT_FLAG_CH2) { case 0: sprintf(lcd_buffer,"CH2=^10mV/");(ATT_CON_VAR&=0XBF);CH2_VAMP_DATA=1611;break; case 1: sprintf(lcd_buffer,"CH2=^20mV/");(ATT_CON_VAR&=0XBF);CH2_VAMP_DATA=1460;break; case 2: sprintf(lcd_buffer,"CH2=^50mV/");(ATT_CON_VAR&=0XBF);CH2_VAMP_DATA=1255;break; case 3: sprintf(lcd_buffer,"CH2=100mV/");(ATT_CON_VAR&=0XBF);CH2_VAMP_DATA=1106;break; case 4: sprintf(lcd_buffer,"CH2=200mV/");(ATT_CON_VAR&=0XBF);CH2_VAMP_DATA=975;break; case 5: sprintf(lcd_buffer,"CH2=500mV/");(ATT_CON_VAR|=0X40);CH2_VAMP_DATA=1471;break; case 6: sprintf(lcd_buffer,"CH2=^^1V/^");(ATT_CON_VAR|=0X40);CH2_VAMP_DATA=1325;break; case 7: sprintf(lcd_buffer,"CH2=^^2V/^");(ATT_CON_VAR|=0X40);CH2_VAMP_DATA=1177;break; case 8: sprintf(lcd_buffer,"CH2=^^5V/^");(ATT_CON_VAR|=0X40);CH2_VAMP_DATA=984;break; } CH2_VPOS_DATA=CH2_VPOS_VAR[ATT_FLAG_CH2]+((unsigned int)((LEVEL_FLAG_CH2-128)*CH2_MULVAR)); display_ascii(268,313,0x0000,MENU_FULL_COLOR); } } ***********************************************************************************************************/ void SEND_AD5320(unsigned int j) { unsigned char u; IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_K_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_P_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_AD_BASE, 0); for(u=0;u<16;u++) { if(j&0x8000) { IOWR_ALTERA_AVALON_PIO_DATA(SPI_DATA_BASE, 1); } else { IOWR_ALTERA_AVALON_PIO_DATA(SPI_DATA_BASE, 0); } IOWR_ALTERA_AVALON_PIO_DATA(SPI_CLK_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SPI_CLK_BASE, 0); j<<=1; } IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_AD_BASE, 1); } void SEND_595M(unsigned char j) { unsigned char u; IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_AD_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_K_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_P_BASE, 0); for(u=0;u<8;u++) { if(j&0x80) { IOWR_ALTERA_AVALON_PIO_DATA(SPI_DATA_BASE, 1); } else { IOWR_ALTERA_AVALON_PIO_DATA(SPI_DATA_BASE, 0); } IOWR_ALTERA_AVALON_PIO_DATA(SPI_CLK_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SPI_CLK_BASE, 0); j<<=1; } IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_P_BASE, 1); } void SEND_595K(unsigned char j) { unsigned char u; IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_AD_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_P_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_K_BASE, 0); for(u=0;u<8;u++) { if(j&0x80) { IOWR_ALTERA_AVALON_PIO_DATA(SPI_DATA_BASE, 1); } else { IOWR_ALTERA_AVALON_PIO_DATA(SPI_DATA_BASE, 0); } IOWR_ALTERA_AVALON_PIO_DATA(SPI_CLK_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SPI_CLK_BASE, 0); j<<=1; } IOWR_ALTERA_AVALON_PIO_DATA(SPI_LE_K_BASE, 1); } void READ_KEY() { unsigned char i=0; for(i=0;i<8;i++) { SEND_595K(((0xfeff<>8)&0xff); if(IORD_ALTERA_AVALON_PIO_DATA(KEY_PORT_BASE)!=0x03) { if(IORD_ALTERA_AVALON_PIO_DATA(KEY_PORT_BASE)==1) { switch(i) { case 0: K_DATA=8;break; case 1: K_DATA=9;break; case 2: K_DATA=10;break; case 3: K_DATA=11;break; case 4: K_DATA=12;break; case 5: K_DATA=13;break; case 6: K_DATA=14;break; case 7: K_DATA=15;break; } } else if(IORD_ALTERA_AVALON_PIO_DATA(KEY_PORT_BASE)==2) { switch(i) { case 0: K_DATA=0;break; case 1: K_DATA=1;break; case 2: K_DATA=2;break; case 3: K_DATA=3;break; case 4: K_DATA=4;break; case 5: K_DATA=5;break; case 6: K_DATA=6;break; case 7: K_DATA=7;break; } } break; } } SEND_595K(0x00); } void Init_Scope() { unsigned int i; for(i=0;i<512;i++) { CLR_DATA_CH1[i]=145; CLR_DATA_CH2[i]=145; MEAS_CLR_DATA[i]=145; clr_mode[i]=62; } } void Signal_Meas() { unsigned int i; ATT_DISP_LOOP++; if(ATT_DISP_LOOP>=10) { ATT_DISP_FLAG=1; ATT_DISP_LOOP=0; } AMP_MAX_CH1=MEAS_DATA_CH1[2]; AMP_MAX_CH2=MEAS_DATA_CH2[2]; AMP_MIN_CH1=MEAS_DATA_CH1[2]; AMP_MIN_CH2=MEAS_DATA_CH2[2]; for(i=0;i<400;i++) { if(MEAS_DATA_CH1[i]>AMP_MAX_CH1)AMP_MAX_CH1=MEAS_DATA_CH1[i]; if(MEAS_DATA_CH1[i]<=AMP_MIN_CH1)AMP_MIN_CH1=MEAS_DATA_CH1[i]; if(MEAS_DATA_CH2[i]>AMP_MAX_CH2)AMP_MAX_CH2=MEAS_DATA_CH2[i]; if(MEAS_DATA_CH2[i]<=AMP_MIN_CH2)AMP_MIN_CH2=MEAS_DATA_CH2[i]; } AMP_VPP_CH1=AMP_MAX_CH1-AMP_MIN_CH1+1; AMP_VPP_CH2=AMP_MAX_CH2-AMP_MIN_CH2+1; VPP_DISP_CH1=(unsigned int)(AMP_VPP_CH1*VAR_AMP[ATT_FLAG_CH1]); VPP_DISP_CH2=(unsigned int)(AMP_VPP_CH2*VAR_AMP[ATT_FLAG_CH2]); RMS_VAR_CH1=AMP_MAX_CH1-AMP_VPP_CH1/2; RMS_VAR_CH2=AMP_MAX_CH2-AMP_VPP_CH2/2; for(i=0;i<400;i++) { RMS_CH1+=(MEAS_DATA_CH1[i]-RMS_VAR_CH1)*(MEAS_DATA_CH1[i]-RMS_VAR_CH1); RMS_CH2+=(MEAS_DATA_CH2[i]-RMS_VAR_CH2)*(MEAS_DATA_CH2[i]-RMS_VAR_CH2); } RMS_CH1=RMS_CH1/400; RMS_CH2=RMS_CH2/400; RMS_CH1=sqrt(RMS_CH1); RMS_CH2=sqrt(RMS_CH2); RMS_DATA_CH1=RMS_CH1; RMS_DATA_CH2=RMS_CH2; VRMS_DISP_DATA_CH1=(unsigned int)(RMS_DATA_CH1*VAR_AMP[ATT_FLAG_CH1]); VRMS_DISP_DATA_CH2=(unsigned int)(RMS_DATA_CH2*VAR_AMP[ATT_FLAG_CH2]); if(ATT_DISP_FLAG || freq_div_data>=12) { switch(SCOPE_CHANNEL_FLAG) { case 0: DISP_AMP_CH1();break; case 1: DISP_AMP_CH2();break; case 2: DISP_AMP_CH1();DISP_AMP_CH2();break; case 3: DISP_AMP_CH1();DISP_AMP_CH2();break; } ATT_DISP_FLAG=0; /**************************************************************************** Auto_ATT(); // 新增代码,调用幅度自控函数*/ *****************************************************************************/ } } void Wave_Interpolation(unsigned int dso_addr_offset) { unsigned int i; unsigned char DATA_BUFFER_CH1[300]; unsigned char DATA_BUFFER_CH2[300]; for(i=0;i<201;i++) { DATA_BUFFER_CH1[i]=ADC_DATA_CH1[i+dso_addr_offset]; DATA_BUFFER_CH2[i]=ADC_DATA_CH2[i+dso_addr_offset]; } for(i=0;i<200;i++) { DISP_DATA_CH1[i*2]=DATA_BUFFER_CH1[i]+52; DISP_DATA_CH1[i*2+1]=(DATA_BUFFER_CH1[i]>>1)+(DATA_BUFFER_CH1[i+1]>>1)+52; DISP_DATA_CH2[i*2]=DATA_BUFFER_CH2[i]+52; DISP_DATA_CH2[i*2+1]=(DATA_BUFFER_CH2[i]>>1)+(DATA_BUFFER_CH2[i+1]>>1)+52; } } void Scope() { unsigned int i=0; unsigned int trig_addr; unsigned int addr_offset; unsigned int dso_addr_offset; unsigned int dso_offset_stop_old=0; while(!IORD_ALTERA_AVALON_PIO_DATA(MEM_DONE_BASE)) { if(CON_FLAG)break; } if(IORD_ALTERA_AVALON_PIO_DATA(TRIG_DONE_BASE)) { trig_addr=IORD_ALTERA_AVALON_PIO_DATA(TRIG_ADDR_IN_BASE); if(trig_addr>1)-1); for(i=0;i<500;i++) { MEAS_DATA_CH1[i]=ADC_DATA_CH1[i+dso_addr_offset]; MEAS_DATA_CH2[i]=ADC_DATA_CH2[i+dso_addr_offset]; } } else { for(i=0;i<500;i++) { DISP_DATA_CH1[i]=ADC_DATA_CH1[i+dso_addr_offset]+52; DISP_DATA_CH2[i]=ADC_DATA_CH2[i+dso_addr_offset]+52; MEAS_DATA_CH1[i]=ADC_DATA_CH1[i+dso_addr_offset]; MEAS_DATA_CH2[i]=ADC_DATA_CH2[i+dso_addr_offset]; } } if(FFT_FLAG) { if(FFT_SIGNAL==1) { for(i=0;i<512;i++) { In[i]=ADC_DATA_CH1[i+FFT_offset]; } } else if(FFT_SIGNAL==2) { for(i=0;i<512;i++) { In[i]=ADC_DATA_CH2[i+FFT_offset]; } } DISP_FFT(); } Signal_Meas(); if(RUN_STOP_FLAG) { sprintf(lcd_buffer,"STOP");display_ascii(420,250,0xf800,0xffff); sprintf(lcd_buffer," ");display_ascii(420,270,0x0000,0xffff); while(RUN_STOP_FLAG) { K_DATA=0xff; READ_KEY(); if(K_DATA==15) { delay_ms(50); if(IORD_ALTERA_AVALON_PIO_DATA(KEY_PORT_BASE)!=0x03) { if(dso_offset_stop0) dso_offset_stop-=5; } } K_DATA=0xff; if(dso_offset_stop_old!=dso_offset_stop) { if(freq_div_data==0) { Wave_Interpolation(dso_offset_stop+99); } else { for(i=0;i<400;i++) { DISP_DATA_CH1[i]=ADC_DATA_CH1[i+dso_offset_stop]+52; DISP_DATA_CH2[i]=ADC_DATA_CH2[i+dso_offset_stop]+52; } } display_area(); switch(SCOPE_CHANNEL_FLAG) { case 0: DISP_WAVE_CH1();break; case 1: DISP_WAVE_CH2();break; case 2: DISP_WAVE_DUAL();break; case 3: DISP_XY();break; } dso_offset_stop_old=dso_offset_stop; } } sprintf(lcd_buffer,"RUN ");display_ascii(420,250,0x07e0,0xffff); } else { switch(SCOPE_CHANNEL_FLAG) { case 0: DISP_WAVE_CH1();break; case 1: DISP_WAVE_CH2();break; case 2: DISP_WAVE_DUAL();break; case 3: DISP_XY();break; } } short_way: for(i=0;i<8192;i++) { ADC_DATA_CH1[i]=127; ADC_DATA_CH2[i]=127; } } #endif /*SCOPE_H_*/ /********************************************************************************** //FREQ_MEAS.h文档 ***********************************************************************************/ #ifndef FREQ_MEAS_H_ #define FREQ_MEAS_H_ #include "SYS_VARIABLE.h" #include "LCD_CON.h" /******************************************************************************* //此段为新增代码,实现自动扫描频率的设定,在freq_counter()中调用此函数 void Auto_SPEED() { unsigned long freq_max; if (FREQ_CH1=1171875) freq_div_data=0;//100ns else if (freq_max>=546875 && freq_max<1171875) freq_div_data=1;//200ns else if (freq_max>=234375 && freq_max<546875) freq_div_data=2;//500ns else if (freq_max>=117187 && freq_max<234375) freq_div_data=3;//1us else if (freq_max>=54687 && freq_max<117187) freq_div_data=4;//2us else if (freq_max>=23437 && freq_max<54687) freq_div_data=5;//5us else if (freq_max>=11718 && freq_max<23437) freq_div_data=6;//10us else if (freq_max>=5468 && freq_max<11718) freq_div_data=7;//20us else if (freq_max>=2343 && freq_max<5468) freq_div_data=8;//50us else if (freq_max>=1171 && freq_max<2343) freq_div_data=9;//100us else if (freq_max>=546 && freq_max<1171) freq_div_data=10;//200us else if (freq_max>=234 && freq_max<546) freq_div_data=11;//500us else if (freq_max>=117 && freq_max<234) freq_div_data=12;//1ms else if (freq_max>=54 && freq_max<117) freq_div_data=13;//2ms else if (freq_max>=23 && freq_max<54) freq_div_data=14;//5ms else if (freq_max>=11 && freq_max<23) freq_div_data=15;//10ms else if (freq_max>=5 && freq_max<11) freq_div_data=16;//20ms else if (freq_max>=2 && freq_max<5) freq_div_data=17;//50ms else if (freq_max>=1 && freq_max<2) freq_div_data=18;//100ms else freq_div_data=19;//200ms IOWR_ALTERA_AVALON_PIO_DATA(FREQ_DIV_DATA_BASE, freq_div_data-1); DISP_SPEED(); } **************************************************************************************/ void DISP_FREQ_CH1() { unsigned int freq1,freq2; if(FREQ_CH1==0) { sprintf(lcd_buffer,"Freq: NO TRIG "); } else if(FREQ_CH1<1000) { freq1=FREQ_CH1; sprintf(lcd_buffer,"Freq: %3dHz ",freq1); } else if(FREQ_CH1<10000) { freq1=FREQ_CH1/1000; freq2=FREQ_CH1%1000; sprintf(lcd_buffer,"Freq: %d.%03dkHz",freq1,freq2); } else if(FREQ_CH1<100000) { freq1=FREQ_CH1/1000; freq2=FREQ_CH1%1000; sprintf(lcd_buffer,"Freq:%2d.%03dkHz",freq1,freq2); } else if(FREQ_CH1<1000000) { freq1=FREQ_CH1/1000; freq2=(FREQ_CH1/10)%100; sprintf(lcd_buffer,"Freq:%3d.%02dkHz",freq1,freq2); } else if(FREQ_CH1<10000000) { FREQ_CH1=FREQ_CH1/1000; freq1=FREQ_CH1/1000; freq2=FREQ_CH1%1000; sprintf(lcd_buffer,"Freq: %d.%03dMHz",freq1,freq2); } else { FREQ_CH1=FREQ_CH1/1000; freq1=FREQ_CH1/1000; freq2=FREQ_CH1%1000; sprintf(lcd_buffer,"Freq:%2d.%03dMHz",freq1,freq2); } display_ascii(24,55,0x0000,MENU_FULL_COLOR); } void DISP_FREQ_CH2() { unsigned int freq1,freq2; if(FREQ_CH2==0) { sprintf(lcd_buffer,"Freq: NO TRIG "); } else if(FREQ_CH2<1000) { freq1=FREQ_CH2; sprintf(lcd_buffer,"Freq: %3dHz ",freq1); } else if(FREQ_CH2<10000) { freq1=FREQ_CH2/1000; freq2=FREQ_CH2%1000; sprintf(lcd_buffer,"Freq: %d.%03dkHz",freq1,freq2); } else if(FREQ_CH2<100000) { freq1=FREQ_CH2/1000; freq2=FREQ_CH2%1000; sprintf(lcd_buffer,"Freq:%2d.%03dkHz",freq1,freq2); } else if(FREQ_CH2<1000000) { freq1=FREQ_CH2/1000; freq2=(FREQ_CH2/10)%100; sprintf(lcd_buffer,"Freq:%3d.%02dkHz",freq1,freq2); } else if(FREQ_CH2<10000000) { FREQ_CH2=FREQ_CH2/1000; freq1=FREQ_CH2/1000; freq2=FREQ_CH2%1000; sprintf(lcd_buffer,"Freq: %d.%03dMHz",freq1,freq2); } else { FREQ_CH2=FREQ_CH2/1000; freq1=FREQ_CH2/1000; freq2=FREQ_CH2%1000; sprintf(lcd_buffer,"Freq:%2d.%03dMHz",freq1,freq2); } display_ascii(264,55,0x0000,MENU_FULL_COLOR); } void freq_counter() { if(IORD_ALTERA_AVALON_PIO_DATA(FREQ_DONE_BASE)==0) { FREQ_CH1=IORD_ALTERA_AVALON_PIO_DATA(FREQ_DATA_CH1_BASE); FREQ_CH2=IORD_ALTERA_AVALON_PIO_DATA(FREQ_DATA_CH2_BASE); switch(SCOPE_CHANNEL_FLAG) { case 0: DISP_FREQ_CH1(); sprintf(lcd_buffer," "); display_ascii(264,55,0x0000,MENU_FULL_COLOR); break;// case 1: DISP_FREQ_CH2(); sprintf(lcd_buffer," "); display_ascii(24,55,0x0000,MENU_FULL_COLOR); break; case 2: DISP_FREQ_CH1();DISP_FREQ_CH2();break; case 3: DISP_FREQ_CH1();DISP_FREQ_CH2();break; } /*************************************************************************** if(autospeed) Auto_SPEED();//调用自动扫描频率设定函数 ****************************************************************************/ IOWR_ALTERA_AVALON_PIO_DATA(FREQ_MEAS_START_BASE, 0); IOWR_ALTERA_AVALON_PIO_DATA(FREQ_MEAS_START_BASE, 1); } } #endif /*FREQ_MEAS_H_*/ /************************************************************************** 在SYS_VARIABLE.h中增加3个变量,用于开关控制 unsigned char autospeed=1; unsigned char autoatt1=1; unsigned char autoatt2=1; ************************************************************************** 在SYS_CON.h中的以下三个函数开头处,给三个变量赋值 void SPEED_CON(unsigned char flag) { autospeed=0; if(flag) { ************************************************************************** void ATT_CON_CH1(unsigned char flag) { autoatt1=0; if(flag) ************************************************************************** void ATT_CON_CH2(unsigned char flag) { autoatt2=0; if(flag) **************************************************************************