微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ADS1118 通道不对了?

ADS1118 通道不对了?

时间:10-02 整理:3721RD 点击:

主控芯片MSP430F6638,ADC芯片是ADS1118,现在发现只读取某一个通道的电压值是对的,如果在程序中读取多路电压的话,会出现通道错位的现象,CPU在1M的时候,通道0的数据跑到了通道1上,1到2上,2到3上,3到0上,4M的时候0上的电压到通道2,3上,2上的数据到通道0,1上。程序如下:

void __DELAY(u32 n)
{
   u32 m=4*n;
   while(m--);
};

void SPIA1_Init(void)
{
    P8SEL |= BIT1+BIT2+BIT3;                      // Assign P8.1 to UCB0CLK and...
    P8DIR |= BIT0+BIT1+BIT2;                     // P8.3 UCB0SOMI P8.2 UCB0SIMO

    UCA1CTL1 |= UCSWRST;                      // **Put state machine in reset**
    UCA1CTL0 |= UCMST+UCSYNC+UCMSB;    // 3-pin, 8-bit SPI master
                                              // Clock polarity high, MSB
    UCA1CTL1 |= UCSSEL__SMCLK;                     // SMCLK
    UCA1BR0 = 106;                         
    UCA1BR1 = 0;                              //
    UCA1MCTL = 0;                             // No modulation
    UCA1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
 //       UCA1IE = UCRXIE+ UCTXIE;                         // Enable USCI_A0 RX,TX interrupt
}

/*MODE 0: Only write config regist to ADS1118
  MODE 1: Write config regist to ADS1118 as well as read data from ADS1118
*/
int ADS1118_WriteSPI(u32 config,u8 mode)
{
  u32 temp;
  temp=config;
  if(mode==1)
  temp=config|0x8000;
  int msb;
  //while(UCA1STAT&UCBUSY);
  while (!(UCA1IFG&UCTXIFG));
    UCA1TXBUF = (temp>>8);
   __DELAY(100);
  //while(UCA1STAT&UCBUSY);
  while (!(UCA1IFG&UCRXIFG));
        msb = UCA1RXBUF;           
  while (!(UCA1IFG&UCTXIFG));
   //while(UCA1STAT&UCBUSY);   
    UCA1TXBUF = (temp & 0xff);
   __DELAY(100);
  while (!(UCA1IFG&UCRXIFG));
  //while(UCA1STAT&UCBUSY);
        msb = (msb<<8) | UCA1RXBUF;      
  return msb;
}

void ADS1118_Config(u32 temp_congfig_value)
{
  u32 config_value=temp_congfig_value;
  CLR_AD_CS;               //set CS low
 __DELAY(100);    //Wait for slave to initialize
  ADS1118_WriteSPI(config_value,0);  //Write configuration to ADS1118
  __DELAY(100);
  SET_AD_CS;
}

int ADS1118_Read(u32 temp_config_value)
{
  int DATA;
  u32 config_value=temp_config_value;
  CLR_AD_CS;
  __DELAY(100);
  DATA = ADS1118_WriteSPI(config_value,1);
  __DELAY(100);
  SET_AD_CS;
  return DATA;
}

int ADS1118(u32 temp_congfig_value)
{
  u32 config_value=temp_congfig_value;
  int result;
  SET_AD_CS;
  ADS1118_Config(config_value);
  __DELAY(1000);
  result = ADS1118_Read(config_value);
  return result;
}

int GetADC_0(void)
{
    //return ADS1118(0x458B);
    return ADS1118(0xC58B);
}

int GetADC_1(void)
{
    //return ADS1118(0x558B);
    return ADS1118(0xD58B);
}

int GetADC_2(void)
{
    //return ADS1118(0x658B);
    return ADS1118(0xE58B);
}

int GetADC_3(void)
{
    //return ADS1118(0x758B);
    return ADS1118(0xF58B);
}

建议转到MCU论坛,以便代码得到进一步的分析。硬件问题的话,建议先从一个通道调试,得到正确的结果后,再对第二个通道,然后只正对第一第二通道进行调试。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top