本帖最后由 lovezichao 于 2015-4-23 17:56 编辑
最近在使用IAP15W413AS这个单片机和AD芯片CS1231做一个称重处理的小东西。调试很长时间,内码数值及线性也挺可以的,只是会读出来大量的0值,比如说正常内码值为5500,但是会突然再跳变为全0。使用串口将读到的AD值输出到电脑,发现也确实是AD会读到大量的0.不知道有没有谁遇到过,或者帮小北看下。下面贴上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_();
Delay(10);
}
/*
从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 {
}
}
return(rdata);
}
/*
从CS1231读取AD值数据,返回4字节的长整型数据Rdata
*/
unsigned char Data[4] = {0};
unsigned long longTemp;
long Get_AD_adcIC(){
unsigned int i;
long Rdata = 0;
//while(IO_ADC_DDAT); //读数据前确定数据线为低
IO_ADC_SCLK = 0; //此语句可确保在读AD值之前SCLK为低电平
for(i = 0; i < 3; i++) { //读到的3字节数据到在数组的元素:1~3
Data = Read_byte_adcIC();
}
Delay(1);
CS1231_Clk(); //向CS1231发送结束标志位
//IO_ADC_DDAT = 1;
// Rdata = result << 8;
Rdata = Data[2] << 8UL;
longTemp = Data[1];
Rdata |= longTemp << 16UL;
longTemp = Data[0];
Rdata |= longTemp << 24UL;
Rdata = Rdata / 256; // 24bit adc value
return(Rdata);
}
/*
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工作正常
}
|