BASIC4MCU | 질문게시판 | ads로 adc값을 읽는데
페이지 정보
작성자 라칸 작성일2024-09-05 15:38 조회183회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=23856
본문
ads1115로 adc값을 읽고서 센서값을 출력하는 중이고
값도 잘 읽어서 전압 변환하면 원하는값이 나오는 중입니다
그런데 센서를 일부러 빼고 이 상태일때는 센서값을 0으로 쓰려고하는데
이때 adc값이 5750~5850이 나오고 있습니다
그런데 연결중일때 adc값이 2000~14000 나오는데
연결되지 않았을때 읽어오는 값이 좀 많아서요 5780, 5768, 5805... 이렇게 다양하게 나와서요
이게 연결되지않았을때 adc값이 1,2개이면 그냥 아래처럼 센서값 2개 정도 포기하고 에러 취급하면 되는데
adc값이 왔다갔다하는게 너무 많아서요 좋은 구분 방법 없을까요?
저 범위를 다 막기에는 좀 그런데
int16_t iAdcValue = ADS1X15_readADC(&hads1115, ADS1X15_READ_1); if ((iAdcValue < 0 || iAdcValue == 12827 || iAdcValue == 12786) == 0) { fWindAdc = iAdcValue; ADS1X15_toVoltage(&hads1115, fWindAdc); }int16_t ADS1X15_readADC(ADS1X15 *ads, uint16_t readmode) { ADS1X15_requestADC(ads, readmode); uint32_t start = HAL_GetTick(); uint32_t timeout = (128 >> (ads->datarate >> 5)) + 1; // 적절한 타임아웃 계산 if (ads->mode == ADS1X15_MODE_SINGLE) { while (ADS1X15_isBusy(ads)) { if ((HAL_GetTick() - start) > timeout) { // 타임아웃 발생, 에러 처리 return ADS1X15_ERROR_TIMEOUT; } } } else { HAL_Delay(ads->conversionDelay); // 변환 지연 시간 } int16_t value = ADS1X15_getValue(ads); return value; } float ADS1X15_toVoltage(ADS1X15* ads, int16_t value) { if (value == 0) return 0.0f; float volts = ADS1X15_getMaxVoltage(ads); if (volts < 0) return volts; volts *= value; if (ads->config & ADS_CONF_RES_16) { volts /= 32767.0f; } else { volts /= 2047.0f; } return volts; } float ADS1X15_getMaxVoltage(ADS1X15* ads) { switch (ads->gain) { case ADS1X15_PGA_6_144V: return 6.144f; case ADS1X15_PGA_4_096V: return 4.096f; case ADS1X15_PGA_2_048V: return 2.048f; case ADS1X15_PGA_1_024V: return 1.024f; case ADS1X15_PGA_0_512V: return 0.512f; case ADS1X15_PGA_0_256V: return 0.256f; default: ads->error = ADS1X15_INVALID_VOLTAGE; return ads->error; } }
댓글 1
조회수 183master님의 댓글
master 작성일
플로팅 한 상태에서 값이 널뛰는 것은 당연합니다.
회로를 모르니 자세한 조언을 드릴 수는 없고
10M옴 풀업저항을 넣어도 오차 범위내에 든다면 값이 0옴쪽으로 안정하는데 도움이 될겁니다.
물론 10M옴보다 1M옴이 노이즈에 더 좋으며
100K나 10K옴이 훨씬 좋지만
값이 적어질 수록 영향을 더 줘서 오차범위를 벗어날 수도 있으니 실험을 하거나 회로를 체크해야 합니다.