2,425
社区成员
发帖
与我相关
我的任务
分享
描述: ADC端口选取P1.3, P1.4,MCU这两个端口没有电路,直接连接一个可变电阻,供电电源3.3V; 软件初始化P1.3, P1.4为高阻模式,波特率9600; 软件设置10位ADC精度; 测量P1.3, P1.4的电压,数据基本稳定在1.65--1.66V(可变电阻在中位); 软件读取寄存器的值,值一直不停跳动,而且上下浮动幅度很大(0x0141~0x0164),考虑到可能采样太快,这个数据是进行过软件滤波过的,每2毫秒采一次样,采集130次,去除最大值最小值后,128个数据的均值 这个数值跟公式计算ADC_Value = Vin/Vcc1024 = 1.65/3.31024 = 0x200相差很大,为什么? 相关核心代码: uchar ch = 3; P1M0 = 0x04; //P1.2设置为推挽,P1.3,P1.4高阻 P1M1 = 0x18; /********************************************** *****2ms秒@11.0592MHz******** ***********************************************/ void Timer1Init(void) //2毫秒@11.0592MHz { AUXR |= 0x40; //定时器时钟1T模式 TMOD &= 0x0F; //设置定时器模式 TL1 = 0x9A; //设置定时初始值 TH1 = 0xA9; //设置定时初始值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 ET1 = 1; //使能定时器0中断 } /*---------------------------- 初始化ADC ----------------------------*/ void InitADC() { P1ASF = 0x18; //设置P1.3、P1.4为AD口 ADC_RES = 0; //清除结果寄存器 ADC_RESL = 0; ADC_CONTR = ADC_POWER | ADC_SPEEDLL; Delay(2); //ADC上电并延时 } /* Timer1 */ void Timer1Isr() interrupt 3 { uint ADC_Value; ADC_CONTR &= !ADC_FLAG; //清除ADC中断标志 ADC_Value = (ADC_RES<<2); ADC_Value += ADC_RESL&0x3; ch++; if(ch >= 4) { ch = 3; } ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch; } |