'ADS1216'에 해당되는 글 2건

  1. 2012.02.04 로드셀 테스트 - 24bit ADC ADS1216 (2)
  2. 2008.11.18 [개발일지] ADS1216 테스트
[SENSOR]/Sensor2012. 2. 4. 20:58

로드셀 테스트 - 24bit ADC ADS1216

로드셀 테스트 - 24bit ADC ADS1216

로드셀 전압 측정을 위해 128PGA를 가진 24bit ADC(ADS1216)을 이용했다.
ADS1216 테스트는 끝내고 실제 로드셀을 연결하여 테스트 했다.

로드셀 연결하고 A0+, A0- 값을 테스트기로 읽어 보면 0.8mV정도 출력되고 힘으로 누르면 1.2mV정도 까지 변화하는것을 확인할 수 있다.

하지만 ADC로 값을 읽었을때는 값이 아주 낮게 출력되는데...
adc=FA, 250
adc=F8, 248
adc=E7, 231
아무래도 임피던스 문제가 아닐까?

BUFEN 을 On/Off 해도 동일하다. BURNOUT Current는 뭔가 차이는 있는것 같지만 원하는 값은 나오지 않는다.

캘리브레이션 이슈일까?
별 도움이 안된다.



문제는 PGA Gain이었다. Gain을 올리니 잘 동작한다.
128까지 가능한데 일단 64로 해서 테스트 했다.

0.9mV에서 1.2mV까지 uV단위로 잘 출력되는것을 확인했다.

adc=BFF6A, 786282 (915.232248uV)
adc=C003B, 786491 (915.475524uV)
adc=DFFCA, 917450 (1067.911800uV)
adc=E0014, 917524 (1067.997936uV)
adc=FFF5A, 1048410 (1220.349240uV)
adc=FFF24, 1048356 (1220.286384uV)
adc=FFFB2, 1048498 (1220.451672uV)


계산식은
1250(mV)/16777215/64 = 1.164uV

adc = ADS1216_Read(0);
DebugPrint("adc=%X, %d(%fuV)\r\n", adc, adc, (float)(adc)*0.001164); 

손으로 꽉 눌러야 값의 변화를 확인할 수 있다. 센서자체의 레졸루션이 낮은것 같은데...
일단 128로 증폭해 보자

128로 하니 좀더 좋다. 그래프로 표시해서 발로 밟아 보면 확실하게 차이를 확인 할 수 있다. 로드셀 자체가 저렴해서 그런지 해상도는 그리 좋은건 아닌것 같다.


로드셀 테스트 동영상




ADS1216 read/write 최종 수정 함수
void ADS1216_WriteReg(unsigned char Reg, unsigned int Data)
{
    unsigned char h=0, l=0;
   
    ADS1216_CS_ASSERT();

    ADS1216_SPI_READ(0x50|(0x0F&Reg));
    ADS1216_SPI_READ(0);
   
    Delay_us(25);
   
    ADS1216_SPI_READ(Data&0xFF);   
 
    ADS1216_CS_DEASSERT();
}

unsigned int ADS1216_ReadReg(unsigned char Reg)
{
    unsigned int ret=0;
   
    ADS1216_CS_ASSERT();

    ADS1216_SPI_READ(0x10|(0x0F&Reg));
    ADS1216_SPI_READ(0);
   
    Delay_us(25);
        
    ret = ADS1216_SPI_READ(0);   
   
    ADS1216_CS_DEASSERT();
 
    return ret;
}
Posted by nexp

댓글을 달아 주세요

  1. lim

    로드셀 부품번호좀 올려주시면 안될까요

    2012.04.22 17:44 [ ADDR : EDIT/ DEL : REPLY ]
    • 체중계에 있는것 테스트 한것입니다.
      고장나서 센서 때서 테스트 했습니다.
      (만원짜리 체중계 입니다.)

      2012.04.25 00:35 신고 [ ADDR : EDIT/ DEL ]

[MODULE]/AD/DA2008. 11. 18. 09:54

[개발일지] ADS1216 테스트

[개발일지] ADS1216 테스트


로드셀 데이터를 읽어 무게값을 측정하기 위해 SensorMat 프로젝트에 적용한 ADS1216 를 테스트 중이다.


데이터 시트 보고 진행하고 있는데... 정상적으로 동작을 하지 않는다. 

설계전에 데이터시트 꼼꼼히 봐야 하는데...
Vref 는 AVDD를 5V로 입력시 2.5V, 3.3V로 입력시 1.25V까지 가능하다고 한다.



레지스터 읽고 부분은 정상 동작하는것 같다.
반드시 두바이트를 읽어야 하고 두번째 바이트가 의미 있는 값이된다.
이부분이 이상하다. 1바이트만 읽으면 다음 클럭에서 정상 값이 출력된다.

unsigned int ADS1216_ReadReg(unsigned char Reg)
{
    unsigned char h=0, l=0;
   
    ADS1216_CS_ASSERT();

    ADS1216_SPI_READ(0x10|(0x0F&Reg));
    ADS1216_SPI_READ(1);
   
    Delay_us(4);
        
    h = ADS1216_SPI_READ(0);
    l = ADS1216_SPI_READ(0);    
    
    ADS1216_CS_DEASSERT(); 
  
    return l;
}


일단 0~15레지스터 값을 읽어보면 데이터시트의 값과 동일하게 출력되는것을 볼 수 있다.
reg[0]=008E
reg[1]=0001
reg[2]=0000
reg[3]=0000
reg[4]=0000
reg[5]=0000
reg[6]=0000
reg[7]=00FF
reg[8]=0080
reg[9]=0007
reg[10]=0000
reg[11]=0000
reg[12]=0000
reg[13]=0024
reg[14]=0090
reg[15]=0067


계속되는 실험으로 동작은 하긴 하지만 데이터 시트 내용과 좀 다른 부분이 있다.
레지스터 쓰기는 1바이트가 가능하다.
void ADS1216_WriteReg(unsigned char Reg, unsigned int Data)
{
    unsigned char h=0, l=0;
   
    ADS1216_CS_ASSERT();

    ADS1216_SPI_READ(0x50|(0x0F&Reg));
    ADS1216_SPI_READ(0);
   
    Delay_us(4);
   //ADS1216_SPI_READ(Data>>8);
    ADS1216_SPI_READ(Data&0xFF);    
     
    ADS1216_CS_DEASSERT();
}


ADC 데이터값는 이상하게 올라온다.
DRDY를 찍어보니 계속 High가 나온다.  데이터시트를 다시한번 확인해 봐야 할것 같다.



The DRDY output is used as a status signal to indicate when data is ready to be read from the ADS1216. DRDY goes low when new data is available. It is reset high when a read operation from the data register is complete. It also goes high prior to the updating of the output register to indicate when not to read from the device to ensure that a data read is not attempted while the register is being updated.

DSYNC is used to provide for synchronization of the A/D conversion with an external event. Synchronization can be achieved either through the DSYNC pin or the DSYNC command. When the DSYNC pin is used, the filter counter is reset on the falling edge of DSYNC. The modulator is held in reset until DSYNC is taken high. Synchronization occurs on the next rising edge of the system clock after DSYNC is taken high.

/DSYNC 핀이 High 일때 DRDY신호가 출력 된다고 한다. Low이면


한채널에 대해서는 정상 동작 했는데...
채널 바꾸니 좀 이상하다.. 채널 바꾸고 레지스터 값을 읽어보면 이상한 값들이 읽혀진다.
래자스터값 읽거나 쓸때 딜레이값을 주니 정상동작한다. 한바이트씩 읽고 쓰는것이 가능하다.

Ref 변경하고 또 정상적인 값이 들어오지 않아 코드를 살펴보니 Setup레지스터의 값을 잘못 설정했다.
ByteOder을 변경하고 말았네..
//ADS1216_WriteReg(ADS1216_SETUP, 0x8B); 
-> ADS1216_WriteReg(ADS1216_SETUP, 0x8A);

수정 후 정상 동작한다.

0~Vref까지 값이 잘 들어온다.


그런데 채널 변경시 변경 시간이 오래 거리는것 같다.
현재 보드가 없어 테스트를 진행하지 못하는데... 정확한 원인을 파악해 봐야 할것 같다.


Posted by nexp

댓글을 달아 주세요