小弟最近在用IAP15W413AS这个单片机和AD芯片CS1231做一个小的称重处理项目。调试一段时间后发现,AD内码值以及线性变化也挺好的。但是,在读到的AD数值中间会穿插大量的0值,也就是内码会突变为0 。纠结好久,搞不懂为什么。有没有大神帮忙看下,谢谢。
下面附上AD部分电路以及AD驱动程序。
void Delay(unsigned int n) { unsigned int i, j; for(i = 0; i < n; i++){ for(j = 0; j < 200; j++){ } } } /* 时钟脉冲 */ void CS1231_Clk(void) { IO_ADC_SCLK = 1; Delay(10); // _nop_();_nop_();_nop_(); IO_ADC_SCLK = 0; //_nop_();_nop_();_nop_(); // } /* 从CS1231读取1字节的数据,返回无符号的rdata */ unsigned char Read_byte_adcIC (void) { int i; unsigned char rdata = 0; //初始化返回值为0 for (i = 0; i < 8; i++) { rdata <<= 1; //返回值左移1位 CS1231_Clk(); //上升沿接收数据,下降沿更新数据 if (IO_ADC_DDAT) { rdata |= 1; //若数据线上数据为1,则返回值加1 } else { } Delay(10); } return(rdata); } /* 从CS1231读取AD值数据,返回4字节的长整型数据Rdata */ signed long adcResult = 0; signed long Get_AD_adcIC(){ unsigned int i; long Rdata = 0; //while(IO_ADC_DDAT); //读数据前确定数据线为低 IO_ADC_SCLK = 0; //此语句可确保在读AD值之前SCLK为低电平 *((unsigned char *)(&adcResult)+0) = Read_byte_adcIC(); *((unsigned char *)(&adcResult)+1) = Read_byte_adcIC(); *((unsigned char *)(&adcResult)+2) = Read_byte_adcIC(); *((unsigned char *)(&adcResult)+3) = 0; //Read_byte_adcIC(); Delay(1); CS1231_Clk(); //向CS1231发送结束标志位 adcResult = adcResult / 65536; return(adcResult); } /* cs1231初始化 */ void Init_adcIC(void) //CS1231初始化 { // PDWN = 0; // Delay(2); PDWN = 1; //power down (低电平有效) IO_ADC_SCLK = 0; // SCLK长时间表为高电平时,AD会进入待机模式 while(IO_ADC_DDAT); //等待到一个AD值,表示AD工作正常 }