마하전자기술연구소 LOGO

제품검색 고객센터053-604-2355
기술자료실

Home > 기술자료실 기술자료실

제 목 27. PIC16F877 응용 NiCd 배터리 충방전기
첨부파일

 

                  최대 6개의 NiCd 배터리의 전압을 보면서 자동적으로 충전과
                  방전을 실시해 최적인 충전을 제어합니다. 1개씩 독립에 제어
                  하므로 최선 상태로 충전을 할 수 있습니다

 



PIC16F877 응용 NiCd 배터리 충방전기

PIC16F877의 A/D변환 기능을 이용해, 최대 6개의 배터리의
전압을 감시하면서 최적인 충전을 제어합니다.



【개요】

NiCd 배터리의 수명을 최대로 해, 출력 성능을 오래 가게 하기 위해서(때문에)는, 충전의
방법에 포인트가 있습니다.
거기서, PIC16F877에 새롭게 내장된, 10비트 분해가능의 A/D변환 기능을
유효하게 활용해, 개개의 배터리의 전압을 상시 체크하면서, 최선의 충전
(을)를 하도록(듯이) 제어하는 충전기를 만들어 보았습니다.
최선의 충전 조건으로 하기 위해서(때문에)는,memory effect(을)를 피할 필요가 있습니다. 거기서
이것을 피하기 위해서(때문에)방전 기능도 내장시키기로 했습니다.


【충방전기의 사양】

이번 제작한 NiCd 배터리의 충전, 방전 기능의 사양은 아래와 같이로 했습니다.

배터리 개수 최대 6 개개별 제어(1개씩 독립 제어)
대상 배터리단 3형 NiCd 전지(500 mAH~1000 mAH)
입력 전원 상용 AC100V 소비 전력 약 5 W
표시       16 문자 2행의 액정 표시기로 상태 표시
          표시 내용은 아래와 같이
            배터리 No   상태 충전, 방전 시간 배터리 전압
          또 충전중은 개개에 발광 다이오드가 점등
충전 전류    1개 당 약 85mA
방전 전류    1개 당 약 150mA at 1V

제어 방식 실제의 충전 방전의 제어는, NiCd 배터리의 충전, 방전 특성으로부터
          아래와 같이로 했습니다.
    방전 배터리가 장착된 것을 자동 인식해, 배터리 전압이 0. 9V
          이상이면 방전을 먼저 개시한다.
    충전 방전이 0. 9 V이하가 되면 자동적으로 충전에 바뀌어
          아래와 같이 3개의 조건의 어느쪽이든으로 충전 종료로 한다.
           (1) 충전 계속 시간이 15시간을 넘었다.
           (2) 배터리 전압이 1. 50 V를 넘었다.
           (3) 배터리 전압 상승률이 4%분을 넘었다.
             이것은 배터리의 만충전 부근에서 갑자기 단자전압이 상승한다
             일을 이용하고 있습니다.


【NiCd 배터리 충방전기의 구성】

본기의 전체 구성은 밑그림과 같이 되어 있습니다. 그림 중(안)에서 전체의 제어를 취해
나누고 있는 것은 PIC16F877로, 충전, 방전의 회로를 제외하면 PIC 밖에 없습니다.
PIC16F877는, 다양한 주변 회로가 내장되고 있으므로 편리하게 사용할 수 있습니다.
우선, 이 PIC로부터 내장된 10비트의 A/D변환으로 배터리의 전압계측을 합니다.
10비트 있기 때문에, 1024의 분해가능이 있게 됩니다.
거기서, Vref+의 기준 전압에 「2. 047 V」를 입력해, 전면적이 2. 047V
되도록 하면, 배터리 전압을 0~2. 047 V까지, 2 mV스텝에서 계측 성과
것이 됩니다. 이것이라면 충분히의 분해가능으로 배터리 전압을 계측 하는 것이 성과
. 종래의 8비트 정밀도에서는, 256의 분해가능 밖에 없고, 전압을 측정하려면 10 mV
단위가 한계이기 (위해)때문에, 조금 정밀도 부족했습니다만, 이것으로 충분히의 분해가능을 얻는다
일이 가능하게 되었습니다.




【충전 방전 회로】

배터리를 충전, 방전하는 회로의 부분은 밑그림과 같이 했습니다.

(1) 방전시의 회로
 방전 회로는, 방전 종지 전압(0. 9V)까지 확실히 방전할 수 있도록(듯이), MOS 트란
지스타와 저항의 직렬 회로로 쇼트 하도록(듯이) 했습니다.



그림과 같이 MOS 트랜지스터의 ON시의 저항은 0. 2Ω이하로 할 수 있기 때문에,
5Ω의 저항과 비교해도 충분히 낮고, 직렬로 해도, 충분히 전지를 방전시키는 것이 성과
.
방전 전류는, 배터리가 1 V때로, 1 V/5Ω=200 mA 흐를 것입니다만,
전지 자신의 내부 저항을 위해 실제로 흐르는방전 전류는 150 mA정도입니다.

대부분의 발열을 저항측에서 소비할 수가 있으므로, MOS 트랜지스터의 발열을
억제할 수가 있습니다. 그러나, 저항으로 거의 대부분의 방전을 실시하기 때문에, 모두열
(으)로 바뀝니다. 따라서 저항은 용량의 큰 것이 필요합니다.
여기에서는, 150mA×1 V=0.15 W이기 때문에, 조금 대나무눈의 1 W의 저항을 사용했습니다.
우도, 최근의 저항은, 1 W라고 해도 1/4 W타입의 저항과 크기는 남아 변함없고
되어 버렸으므로, 실장에 고생하는 것은 없을 것입니다.

여기서 방전 종지 전압을 몇 볼트로 할까입니다만, NiCd 배터리의 자료에 의하면
방전 특성은 밑그림과 같이 되어 있어 종지 전압을 0. 9 V~1. 0 V정도로 하는 듯
추천 되고 있습니다. 거기서,방전 종지 전압은 최저 전압의 0. 9V(으)로 했습니다.
그림으로 「C」는 배터리의 용량을 나타내고 있습니다. 예를 들면 500 mAh의 배터리라면
2 CmA=1000mA 그렇다고 하는 것입니다.





(2) 충전시의 회로
 충전 회로는 정전류 충전을 하기 위한(해), 정전류 회로가 되고 있습니다. 이 회로는 밑그림
의 회로로 실현되고 있습니다.




이 충전 회로에서는, 2 SC1815가 Off 되면(자), 2 SD415가 On가 되어 충전 전류가 흐름
시작합니다. 이 때의 전류는, 15Ω의 저항으로 제한됩니다만, 이 제한되는 내용
(은)는, 발광 다이오드(LED)와 트랜지스터의 BE간 전압으로 정해집니다.
이 양자의 전압은 전류에 관계없이 거의 일정으로, LED의 순서 전압= 약 2 V, 트란지
스튜디오 BE간 전압=0.7 V가 되고 있습니다.
그 때문에, 15Ω에서의 전압강하가,2-0. 7=1. 3V 이상이 되면(자) 트랜지스터의 베이스
전압이 외관상 내리기 (위해)때문에 CE간 전류를 작게 해 15Ω의 전압강하를 작게 합니다.
반대로, 15Ω에서의 전압강하가 작아지면(자), 베이스 전압이 올라 전류를 좀 더 흘리려고
합니다.

이 동작에 의해, 15Ω를 흐르는 전류는, (2 V-0. 7 V)/15Ω=85 mA 그리고 일정
됩니다. 즉충전 전류가 일정한 85 mA의 정전류가 된 것이 됩니다.

10 D1의 다이오드는 배터리로부터 역방향에 전류가 흘러 버리는 것을 방지합니다.
1kΩ의 저항은, 배터리의 전압 측정때, 방전도 충전도 중지해 측정하므로
배터리가 완전하게 개방 상태가 되어 버리는 것을 피하는 것과 배터리가 실장되어
없을 때, 측정 전압이 0 V가 되도록(듯이) 합니다.
200Ω의 저항은 발광 다이오드(LED)에 전류를 흘려 점 켜게 하는 기능을 합니다.

다음에 충전의 종료를 무엇으로 판단하면 최적인가라는 것이 됩니다.
이것도, NiCd 배터리의 충전 특성이 밑그림과 같이 되어 있기 때문에, 그림중에 불거져 나오고
해로 가리킨 것처럼, 3방법의 몇개의 조건을 넘으면(자) 충전을 끝냅니다.



【기준 전압 회로】

배터리의 전압을 측정하기 위해서, PIC의 A/D변환 기능을 사용하고 있습니다만, 이것의
전면적을 매듭짓는 레퍼런스 전압에는, 정밀도가 좋은 기준 전압이 필요합니다.
이번은, 기준 전압을 2. 047 V로 하기로 했으니까, 이것에 꼭 사용할 수 있는 기준
전압 발생용의 IC에는, 한 치 낡은 IC입니다만, 내셔널 반도체사의
LM336H-2. 5V」(이)가 사용할 수 있습니다.
이것을 사용한 기준 전압 회로는 밑그림과 같이 했습니다. LM336의 단자전압이 안정인
2. 5 V가 되므로, 그 전압을 저항과 볼륨으로 분할해, 2. 047 V에 조정 섬
. 이것으로, 안정인 기준 전압을 얻을 수 있던 것이 됩니다.
이것을 PIC의 RA3 단자에 접속해+의 레퍼런스 전압 그렇다면, 전면적이
2. 047 V의 A/D변환을 할 수 있게 됩니다.


【제작】

실제의 제작에는, 조금 큰 프린트 기판에 대부분의 회로를 짜넣어 버려
했다. 충전, 방전 회로가 6조 필요하게 되기 때문에, 이것이 대부분을 차지하고 있습니다.
우선 기판의 회로도는 밑그림과 같이 됩니다. 이것에 전원과 배터리 소켓을 외부에
추가해 케이스에 짜넣습니다.

 ★PIC16F877 응용 NiCd 배터리 챠쟈 회로도

왼쪽 사진이 전체의 외관으로, 알루미늄의 케이스에
모두를 짜넣었습니다.
상부에 금속제의 배터리 소켓으로 단 3을 2개씩의
물건을 3조 고정하고 있습니다. 한가운데는 액정 표시기입니다.


케이스 내부는 왼쪽 사진과 같이 커버 측에 기판을,
바닥 측에 전원 트랜스와 다이오드, 평활 콘덴서를
대놓고 사고 있습니다.

기판의 전체 외관입니다. 위쪽이 충방전 회로로 6조
있습니다. PIC는 액정 표시기의 아래 쪽이 되고 있습니다.

기판의 액정 표시기를 떼어냈는데.
PIC16F877가 중심이 되고 있습니다.

전원부. 트랜스는 5,6,7,8 V탭 부착으로
0.5 A의 출력 용량입니다. 조금 6개 전부
충전이 되었을 때에는 용량 기리기리입니다만
어떻게든 충분히 시간이 있습니다.

기판이 대놓고 사고는 칼라 스페이서로 띄워
액정 표시기가 핏타리샤시를 뒤따르도록(듯이)
대놓고 삽니다.


【프로그램 개요】

본배터리 챠쟈의 프로그램은 모두 CCS사의 C컴파일러로 작성했습니다. 그 때문에
의외로 간단하게 프로그램을 쓸 수가 있었습니다.
특히 액정 표시기에 표시 출력하려면 , printf문이 유효하게 활용할 수 있기 (위해)때문에, 매우 편하게
프로그램 할 수가 있었습니다.

전체는 본체의 프로그램과 액정 표시기 제어 라이브러리, 표준 헤더의 3개로 구성되고
(이)라고 있습니다. 표준 헤더 파일은, CCS C컴파일러안에 포함되어 있습니다.
그 외의 2개는 아래와 같이 되어 있습니다.

  ★PIC16F877 응용 NiCd 배터리 챠쟈 프로그램 리스트(C언어입니다)
  ★상기용 액정 표시기 제어 라이브러리


메인 프로그램부는, 스윗치의 입력 체크를 상시 반복하고 있어 입력이 있으면
각각의 처리를 실시합니다.
  스윗치 1:배터리의 선택으로 1~6을 사이클릭으로 전환합니다.
  스윗치 2:예비, 아무것도 하지 않고
  스윗치 3:상태의 갱신으로, 그 때에 선택되고 있는 배터리 상태를 차례차례 갱신
         합니다. 이 상태는 방전→충전→종료를 사이클릭에 반복합니다.

타이머 1의 새치기가 1초 마다 들어가도록(듯이) 세트 해, 매초의 새치기 처리로, 현재 선택중의
배터리 상태 표시를 갱신합니다. 이것으로 배터리 전압을 체크할 수가 있습니다.
또 전배터리 상태를 체크해, 조건이 갖추어지면 다음 상태에 진행됩니다.

   배터리 없음으로부터 배터리를 실장 → 전압을 체크해 0.9 V이상이라면 방전으로 한다
   방전중에 0. 9 V이하가 되었다   → 충전으로 한다
   충전 종료의 조건이 되었다     → 충전 종료로 한다
   전압이 0. 5 V이하가 되었다    → Non BAT(배터리 없음) 상태로 한다

또 1분 마다, 전배터리 상태를 체크해, 충전중인가, 방전중이면 각 배터리의
상태 계속 시간 타이머를 카운트업합니다.



   
≪프로그램 테크닉≫
 (1) 액정 표시기에의 표시 출력
   printf문을 아래와 같이 포맷으로 사용하는 것으로, 전압 표시도 간단하게 할 수 있었습니다. 여기서의
   lcd_data 함수는, 자작의 액정 표시기에 1 문자를 출력하는 함수로, 이와 같이 자작
   의 함수도 printf문의 출력 기기를 지정하는 포맷으로 잘 사용할 수가 있습니다.
   부동 소수점수(실수)도 printf문의 포맷문으로 간단하게 지정할 수가 있습니다.

  printf(lcd_data, "%2u", hour);      //time display
  lcd_data("H");
  printf(lcd_data, "%2u", minu);
  printf(lcd_data, "M %1. 3f V", value);  //voltage display

(2) 전압계측치의 부동 소수점수(실수)화
  배터리 전압을 측정하는데, 10비트의 A/D변환을 사용합니다만, 결과를 부동
  소수 점수로 취급하고 싶을 때에는, A/D변환의 입력을 float로 지정하면, 그대로
  부동 소수 점수로서 취급할 수가 있습니다. 아래와 같이로 data 변수를 float 지정해 둬
  data=read_adc();로 하는 것만으로 OK입니다.
  또 배터리의 전압을 계측 할 경우에는, 충전도 방전도 하지 않고 개방 전압을 측정
  할 필요가 있습니다. 그렇게 하지 않으면 정확한 배터리 전압을 측정할 수 없습니다.

 float mesure(int bat) {
   float data;       //redefine
   if(bat > 3)       //convert to port number
     bat=6-bat;      //Channnel adjust
   else
     bat=7-bat;
   set_adc_channel(bat);  //set channel
   delay_us(50);      //wait charging
   data = read_adc();    //get data
   return(data/500);    //return real voltage data
 }

(3) 키의 chattering의 회피
  이번 스윗치는 대나무눈의 누르는 보턴이었기 때문에 chattering 시간이 길고,
  거기에 따른 오동작을 회피하기 위해(때문에) 아래와 같이 했습니다.

 if(input(PIN_B0)==0) {
   delay_ms(100);
   if(input(PIN_B0)==0) {
     중략(여기에 키의 처리를 기술)
   }
 }

목록보기

www.1chip.com, www.1chip.co.kr
www.micom114.com
자료실바로가기

대구광역시 북구 산격2동 1629 산업용재관 10동 13호 (2층) / Tel. 053-604-2355 / Fax. 053-383-2354 / E-mail. maha@paran.com