完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我的单通道多次转换AD,已经有软件的平滑滤波,但是检测大于1V的信号是显示低于1V接近1V 检测200mV的信号显示0.956~0.542之间不断波动,求解为什么会是这样,怎解决。代码已经粘贴,无错的。 #include "msp430g2553.h" #define uint unsigned int #define uchar unsigned char uint Results[32]; //存放ADC的转换结果 float Average=0; uint ad_value=0; //在此设置输入端口*************************************************************/ #define LCD_SID1 P2OUT|=BIT4 #define LCD_SID0 P2OUT&=~BIT4 //WR 做数据传输使用sid #define LCD_SCLK1 P2OUT|=BIT3 #define LCD_SCLK0 P2OUT&=~BIT3 //EN 当做串行时钟使用sclk #define LCD_SID_READ P2IN&0X10 #define CPU_F ((double)8000000)//cpu frequency8000000 #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/2000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/2000.0)) #define com 0 #define dat 1 unsigned char s1[] ={"电压(V): "}; unsigned char s2[] ={"ti杯电子设计大赛"}; /*********************写命令或数据************************/ void wr_lcd(uchar dat_com,uchar data) { uchar a,i,j; delay_us(50); a = data; LCD_SID1; //WR=0; LCD_SCLK0; //EN=0; for(i=0;i<5;i++) //时序 { LCD_SCLK1; LCD_SCLK0; } LCD_SID0; //wr=0 LCD_SCLK1; //en=1 LCD_SCLK0; //en=0 if(dat_com) LCD_SID1; else LCD_SID0; LCD_SCLK1; LCD_SCLK0; LCD_SID0; LCD_SCLK1; LCD_SCLK0; for(j=0;j<2;j++) //8次循环写写一字节数据 { for(i=0;i<4;i++) { if(a&0x80) LCD_SID1; else LCD_SID0; a=a<<1; LCD_SCLK1; LCD_SCLK0; } LCD_SID0; for(i=0;i<4;i++) //时钟 { LCD_SCLK1; LCD_SCLK0; } } } /*******************初始化***********************************/ void init_lcd(void) { wr_lcd(com,0x30);//基本指令集操作 wr_lcd(com,0x01);//清楚显示 delay_ms(2); wr_lcd(com,0x30);//基本指令集操作 wr_lcd(com,0x01);//清楚显示 delay_ms(2); wr_lcd(com,0x06);//光标右移,AC自动加1,整体显示不移动 wr_lcd(com,0x0c);//整体显示ON,光标显示OFF,光标位置不反白闪烁 } /**********************写字符串,x0取值0-3,x取值0-7****************************/ void wr_string(uchar x,uchar x0,uchar *p) { uchar pos=0;//初始化 uchar cnt=0;//传递过来的是指针 ,cnt为偏移量,然后一个字符一个字符的写入。 switch(x0) { case 0: pos=0x80+x;break; case 1: pos=0x90+x;break; case 2: pos=0x88+x;break; case 3: pos=0x98+x;break; default: break; } wr_lcd(com,pos);//写地址 while(*(p+cnt)!=' |