已回答假定已回答

ADT7310读取数据波动较大?

ytj1981 在 2014-1-10 詢問的問題
最後回覆由adi_rock於2014-1-15提供

     通过ATMEGA88芯片采集AD7310的温度数据,能读取到数据,数据波动较大,与实际温度不符。ADT7310的配置按照官网参考手册。代码如下:

/*

     编译环境:ICCAVR7.0

     文件名:ADT7310.c

*/

/*

  ADT7310端口配置

*/

#define CS      PB2             //单片机对ADT片选信号端

#define MOSI PB3             //单片机输出端

#define MISO PB4             //单片机输入端

#define SCK  PB5             //单片机对ADT时钟信号

#define CS_OFF PORTB |= BIT(CS)//片选开

#define CS_ON PORTB  &= ~BIT(CS) //片选关

/*

  函数功能: SPI初始化

*/

void Spi_Init(void)

{

            //使能SPI,先发送MSB

           //主机模式,SPI工作在模式0,SCK工作频率为Fclk/4;

           SPCR = BIT(SPE) | BIT(MSTR) | BIT(CPOL) | BIT(CPHA);

}

/*

  函数功能: 向SPI写数据

*/

unsigned char Spi_WriteByte(unsigned  char data)

{

           SPDR = data;          //启动数据传输函数

          while(!(SPSR & BIT(SPIE)))                      //等待传输结束

                              ;                                            

          return  SPDR;

}

/*

  函数功能: 向ADT写两个字节

*/

void Write_ADT7310_Addr_Dat(unsigned char addr, unsigned char dat)

{

           CS_ON;

          Spi_WriteByte(addr);

          Spi_WriteByte(dat);

          delay(240);

          CS_OFF;

}

/*

  函数功能: 向ADT7310写配置数据

*/

void AD7310_Config(void)

{

            //配置为单次转换,精度13位 ,单次转换

           Write_ADT7310_Addr_Dat(0X08,0X20);

}

/*

  函数功能: 从指定地址,读取两个字节的温度

*/

unsigned int Read_AD7310_Tem(void)

{

           unsigned int data;

          CS_ON;

          Spi_WriteByte(0X50);

          data = Spi_WriteByte(0xFF);

          data = data << 8;

          data |= Spi_WriteByte(0xFF);

          CS_OFF;


          return data;

}

/*

  函数功能: 输出温度值

*/

unsigned int Temp(void)

{

          unsigned temp;

          temp = Read_AD7310_Tem();

          delay(20);

          if (temp < 0)

               temp = (temp - 8192)/16;

          else

               temp = temp / 16;


          return temp;

}

/*

  函数功能: ADT7310初始化

*/

void ADT7310_Init(void)

{

          AD7310_Config();

}


結果