로드셀 테스트 - 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 최종 수정 함수
로드셀 전압 측정을 위해 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;
}
{
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;
}
반응형