F4读ADS1247转换值错误的问题

2019-07-21 02:01发布

最近在搞ADS1247,双通道,接两个铂电阻,这个是原理图:
现在读写控制寄存器都是可以的,但是读转换值一直不对,我先尝试的初始化一个通道,读一个通道
//使用到两个差分通道,初始化选择的通道
void InitADS1247(unsigned char channelx)
 {      ADS_START_0;
    ADS_RESET_0;
    delay_ms(10);
    ADS_RESET_1;
    delay_ms(20);
 
   ADS1247WREG(ADS1247_REG_MUX0,channelx);
  // ADS1247WREG(ADS1247_REG_MUX0,0x01);    //AIN0+     AIN1-
   //ADS1247WREG(ADS1247_REG_MUX0,0x13);   //AIN2+     AIN3-     delay_ms(20);
   ADS1247WREG(ADS1247_REG_MUX1,0x38);      // 00111000,bit7:启用内部晶振;bit6-5:内部参考电压一直打开;bit4-3:输入基准为片上基准,并且连接到REFP0;bit2-0:普通模式    (查看是否有1.5mA电流)
    delay_ms(20);
 ADS1247WREG(ADS1247_REG_VBIAS,0);   //偏置电压关闭(默认)    delay_ms(20);
   if(channelx==0x01)  ADS1247WREG(ADS1247_REG_IDAC1,0x01);         // 选择内部恒流源输出引脚    AIN0  AIN1
     else   ADS1247WREG(ADS1247_REG_IDAC1,0x23);            // 选择内部恒流源输出引脚    AIN2  AIN3
     delay_ms(20);
   //ADS1247WREG(ADS1247_REG_IDAC0,0x0f);     // DOUT/DRDY pin function both data out and data ready  并且1.5mA
     ADS1247WREG(ADS1247_REG_IDAC0,0x07);        //DOUT/DRDY pin functions only as Data Out (default)   并且1.5mA
  
   delay_ms(20);
   q=ADS1247RREG(ADS1247_REG_IDAC1);
   printf("测试:%x ",q);
   printf("测试:%d ",channelx);
   ADS1247WREG(ADS1247_REG_SYS0,0x79);  //128,2000sps
   delay_ms(20);
   //GPIO_SetBit(GPIOB,GPIO_Pin_15); //DIN拉高
  
 }
void ADS1247_getonechannel(void)
{
     u8 count=0;
     u8 a=1;
     k3=0;
      while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)&&a)     //PB14为 DRDY复用
   {
       count++;
       printf("B14:%d ",1);
          if(count>200){printf("B14超时 "); a=0;};           
      }    
     SPI_ADS1247_SendByte(ADS1247_CMD_RDATA);
      delay_ms(10);      ADH=SPI_ADS1247_SendByte(ADS1247_CMD_NOP);
     ADM=SPI_ADS1247_SendByte(ADS1247_CMD_NOP);
     ADL=SPI_ADS1247_SendByte(ADS1247_CMD_NOP);       k3|=ADH<<16|ADM<<8|ADL;
      printf("温度:%x ",k3); 
}
我在主程序中是初始化一次,读一个通道: #include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "mygpio.h"
#include "ads1247.h"
int main(void)
{
 //u32 t=0;
 uart_init(115200);   //串口波特率
  printf("串口OK ");
 delay_init(168);
  Control_Init();
 ADS1247_GPIO_init();
  SPI_ADS1247_Init(); 
  InitADS1247(channel1);          //初始化通道一,channel1=0x01
  ADS1247_getonechannel();            //读单通道       
 InitADS1247(channel2);     //初始化通道二,channel2=0x13
   ADS1247_getonechannel();          //读单通道
 
 ADS1247_Convdataget();    // 读两个通道   while(1)
  {
   GPIO_SetBits(GPIOD,GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1|GPIO_Pin_0); 
  printf("t:%d ",1);
    ADS1247_Convdataget();
  delay_ms(2000);
  GPIO_ResetBits(GPIOD,GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1|GPIO_Pin_0);
  printf("t:%d ",2);
    ADS1247_Convdataget();
  delay_ms(2000);
  }
}
但是读出来的数不正确,不知道哪边不对,麻烦原子哥帮看看。下面是读的时序:

另外,我还想连续读两个通道,但是看了这个时序图,有个地方不明白:   这边WREG是写控制寄存器的意思,但是这边又没说写哪个寄存器,ads1247有15个控制寄存器。 //初始化通道一,channel1=0x01 //初始化通道一,channel1=0x01
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
善良的二哥
1楼-- · 2019-07-21 06:19
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-07-21 09:02
帮顶。。。。。
善良的二哥
3楼-- · 2019-07-21 10:17
原子哥,顺便帮看看撒。。。。好几天了,领导一直催我进度,我却卡在这里。
正点原子
4楼-- · 2019-07-21 15:44
回复【3楼】善良的二哥:
---------------------------------
没用过哦,呵呵
善良的二哥
5楼-- · 2019-07-21 16:27
回复【4楼】正点原子:
---------------------------------
好的吧,不知道有没有其他兄弟姐妹用过的,指点一下,感谢!
八度空间
6楼-- · 2019-07-21 22:16
 精彩回答 2  元偷偷看……

一周热门 更多>