이 프로젝트에서는 PCB에 PIC 기반 자동차 배터리 모니터링 시스템 을 만들 것 입니다. 여기에서는 EASYEDA 온라인 PCB 시뮬레이터 및 디자이너를 사용하여 PCB를 설계했습니다. 이 자동차 배터리 모니터링 회로 는 자동차 대시 보드의 전원 콘센트에 꽂기 만하면 자동차 배터리의 전력을 모니터링하는 데 사용됩니다. 또한 PCB 에는 USB 차량용 충전기를 사용하지 않고 전압 측정 도구 또는 전압계 로 사용할 수있는 옵션이 있습니다. 여기에 터미널 블록을 연결하여 전원에서 두 개의 와이어를 연결하여 다른 전원의 전압을 측정했습니다.
필요한 구성 요소:
- PIC 마이크로 컨트롤러 PIC18F2520-1
- 조립 된 PCB 보드 -1
- USB 커넥터 -1
- 2 핀 터미널 커넥터 (옵션) -1
- 공통 양극 7 세그먼트 디스플레이 (4 in 1) -1
- BC557 트랜지스터 -4
- 1k 저항 -6
- 2k 저항 -1
- 100R 저항 -8
- 1000uF 커패시터 -1
- 10uF 커패시터 -1
- 28 핀 IC베이스 -1
- 여성 burgsticks -1
- 7805 전압 조정기 -1
- 차량용 USB 충전기 -1
- LED -1
- 제너 다이오드 5.1v -2
- USB 케이블 (B 형 또는 Arduino UNO 호환 가능) -1
- 20MHz 크리스탈 -1
- 33pF 커패시터 -2
기술:
일반적으로 자동차 배터리 전력을 매번 측정하는 것은 중요하지 않지만 충전 중 배터리 전압을 알아야 충전 여부를 확인하는 경우가 많습니다. 이를 통해 충전 시스템의 결함으로 인한 배터리 고장을 보호 할 수 있습니다. 충전 중 12v 자동차 배터리의 전압은 약 13.7v입니다. 따라서 배터리가 잘 충전되는지 여부를 식별하고 배터리 고장의 원인을 조사 할 수 있습니다. 이 프로젝트에서는 PIC 마이크로 컨트롤러를 사용하여 자동차 배터리 용 전압 측정기 를 구현할 것 입니다. Car Cigarette Lighter 또는 Car USB 충전기 는 Voltage Divider Circuit의 도움으로 마이크로 컨트롤러의 ADC 핀에 배터리 전압을 공급하는 데 사용됩니다. 그런 다음 4 자리 7 세그먼트 디스플레이배터리의 전압 값을 표시하는 데 사용됩니다. 이 회로는 최대 15v의 전압을 측정 할 수 있습니다.
자동차 배터리가 충전되면 배터리 단자의 전압이 실제로 교류기 / 정류기에서 나오기 때문에 시스템이 13.7V를 읽는 것입니다. 그러나 배터리가 충전되지 않거나 자동차의 엔진이 켜지지 않으면 배터리 단자의 전압은 실제 배터리 전압 약 12v입니다.
최대 15v까지 다른 전원의 전압을 측정하기 위해 동일한 회로를 사용할 수도 있습니다. 이를 위해 PCB에 터미널 블록 (녹색 플라스틱 블록)을 납땜하여 전원에서 두 개의 와이어를 연결하고 전압을 모니터링 할 수 있습니다. 마지막에 비디오 를 확인하십시오. 가변 전원 공급 장치, USB 전원 은행 및 12v AC-DC 어댑터의 전압을 측정하여 시연 한 곳입니다. 또한 단순 배터리 모니터 회로 및 12v 배터리 충전기 회로를 확인하십시오.
회로도 및 작동 설명:
이 배터리 전압 모니터링 회로 에서는 PIC 마이크로 컨트롤러의 내장 된 아날로그 핀을 사용하여 자동차 배터리 전압을 읽었으며 여기서는 전압 분배기 회로를 통해 마이크로 컨트롤러의 핀 AN0 (28) 핀을 선택했습니다. 5.1v의 제너 다이오드도 보호를 위해 사용됩니다.
4 in 1 7 세그먼트 디스플레이는 마이크로 컨트롤러의 PORTB 및 PORTC에 연결된 자동차 배터리 전압의 순간 값을 표시하는 데 사용됩니다. 5v 전압 조정기, 즉 LM7805는 Seven Segment Display를 포함한 전체 회로에 전원을 공급하는 데 사용됩니다. 20MHz 수정 발진기는 마이크로 컨트롤러를 클럭하는 데 사용됩니다. 회로는 LM7805를 사용하여 USB 차량용 충전기 자체로 전원이 공급됩니다. PCB에 USB 포트를 추가하여 차량용 USB 충전기를 회로에 직접 연결할 수 있습니다.
차량용 USB 충전기 또는 시가 라이터 는 차량 의 12v 전원 콘센트에서 5v 정격 전원을 제공하지만 차량용 배터리의 실제 전압을 측정해야하므로 차량 충전기를 조정했습니다. 자동차 USB 충전기를 열고 5v (출력) 및 12v (입력) 단자를 찾은 다음 사포 나 딱딱한 물건으로 문질러 5v 연결을 제거하고 USB 출력 단자를 12v로 직접 단락시켜야합니다. 먼저 차량용 USB 충전기의 USB 포트에서 5v 연결을 연 다음 12v를 5v가 연결된 USB 포트에 연결합니다. 아래 그림과 같이 빨간색 원으로 표시된 연결을 잘라 냈으며 차량 충전기에 따라 다를 수 있습니다.
여기에서 ADC를 구성하기 위해 ADC 변환을 위해 내부 기준 전압이 5v이고 f / 32 클럭 인 아날로그 핀 AN0을 선택했습니다.
ADC 값에서 자동차 배터리 전압을 계산하기 위해 다음 공식을 사용했습니다.
전압 = (ADC 값 / 저항 계수) * 기준 전압 여기서: ADC 값 = 전압 분배기의 출력 (마이크로 컨트롤러에 의해 디지털로 변환 됨) 저항 계수 = 1023.0 / (R2 / R1 + R2) // 1023은 최대 ADC 값 (10- 비트) 기준 전압 = 5V // 내부 5V 기준 선택
저항 계수 계산:
이 프로젝트에서 우리는 (일반적으로) 약 12v-14v 인 자동차 배터리 전압을 읽고 있습니다. 그래서 우리는 최대 15v가이 시스템을 최대 15v까지 읽을 수 있음을 의미한다고 가정하여이 프로젝트를 수행했습니다.
따라서 회로에서 전압 분배기 부분에 R1 및 R2 저항을 사용했으며 값은 다음과 같습니다.
R1 = 2K
R2 = 1K
저항 계수 = 1023.0 * (1000 / 2000 + 1000)
저항 계수 = 1023.0 * (1/3)
저항 계수 = 341.0 (최대 15V)
따라서 전압 계산에 대한 최종 공식은 다음과 같으며이 문서의 끝에 제공된 코드를 사용했습니다.
전압 = (ADC 값 / 341.0) * 5.0
EasyEDA를 사용한 회로 및 PCB 설계:
자동차 배터리 전압 모니터 용 회로 를 설계하기 위해 회로와 PCB를 원활하게 생성하기위한 무료 온라인 EDA 도구 인 EasyEDA를 사용했습니다. 우리는 이전에 EasyEDA에서 PCB를 거의 주문하지 않았고 회로 그리기에서 PCB 주문에 이르기까지 전체 프로세스를 발견함에 따라 여전히 서비스를 사용하고 있으며 다른 PCB 제조업체에 비해 더 편리하고 효율적입니다. EasyEDA는 회로 도면, 시뮬레이션, PCB 설계를 무료로 제공하며 고품질이지만 저렴한 가격으로 맞춤형 PCB 서비스를 제공합니다. 회로도, PCB 레이아웃, 회로 시뮬레이션 등을 위해 Easy EDA를 사용하는 방법에 대한 전체 자습서를 확인하십시오.
EasyEDA는 매일 개선되고 있습니다. 그들은 많은 새로운 기능을 추가하고 전반적인 사용자 경험을 향상시켜 EasyEDA를 회로 설계에 더 쉽고 유용하게 만듭니다. 곧 오프라인 사용을 위해 컴퓨터에 다운로드하여 설치할 수있는 데스크톱 버전을 출시 할 예정입니다.
EasyEDA에서는 다른 사용자가 복사 또는 편집하고 이점을 얻을 수 있도록 회로 및 PCB 설계를 공개 할 수 있습니다. 또한이 자동차 배터리 전압 모니터에 대해 전체 회로 및 PCB 레이아웃을 공개했습니다. 아래 링크를 확인하십시오.:
easyeda.com/circuitdigest/PIC_based_Car_Battery_Monitoring_System-63c2d5948eaa48c5bcbbd8db49a6c776
아래는 EasyEDA의 PCB 레이아웃의 상단 레이어 스냅 샷이며, '레이어'창에서 레이어를 선택하여 PCB의 모든 레이어 (Top, Bottom, Topsilk, bottomsilk 등)를 볼 수 있습니다.
온라인 PCB 샘플 계산 및 주문:
PCB 설계를 완료 한 후 Fabrication output 아이콘을 클릭 하면 PCB 주문 페이지로 이동합니다. 여기에서 Gerber Viewer에서 PCB를 보거나 PCB의 Gerber 파일을 다운로드하여 모든 제조업체에 보낼 수 있으며 EasyEDA에서 직접 주문하는 것이 훨씬 쉽고 저렴합니다. 여기서 주문하려는 PCB 수, 필요한 구리 층 수, PCB 두께, 구리 무게 및 PCB 색상까지 선택할 수 있습니다. 모든 옵션을 선택한 후 "카트에 저장"을 클릭하고 주문을 완료하면 며칠 후 PCB를 받게됩니다.
이 PCB를 직접 주문하거나이 링크를 사용하여 Gerber 파일을 다운로드 할 수 있습니다.
PCB 주문 후 며칠 후 PCB 샘플을 받았습니다.
PCB를 얻은 후 필요한 모든 구성 요소를 PCB 위에 장착하고 마지막으로 자동차 배터리 모니터링 시스템을 준비했습니다. 마지막에 제공된 비디오에서이 회로가 작동하는지 확인합니다.
프로그래밍 설명:
이 프로젝트의 프로그램은 초보자에게는 조금 어렵습니다. 이 코드를 작성하려면 헤더 파일이 필요합니다. 여기에서는 코딩에 MPLAB X IDE를 사용하고 코드를 빌드하고 컴파일하기 위해 XC 컴파일러를 사용합니다. 코드는 C 언어로 작성되었습니다.
이 코드에서는 아날로그 핀을 사용하여 배터리 전압을 읽었으며 데이터를 제어하거나 4 자리 7 세그먼트 디스플레이로 전송하기 위해 PIC 마이크로 컨트롤러에서 Timer Interrupt Server Routine을 사용했습니다. 전압 측정을위한 모든 계산은 메인 프로그램 루틴에서 수행됩니다.
먼저 코드에 헤더를 포함시킨 다음 구성 비트를 사용하여 PIC 마이크로 컨트롤러를 구성했습니다.
#포함
그리고 선언 된 변수와 7 개 세그먼트에 대해 정의 된 핀이 표시됩니다.
unsigned int counter2; 부호없는 문자 위치 = 0; 부호없는 문자 k = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; int digit1 = 0, digit2 = 0, digit3 = 0, digit4 = 0; #define TRIS_seg1 TRISCbits.TRISC0 #define TRIS_seg2 TRISCbits.TRISC1 #define TRIS_seg3 TRISCbits.TRISC2 #define TRIS_seg4 TRISCbits.TRISC3 #define TRIS_led1 TRISAbits.TRISA2 #SATRISA_define TRISA.TRISA2 #define TRIS_led2 TRISA2 #define TRIS_led2 TRISA2 #define TRIS_led2 TRISA2를 정의하십시오. TRIS_led5 TRISAbits.TRISA………………
이제 7 개의 세그먼트 디스플레이를 구동하기위한 타이머 인터럽트 루틴을 만들었습니다.
무효 인터럽트 low_priority LowIsr (void) {if (TMR0IF == 1) {counter2 ++; if (counter2> = 1) {if (position == 0) {seg1 = 0; seg2 = 1; seg3 = 1; seg4 = 1;………………
이제 void main () 함수에서 타이머와 인터럽트를 초기화했습니다.
GIE = 1; // GLOBLE INTRRUPT ENABLE PEIE = 1; // 주변 침입 플래그 T0CON = 0b000000000; // 프리스케일러 값 넣어 TMR0IE = 1; // 인터럽트 활성화 TMR0IP = 0; // 중단 우선 순위 TMR0 = 55536; //이 값 이후에 카운터 시작 TMR0ON = 1;
그런 다음 while 루프에서 아날로그 핀의 아날로그 입력을 읽고 계산을 위해 일부 함수를 호출합니다.
while (1) {adc_init (); for (i = 0; i <40; i ++) {값 = adc_value (); adcValue + = 값; } adcValue = (float) adcValue / 40.0; 변환 (adcValue); 지연 (100); }
주어진 adc_init () 함수는 ADC 초기화에 사용됩니다.
무효 adc_init () {ADCON0 = 0b00000011; // adc 채널 선택 ADCON1 = 0b00001110; // 아날로그 및 디지털 i / p 선택 ADCON2 = 0b10001010; // 균형화 시간 유지 캡 시간 ADON = 1; }
주어진 adc_value 함수는 아날로그 핀에서 입력을 읽고 전압을 계산하는 데 사용됩니다.
float adc_value (void) {float adc_data = 0; while (GO / DONE == 1); // 상위 비트 데이터 변환 시작 adc 값 adc_data = (ADRESL) + (ADRESH << 8); // 10 비트 출력 저장 adc_data = ((adc_data / 342.0) * 5.0); 반환 adc_data; }
그리고 주어진 변환 기능은 전압 값을 세그먼트 지원 값으로 변환하는 데 사용됩니다.
void convert (float f) {int d = (f * 100); 숫자 1 = d % 10; d = d / 10; 숫자 2 = d % 10; d = d / 10; 숫자 3 = d % 10; 숫자 4 = d / 10; }
데모 비디오로 아래에서이 프로젝트 의 전체 코드 를 확인하십시오.