打印
[STC单片机]

iap15w413as单片机,cs1231 AD 芯片

[复制链接]
1878|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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工作正常
        
}






cs1231.png (32.47 KB )

cs1231.png

CS1231.pdf

668.38 KB

相关帖子

沙发
ningling_21| | 2015-4-23 16:17 | 只看该作者
程序中把那些0值过滤掉即可

使用特权

评论回复
板凳
lovezichao|  楼主 | 2015-4-23 17:47 | 只看该作者
ningling_21 发表于 2015-4-23 16:17
程序中把那些0值过滤掉即可

应用中可能还存在数值真的为0的情况,所以不可能单纯的过滤……

使用特权

评论回复
地板
lovezichao|  楼主 | 2015-4-23 17:58 | 只看该作者
本帖最后由 lovezichao 于 2015-4-23 18:01 编辑

将读AD函数改为下面这样处理,效果好很多。
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);
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎前辈指点,必将勇往直前。

31

主题

225

帖子

4

粉丝