AD7705采集数据不稳定

主控为STM32F107VC,7片AD7705用于采集PT100的信号,PT100为三线制,2.5V基准电压通过一个电阻串联到PT100,然后PT100上端接入AD7705的通道,下端接地。AD7705基准电压2.5V,电源5V。测量输入电压88mv左右。设置的参数如下:

程序运行后,输出的AD数据不稳定,刚开始全是65535,然后重新上电后,过几秒种输出数据是18410左右,和计算出来的值差不多,应该是正常值 ,但是运行一会后,输出 数据就全部是0或都一会18410,一会0.请问是什么原因?

u16 AD7705_AD[7][2];

u16 PT100_R[7];

u16 PT100_T[7];

void GPIO_AD7705(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOB, ENABLE);

  /* PC 11输入 MISO*/

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* PC 12输出 MOSI*/

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* PC 10输出 SCLK*/

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* PD 12输出 RST*/

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* PE 3,7,9,11,13,15 DRDY 1 2 3 4 5 6中断输入*/

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3|GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_15;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_Init(GPIOE, &GPIO_InitStructure);

  /* PD 10 DRDY 7中断输入*/

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* PB 2,10 输出 cs 1 6*/

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2|GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* PE 8,10,12,14 输出 cs 2 3 4 5*/

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_14;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_Init(GPIOE, &GPIO_InitStructure);

  /* PD 11 输出 cs 7*/

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

  SET_CS_AD7705_1;

  SET_CS_AD7705_2;

  SET_CS_AD7705_3;

  SET_CS_AD7705_4;

  SET_CS_AD7705_5;

  SET_CS_AD7705_6;

  SET_CS_AD7705_7;

}

/**AD7705复位**/

void Reset7705(u8 ch)

{

  unsigned char i;

  switch (ch)

  {

  case 1:{ CLR_CS_AD7705_1; break; }

  default:break;

  }

  Delay_1us(100);

  for(i=0;i<40;i++)

  { /* 多于连续32个 DIN=1 使串口复位 */

  CLR_CLK_AD7705;

  Delay_1us(20);

  SET_SDI_AD7705;

  Delay_1us(20);

  SET_CLK_AD7705;

  Delay_1us(20);

  }

  switch (ch)

  {

  case 1:{ SET_CS_AD7705_1; break; }

  default:break;

  }

}

/*等待DRDY变低*/

void AD7705_WaitDRDY_L(u8 ch)

{

  switch (ch)

  {

  case 1:{ while (INT_AD7705_H_1); break; }

  default:break;

  }

}

/*等待DRDY变高*/

void AD7705_WaitDRDY_H(u8 ch)

{

  switch (ch)

  {

  case 1:{ while (INT_AD7705_L_1); break; }

  default:break;

  }

}

/*

  功能:向AD7705写入一个字节

  ch:输入通道

  c :写入数据

*/

void WriteByte7705(u8 ch, u8 c)

{

  u8  tmp_8u,i;

  tmp_8u=c;

  switch (ch)

  {

  case 1:{ SET_CS_AD7705_1; SET_CLK_AD7705; Delay_1us(20); CLR_CS_AD7705_1; break; }

  default:break;

  }

  for(i=0; i<8; i++)

  {

  Delay_1us(10);

  CLR_CLK_AD7705;

  Delay_1us(10);

  if((tmp_8u&0x80)==0)

     CLR_SDI_AD7705;

  else

     SET_SDI_AD7705;

  tmp_8u <<= 1;

  Delay_1us(10);

  SET_CLK_AD7705;

  }

  Delay_1us(10);

  switch (ch)

  {

  case 1:{ SET_CS_AD7705_1; break; }

  default:break;

  }

}//WriteByte7705

/*

  功能:从AD7705读一个字节

  ch:输入通道

  返回8位数据

*/

u8 ReadByte7705(u8 ch)

{

  u8 i;

  u8 x=0;

  switch (ch)

  {

  case 1:{ SET_CS_AD7705_1; SET_CLK_AD7705; Delay_1us(20); CLR_CS_AD7705_1; break; }

  default:break;

  }

  for (i = 0,x=0 ; i < 16 ; i++)

  {

  CLR_CLK_AD7705;

  Delay_1us(10);

  x<<=1;

  if (SDO_AD7705_H)

  x |= 0x01;

  SET_CLK_AD7705;

  Delay_1us(10);

  }

  switch (ch)

  {

  case 1:{ SET_CS_AD7705_1; break; }

  default:break;

  }

  return x;

}

/*

  功能:从AD7705读一个字

  ch:输入通道

  返回16位数据

*/

u16 ReadWord7705(u8 ch)

{

  u8 i;

  u16 x=0;

  switch (ch)

  {

  case 1:{ SET_CS_AD7705_1; SET_CLK_AD7705; Delay_1us(20); CLR_CS_AD7705_1; break; }

  default:break;

  }

  for (i = 0 ; i < 16 ; i++)

  {

  CLR_CLK_AD7705;

  Delay_1us(20);

  x<<=1;

  if (SDO_AD7705_H)

  x |= 0x01;

  SET_CLK_AD7705;

  Delay_1us(20);

  }

  switch (ch)

  {

  case 1:{ SET_CS_AD7705_1; break; }

  default:break;

  }

  return x;

}

void AD7705_Configuration(void)

{

  /*初始化IO口*/

  GPIO_AD7705();

  DELAY_MS(10);

  /*硬件复位*/

  SET_RST_AD7705;

  DELAY_MS(1);

  CLR_RST_AD7705;

  DELAY_MS(2);

  SET_RST_AD7705;

  DELAY_MS(5);

  /*同步*/

  Reset7705(1);

  DELAY_MS(5);

  WriteByte7705(1, 0x20) ;                //通道1 ,下一个写时钟寄存器

  WriteByte7705(1, 0x04) ;                //写时钟寄存器设置更新速率为50Hz

  WriteByte7705(1, 0x10) ;                //通道1 ,下一个写设置寄存器

  WriteByte7705(1, 0x5C) ;                //写设置寄存器 ,设置成单极性、无缓冲、增益为8、滤波器工作、自校准

  AD7705_WaitDRDY_L(1);

  WriteByte7705(1, 0x21) ;                //通道2 ,下一个写时钟寄存器

  WriteByte7705(1, 0x04) ;                //写时钟寄存器设置更新速率为50Hz

  WriteByte7705(1, 0x11) ;                //通道1 ,下一个写设置寄存器

  WriteByte7705(1, 0x5C) ;                //写设置寄存器 ,设置成单极性、无缓冲、增益为8、滤波器工作、自校准

  AD7705_WaitDRDY_L(1);

}

/*获取AD*/

void GetAD7705Ad(u8 ch, u8 num)

{

  switch (ch)

  {

  case 1:

  {

  if (num == 1)

  {

  AD7705_WaitDRDY_L(1);

  WriteByte7705(1, 0x38);

  AD7705_AD[0][0] = ReadWord7705(1);

  AD7705_WaitDRDY_H(1);

  }

  else

  {

  AD7705_WaitDRDY_L(1);

  WriteByte7705(1, 0x39);

  AD7705_AD[0][1] = ReadWord7705(1);

  AD7705_WaitDRDY_H(1);

  }

  break;

  }

  }

}

Parents
No Data
Reply Children
No Data