小弟最近在用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工作正常
}
我要赚赏金
