BASIC4MCU | 질문게시판 | esp32 배터리 잔량 공부중입니다..
페이지 정보
작성자 펌린이 작성일2024-09-06 22:12 조회1,160회 댓글6건본문
안녕하세요
esp32 c3 모듈로 리튬 배터리 잔량 체크 공부 중인 학생입니다
int val=analogRead(A4);val=analogRead(A4);for(int i=0;i<100;i++){ sum+=analogRead(A4); }val=sum/100;int volt=map(val,0,4095,0,100);Serial.print(val); Serial.print(",analog : "); Serial.print(volt); Serial.println("Percent")esp32는 tp4065에 물리기 전 100k 100k 전압분배로 adc에서 읽습니다.위에 코드는 제가 이해하기로는 ADC값이 0~4095 사이일때 그 값을 0~100으로 나누는 map 함수를 사용한건데전압분배로 나왔을때에 3.7V 최대는 1.85V라고 계산이 되더군요그러면 1.85V MAX일때 4095 출력인 것인 것으로 이해가 됩니다그런데 소스코드를 업로드하고 나오는 결과는3054,analog : 74Percent 에서 계속 멈추고 있는 상황입니다.제 계산이 잘못된 것일까요?구글링을 해봤을땐 1024인 esp86 시리즈로 되어 있는데전압분배 저항도 다르고 보정하는 소스도 있어서 어렵습니다..
댓글 6
조회수 1,160master님의 댓글
master 작성일
3.3V 시스템에서는 3.3V 이상의 전압을 입력받지 못하므로 100K 두개 사용해서 최대 6.6V를 입력 받을 수 있게 만든 것입니다.
리튬배터리는 3.7V가 최대전압이 아니고 4.2V가 만충전 전압입니다.
3.7V는 정격전압이죠
//
퍼센트 연산이 코드에 포함되어 있지 않으나 val*100.0/4095.0 인 것으로 보입니다.
//
3054,analog : 74Percent
3054라는 값이 보이는 것으로 봐서는 1024(10비트) 분해능이 아닌 4096(12비트) 분해능이 맞습니다.
master님의 댓글
master 작성일
4.2V 입력이 최대인데 6.6V까지 입력받을 수 있도록 만들면 4.2V~6.6V 사용하지 않는 구간이 커서 오차가 증가합니다만
전압분배까지 설명하기엔 글이 길어지므로
전압분배를 공부해서 최대입력이 4.5V 정도가 되도록 저항값을 변경해보시고
//
최대값 구하는 비례식은 4.2/6.6=ADC/4095
4.2V에서의 ADC 값은 2605.9 입니다.
int val=sum/100;
int volt=map(val,0,4095,0,100);
Serial.print(val); Serial.print(",analog : "); Serial.print(volt); Serial.println("Percent")
위 코드를 아래처럼 변경 해보죠
float adc=sum/100.0;
if(adc>2605.9)adc=2605.9; // 4.2V가 넘으면 4.2V로
float volt=adc*4.2/2605.9;
float Percent=adc*100.0/2605.9;
Serial.print(adc); Serial.print(" adc, "); Serial.print(volt); Serial.println(" V, ") Serial.print(Percent); Serial.println("%")
단순한 비례식이니 어렵지 않을겁니다.
저항값 구하는 것은 답글로 적어드리죠
펌린이님의 댓글
펌린이 작성일
안녕하세요 시간 내주셔서 정말 감사합니다!!
보내주신 코드를 적용해서 ThingSpeak 모니터링 시스템을 확인해보니
ADC : 2119, Volt : 3.4V Percent : 81%에서 동작을 정지하였습니다.
돌아와서 이번엔 멀티미터로 회로를 직접 찍어봤는데
배터리는 4V, 전압분배 후는 1.9V . ADC값은 2868로 찍힙니다.
" if(adc>2605.9)adc=2605.9; // 4.2V가 넘으면 4.2V로 "
기존 주셨던 코드로는 2605이상이 되면 4.2V로 인식하고 2605가 최대값으로 설정해놨기때문에 아마 정상적인 값으로 진행되진 않은 것 같습니다.. 하하 왜 그런건지
공부용으로 PCB를 제작해본 상황이라 다른 전압분배 저항을 사용하지 못하네요 미리 공부를 했어야했는데..
제가 이해하기로는
말씀주신 "최대값 구하는 비례식은 4.2/6.6=ADC/4095 4.2V에서의 ADC 값은 2605.9 입니다." 이 내용이 아닌
배터리는 최대 완충 전압시 4.2V이고 ESP에서 ADC로 연결되는건 4.2V의 전압분배 이후 전압 2.1V 입니다.
그렇다면 비례식을 최소동작전압/2.1V=ADC/4095 작성해야하는것일까요? 아니면 아직 제가 이해를 못한건지..
시간내서 가르침 주셔서 감사합니다. 한번 더 부탁드립니다!!
master님의 댓글
master 작성일
"전압분배 후는 1.9V . ADC값은 2868로 찍힙니다."
ESP32 ADC가 쓰레기라는 글을 봤습니다만 위에 적은 것처럼 엉터리라면 사용하지 못합니다.
위 글에 대한 설명만 적어보겠습니다.
3.3V 아나로그 레퍼런스 전압에서는
3.3V일 때 4095입력이므로
1.9V/3.3V = ADC값/4095
ADC값 = 4095 * 1.9V/3.3V = 2357.727272727273
2357이 나와야 하는데 2868로 찍힌다면 오차가 큰 수준을 넘어서 사용하지 못할 정도입니다.
2868일 때 몇V인지 거꾸로 계산해보죠
2868/4095 = adc전압/3.3V
adc전압 = 3.3V * 2868/4095 = 2.311208791208791V
1.9V를 2.3V라고 하면 17% 오차이고, 이런 큰 오차는 12비트 adc라고 볼 수가 없습니다.
펌린이님의 댓글
펌린이 작성일
아니면 4095가 아닌 완충시(2.1V) 에 찍히는 ADC 값을 측정해놓고 퍼센테이지를 구하는게 맞을 수도 있겠단 생각이 듭니다.
위 코드로 동작 정지했을때의 ADC값은 2119 였으니 2119:0=완충ADC값:100으로 퍼센테이지를 나누는 방법도 듭니다
펌린이님의 댓글
펌린이 작성일전압분배 이후 4.2V 에서는 2.1V , ESP32 동작전압인 3.3V에서 1.65V