산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

통합 태양열 ChargeController, 인버터, PowerBank, 램프

구성품 및 소모품

Microchip Technology Atmega8
× 1
벅 변환기
× 1
SparkFun LED - 3W 알루미늄 PCB(5팩, 웜 화이트
× 1
Nokia 5110 디스플레이
× 1
SparkFun 방열판
× 1
SparkFun N-채널 MOSFET
× 4
SparkFun P-채널 MOSFET
× 1
12V 시스템용 태양광 패널 40와트 이하
× 1
SparkFun 리튬 이온 배터리 - 18650 셀
× 1
DC-DC 0.9V-5V - USB 모듈 5V DC 부스트 승압 전원 공급 장치
× 1
범용 트랜지스터 NPN
× 1
12-0-12/220 센터 탭 변압기
× 1
1N4007 – 고전압, 고전류 정격 다이오드
× 1
남성 헤더 36 위치 1 행 길이(0.1")
× 1
슬라이드 스위치
× 1
SparkFun 푸시버튼 스위치 12mm
× 1
Arduino Proto Shield
× 1
스트립/베로/프로토 보드 8x11cm
× 1
Arduino UNO
× 1
Arduino Nano R3
× 1
Arduino Mega 2560
× 1
낮은 FW 전압 쇼트키 다이오드 5822
× 1
커패시터 10μF
× 1
커패시터 100nF
× 1

필요한 도구 및 기계

납땜 인두(일반)
드릴 모터
뜨거운 글루건(일반)

앱 및 온라인 서비스

Arduino IDE
AutoDesk 123D

이 프로젝트 정보

이 프로젝트에 대해

나는 몇 개의 태양 전지판, 12볼트 배터리, 변압기, 그리고 그것들을 잘 활용하기 위해 큰 소리로 외치는 동안 잠시 동안 주위에 몇 가지 더 많은 물건이 놓여 있습니다. 따라서 이 장치의 탄생은 단일 보드에 완전한 소형 PV 솔루션입니다. 어떤 역할을 하는지 먼저 검토해 볼까요?

<울>
  • 충전 컨트롤러는 태양광 발전 패널에서 DC 저장/배터리의 충전과 부하에 의한 배터리 방전을 조절하여 배터리 수명을 연장하는 장치입니다.
  • 인버터는 AC 부하를 작동시키기 위해 DC 형태의 전기를 AC 형태로 변환하는 장치입니다.
  • Power Bank는 USB 포트를 통해 휴대용 충전 또는 독립형 충전을 위해 가제트/모바일 기기에 5V DC 공급을 제공합니다.
  • 비상등은 정전, 캠핑, 해 질 녘 야외활동 시 사용할 수 있는 초고휘도 LED 광원입니다.
  • 내가 만든 이 장치는 이러한 모든 기능을 가지고 있으며 마지막 두 기능은 온보드 리튬 이온 배터리에 의해 독립적으로 지원됩니다. 태양광 패널(최대 100와트), 12볼트 납축전지 및 변압기와 함께 모든 옵션을 사용할 수 있습니다.

    Uno의 프로토타입

    첫 번째 버전은 최소 하드웨어와 최소 옵션으로 Uno Board에서 개발되었습니다. Nokia 디스플레이를 직접 장착하고 배터리 충방전을 지원하기 위해 MOSFET 쉴드를 개발했습니다. 메뉴 제어, 인버터, PWM 충전 및 멋진 기능이 없습니다! 온/오프 충전 및 배터리 및 패널 전압 레벨 표시. 일을 하지만 매력이 없어!

    Protoboard의 정식 버전

    그런 다음 다음과 같은 기능으로 이 새로운 기능을 개발했습니다.

    <울>
  • 최대 100와트 패널의 PWM 태양열 충전 컨트롤러
  • 구형파 미니 60와트 인버터
  • 최대 3개의 12V DC 부하 제어
  • 기본 DC 부하는 자동 켜기/끄기 기능을 지원합니다.
  • 독립적인 USB 전원 은행
  • 벅 레귤레이터 모듈
  • 깜박임 및 밝기 조절 기능이 있는 비상 온보드 LED 램프
  • 2 버튼/스위치 제어 스크롤 및 사용자 제어를 위한 선택 기반 메뉴, Nokia 5110 디스플레이에 옵션 및 상태 정보 표시. 아주 멋져! 뒷면은 금속 물체에 대한 단락 보호를 위해 핫 글루 절연 처리되어 있습니다!

    디스플레이 백라이트용 켜기/끄기 스위치, 내부 배터리에서 꺼짐으로써 독립적인 작동을 위한 벅 분리와 같은 몇 가지 더 편리한 기능이 있습니다.

    사용자 버튼으로 Nokia 5110 디스플레이의 메뉴에 액세스하는 방법은 다음과 같습니다.

    기술적인 부분을 배워봅시다!

    충전 컨트롤러는 On/Off, PWM 또는 MPPT 유형일 수 있습니다. On/Off는 배터리 전압이 완전 충전 전압에 가까워질 때 충전 전류를 조절하지 않는 가장 단순한 형태의 컨트롤러입니다(제 버전 1 - 위 그림).

    PWM은 배터리가 가득 차면 충전 전류를 점차적으로 감소시킵니다. PWM 컨트롤러에는 다음과 같은 이점이 있습니다.

    <울>
  • 손실된 배터리 용량을 복구하고 배터리의 황산염을 제거하는 데 도움이 됩니다.
  • 더 많은 충전을 수용할 수 있는 배터리 능력 향상
  • 최대 95%의 높은 평균 배터리 용량 유지
  • 표류하는 배터리 셀을 균등화하여 내부 셀이 동일한 잠재력을 달성할 수 있도록 합니다.
  • 배터리 가열 및 가스 발생을 줄여 전해질 손실 방지
  • 노화를 늦추고 시스템 수명을 연장합니다.
  • 그러나 PWM은 태양광 패널에서 대부분의 전력을 얻을 수 없습니다. 패널이 배터리 전압 근처에서 작동하도록 끌기 때문입니다. MPPT는 기본적으로 DC-DC 조정 가능한 벅-부스트 컨버터인 이 문제에 대한 솔루션이며 PWM 컨트롤러에 비해 대부분의 태양광 전력을 변환할 수 있습니다.

    인버터는 구형파, 수정 사인파 및 순수 사인파 유형이 될 수 있습니다. 구형파 인버터는 설계가 매우 간단하고 AC 램프, CFL 램프, 탁상용 팬, 납땜 인두와 같은 작은 DC 부하가 충분하지만 고조파 왜곡으로 인해 유도 모터, 섬세한 장비/전원 공급 장치에는 권장되지 않습니다.

    수정된 사인파는 일반 구형파 인버터보다 우수한 구형파 형태로 생성된 일종의 지연된 사인파입니다. 사인파 인버터는 모든 유형의 부하에 가장 적합하지만 하드웨어 설계가 복잡하고 작동하기 어려운 소프트웨어 알고리즘과 제작 비용이 많이 듭니다.

    벅 레귤레이터는 강압 DC-DC 컨버터입니다. 여기서는 벅 모듈을 사용하여 컨트롤러(Arduino + 디스플레이), 독립 USB 전원 은행, 온보드 LED 램프에 전원을 공급하는 4.2V 리튬 이온 배터리를 충전했습니다.

    이제 USB 전원 은행은 기본적으로 Li-ion 또는 LiPo 배터리에서 5V 미만(예:3.3~4.2V 범위)의 전압 범위를 모바일 장치를 충전할 수 있는 USB 버스 전압인 5V로 변환할 수 있는 DC-DC 부스트입니다. .

    또한 배터리를 충전하는 벅 컨버터가 있습니다. 내 프로젝트에서 벅 모듈은 내부(온보드) 배터리를 충전하기 위해 패널에서 약간의 주스를 ​​가져옵니다.

    하드웨어 작동

    자세히 알아보기 전에 기기 주변에 연결된 모든 항목의 이미지를 확인하세요.

    시스템에는 다양한 목적을 위한 다양한 하드웨어가 있습니다. 물론 두뇌는 Arduino로 프로그래밍된 AVR Atmega8A 마이크로컨트롤러(아래에서 약간의 변경으로 Atmega328P를 사용할 수 있음)입니다.

    새로운 Atmega8A는 Arduino Optiboot8 부트로더로 구워집니다. 번거로움을 피하기 위해 Bootloaded Arduino Mini/Atmega328을 구입할 수 있습니다.

    컨트롤러, 디스플레이, LED 램프 및 보조 배터리는 온보드 리튬 이온 배터리에서 전원을 공급받습니다. 두 개의 순간 터치 버튼은 사용자가 장치의 다른 기능을 조작할 수 있도록 하는 디스플레이의 메뉴에 액세스하기 위한 것입니다. 스위치는 병렬로 연결된 평활 커패시터를 통해 하드웨어 디바운스됩니다.

    슬라이드 스위치를 사용하면 필요에 따라 장치의 전원을 켜거나 끌 수 있습니다.

    태양열 충전 기능은 2N2222 트랜지스터 기반 구동 회로로 구동되는 P-MOSFET에 의해 수행되며 마이크로 컨트롤러에서 PWM을 통해 제어됩니다. PWM은 외부 배터리 전압 레벨에 따라 제어됩니다. 태양 전지판의 전류는 P-MOSFET을 통해 납축전지로 흐릅니다. 배터리가 완전히 충전되면 MOSFET은 마이크로컨트롤러에서 꺼집니다. 충전이 꺼지면 배터리 전압이 점차 떨어지기 시작하고 13.6V에 도달하면 부동 충전을 유지하기 위해 낮은 듀티 사이클로 다시 충전이 재개됩니다.

    12볼트 DC 부하는 마이크로컨트롤러에서 게이트 핀을 제어하여 N-MOSFET를 통해 제어됩니다.

    온보드 LED LAMP도 NMOS를 통해 구동됩니다. 이 MOSFET의 게이트는 LED의 밝기 조정을 위해 PWM 제어됩니다.

    인버터 블록은 AC를 시뮬레이션하기 위해 번갈아 켜짐/꺼짐이 켜진 2개의 N-MOSFET로 구성됩니다. 외부 센터 탭 변압기를 추가하여 구형파 AC 공급을 실현할 수 있습니다.

    다음 그림은 인버터 동작을 설명합니다.

    MOSFET을 교대로 사용하여 승압 변압기 코일의 중앙 탭을 통해 전류를 반대 방향으로 흐르게 함으로써 2차측의 AC 전압을 생성할 수 있습니다. 이것은 상단 MOSFET이 켜져 있고 하단 MOSFET이 꺼져 있을 때 전류가 위쪽으로 흐르기 때문에 발생합니다. 그러나 상단 MOSFET이 꺼져 있고 하단 MOSFET이 켜져 있으면 전류가 아래쪽으로 흐릅니다.

    두 MOSFET 모두 AC 주파수의 두 배에서 토글되어야 합니다. 이해하려면 다음 그림을 확인하세요.

    50Hz AC를 생성하기 위해 12-0-12V/220V 센터 탭 트랜스포머의 로우 사이드에 교차 구형파가 적용됩니다. 50Hz는 각 웨이브에 대해 20ms 시간을 의미합니다.

    그렇기 때문에 20ms/2 =10ms 또는 100배 토글 게이트 신호를 변압기 구동 MOSFET(인버터 MOSFET)에 적용합니다.

    경고!!! :AC 전압은 인체에 치명적이며 사망/부상을 유발할 수 있습니다! 맨손으로 변압기의 HV 측을 만지지 마십시오!

    인버터 기능을 사용하지 않는 경우 2XDC 부하 옵션을 사용하면 인버터 단자에 12볼트 DC 부하를 2개 더 사용할 수 있습니다.

    소프트웨어의 마법

    두 세트의 코드가 제공되는데, 하나는 단일 Arduino 탭의 전체 코드이고 다른 하나는 별도의 기능에 따른 탭 코드입니다.

    작업 그룹을 단일 기능으로 일반화했습니다.

    예:

    Get_ADCVal()은 패널, 내부 배터리 및 외부 배터리 전압을 측정하고 20개의 샘플을 취하여 해당 값의 평균을 내고 가변 유지 전압 정보를 업데이트합니다.

    Context_Control()은 사용자 상호 작용, 작업 제어, 디스플레이 관련 활동에 대한 정보 업데이트를 수행합니다.

    Charge_Control() , Discharging_Control(), Load_Control()은 시스템의 CLOSE LOOP 역할을 하고, 배터리 전압 수준을 모니터링하고, 자동 로드 기능, 과충전/과방전 보호 제어 등을 제어하는 ​​백그라운드 함수입니다.

    사용자 입력은 인터럽트 구동 순간 프레스 스위치를 통해 수집됩니다. 이 스위치를 누르면 INT0/INT1 관련 ISR이 실행됩니다. 두 개의 휘발성 변수 dp 및 ds 변경. 또 다른 세 번째 변수 레벨 dp(디스플레이 포인터 ->) 및 ds(디스플레이 콘텐츠 선택기)와 함께 사용자는 메뉴/하위 메뉴를 탐색하고 필요에 따라 작업을 수행할 수 있습니다.

    AVR의 16비트 TImer1은 10ms마다 타이머 오버플로 인터럽트를 발생하도록 구성되며 인버터 기능이 On일 때 PIN_INVP 및 PIN_INVN을 대칭 이동합니다.

    모든 Lcd_....() 함수는 디스플레이 제어와 관련이 있습니다.

    Atmega8A 대 Atmega328P(우노)

    시스템은 Atmega328P/Uno와 함께 작동하도록 쉽게 업그레이드할 수 있으며 다음과 같이 코드를 변경할 수 있습니다. 찾기 및 바꾸기

     TIMSK1#define ADC_VREF 2.69, #define ADC_VREF 1.11 #define ADCVDIV_R1 22, #define ADCVDIV_R1 8.2  

    하드웨어 부분에서 22K 대신 8.2K 저항을 사용해야 합니다. 패널, 배터리 전압을 ADC 측정 범위로 축소합니다.

    액션 비디오

    나는 보통 어떤 프로젝트에 대한 단어만 읽지 않고 대신 비디오를 먼저 읽습니다. 저와 같다면 동영상을 즐겨보세요:

    개선 범위

    Atmega8A에서 Flash Space가 부족했습니다. 다음과 같은 몇 가지 중요한 기능을 추가할 수 없습니다.

    <울>
  • 소프트웨어 제어 과부하/단락 보호
  • 일부 그래픽 아이콘 및 로고
  • 에너지 및 로깅 측정
  • 백업 시간 예측 및 알람
  • 노트북 충전 옵션
  • 6볼트 시스템 지원
  • 블루투스 부하 제어
  • 타이머 기반 부하 제어
  • 더 멋진 기능을 위한 RTC 시계
  • IoT 연결 솔루션
  • 이와 같은 것을 만들 계획이 있다면 이 기능 중 일부를 추가하는 것을 잊지 마십시오!

    Atmega328P(Uno) 또는 Arduino Mega는 이러한 모든 옵션을 포함하는 데 더 나은 후보일 수 있습니다.

    어쨌든 잘 작동하고 만족합니다.

    추가 리소스

    <울>
  • Atmega8 보드를 지원하는 Arduino 1. 0. 6 다운로드
  • Arduino.exe를 열고 도구> 보드> Optiboot8로 이동합니다.
  • 이 방법을 사용하여 부트로더 굽기
  • 코드 컴파일 및 업로드
  • <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 단일 탭 코드
  • 전체 코드
  • 부트로더
  • 단일 탭 코드 Arduino
    #define PIN_SCE 12#define PIN_RESET 13#define PIN_DC 8#define PIN_SDIN 7#define PIN_SCLK 6#define PIN_INVP 4#define PIN_INVN 5#define PIN_LOAD 9 // 12 v dc load#define PIN_LAMP 10 // W #define PIN_BATTPWM 11 // Ext BATt 충전을 위한 PMOS 구동 #define PIN_BATTint_Sense A2#define PIN_SOLAR_Sense A0#define PIN_BATText_Sense A3#define ADC_VREF 2.695 // Arduino Uno의 경우 약 1.11V의 내부 기준 전압을 제공합니다. Atmega328Mega!#P define ADCVDIV_R1 22 // 22K 전압 분배기 하부 저항기#define ADCVDIV_R2 175 // 175K 전압 분배기 상부 저항기//const uint8_t skulljoke[] PROGMEM ={2,};// 인터럽트 스위치로 사용되는 PIN 2 &3// PIN 0 &1 AS PROGRAMMING// PIN 재설정 AS#define LCD_C LOW#define LCD_D HIGH#define LCD_X 84#define LCD_Y 48uint8_t x=0;uint8_t level=0;uint8_t 깜박임=0; boolean Load_Auto_Enable=0;float maxADC_Voltage=0.0;float BattInt_Voltage=0.0;float BattExt_Voltage=0.0;float PV_Voltage=0.0;volatile int y=0;volatile uint8_t volatile dp=0;volatile boolean uint8_t cdc_level =0;//int i; 무효 설정(무효){ LcdInitialise(); LcdClear(); LcdString("*아두보이 PV*"); LcdString("컨트롤러,"); LcdString("AC 인버터,"); LcdString("파워뱅크, "); LcdString("램프 물건!!"); 지연(3000); 아날로그 참조(내부); maxADC_Voltage=(ADC_VREF/ADCVDIV_R1)*(ADCVDIV_R1+ADCVDIV_R2); 핀모드(PIN_LOAD,OUTPUT); 디지털 쓰기(PIN_LOAD,LOW); 핀모드(2, INPUT_PULLUP); attachInterrupt(0, SW1, FALLING);// Swithc 1에 대한 인터럽트 pinMode(3, INPUT_PULLUP); attachInterrupt(1, SW2, FALLING);// Swithc 2 인터럽트 }void loop(void){ Get_ADCVal();Context_Control();Charging_Control();DisCharging_Control();Load_Control();LcdClear();}// /////////// ADC ///////////////void Get_ADCVal(void){int I=0;int J=0;int K=0;for( x=0;x<20;x++) {I=I+analogRead(PIN_BATTint_Sense);J=J+analogRead(PIN_BATText_Sense);K=K+analogRead(PIN_SOLAR_Sense); } // 평균 전압 BattInt_Voltage =I / 20.0; BattExt_Voltage =J / 20.0; PV_Voltage =K / 20.0; BattInt_Voltage =maxADC_Voltage * BattInt_Voltage / 1023.0; BattExt_Voltage =maxADC_Voltage * BattExt_Voltage / 1023.0; PV_Voltage =maxADC_Voltage * PV_Voltage / 1023.0} // ////////// 표시 및 제어 //////////////void Context_Control(void){ if(ds==0) ​​{show_menu();} if(ds==1 &&dp ==0) {show_info(); delay(100);} //LcdClear();Get_ADCVal();}///////////////////////첫 번째 하위 메뉴 진입////// ////////////////////// if(ds==1 &&dp ==1) { 레벨=1; dp=0; 동안(레벨==1) { int temp=ds; LcdClear(); show_load_ctrl();delay(250); if (dp==0){ if(ds!=temp){Load_Auto_Enable=0;digitalWrite(PIN_LOAD,LOW);}} if (dp==1){if(ds!=temp){Load_Auto_Enable=0; digitalWrite(PIN_LOAD,HIGH);}} if (dp==2){ if(ds!=temp){Load_Auto_Enable=1;}} if (dp==3){show_load_ctrl();delay(250);level=0;dp=0;ds=0;} } }//////////////////////두 번째 하위 메뉴로 이동/////////// ///////////////////if(ds==1 &&dp ==2) { 레벨=2; dp=0; 동안(레벨==2) { int temp=ds; show_inv_ctrl();지연(250); LcdClear(); if (dp==0){ if(ds!=temp){Timer1_Init();}} if (dp==1){ if(ds!=temp){Timer1_DeInit();}} if (dp==2 ){ if(ds!=temp){Timer1_DeInit();digitalWrite(PIN_INVP,1);digitalWrite(PIN_INVN,1);}} if (dp==3){show_inv_ctrl();delay(250);level=0;dp=0;ds=0;} } } /////////////////////////////////////// /////////////////// ////////////////세 번째 하위 메뉴로 들어갑니다/////////// //////////////////if(ds==1 &&dp ==3) { 레벨=3; dp=0; 동안(레벨==3) { int temp=ds; LcdClear(); show_led_ctrl();지연(250); if (dp==0){blinker=0;if(ds!=temp) {if(y<=255){y=y+15;analogWrite(PIN_LAMP,y);}}} if (dp==1 ){깜박임=0;if(ds!=temp) {if(y>=0){y=y-15;analogWrite(PIN_LAMP,y);}}} if (dp==2){if(ds! =temp) {blinker^=1;analogWrite(PIN_LAMP,127);delay(250);analogWrite(PIN_LAMP,0);}} if (dp==3){show_led_ctrl();delay(250);level=0;dp=0;ds=0;} } } /////////////////////////////////////// /////////////////// // {show_inv_ctrl();}// {show_led_ctrl();}//}if(blinker==1){analogWrite(PIN_LAMP, 0);}지연(250);if(깜박임==1){analogWrite(PIN_LAMP,127);}}///////////////////////// /// Nokia 5110 디스플레이에 표시할 메뉴 텍스트 //////////////////void show_menu(void){LcdXY(0,dp);LcdString("->" );LcdXY(15,0);LcdString("시스템 정보");LcdXY(15,1);LcdString("DC 로드+");LcdXY(15,2);LcdString("AC 로드~");LcdXY( 15,3);LcdString("LED 램프");}무효 show_info(무효){ LcdXY(0,0);LcdString("Bat_I=");LcdNumtoString(BattInt_Voltage);LcdString("v");LcdXY(0 ,1);LcdString("Bat_E=");LcdNumtoString(BattExt_Voltage);LcdString("v");LcdXY(0,2);LcdString("Sol_ P=");LcdNumtoString(PV_Voltage);LcdString("v");LcdXY(0,3);if(BattExt_Voltage>8.0){LcdString("배터리 연결 확인");}else{LcdString("배터리 연결");}if (PV_Voltage> 10.5 &&cdc_level!=3 &&cdc_level!=0){LcdString("Charging:ON ");}else{LcdString("Charging:OFF");}if (TCNT1>=45535 ){LcdString ("인버터:ON");}else{LcdString("인버터:OFF");}}void show_load_ctrl(void){LcdXY(0,dp);LcdString("->");LcdXY(15,0); LcdString("로드 끄기");LcdXY(15,1);LcdString("로드 켜기");LcdXY(15,2);LcdString("자동 로드");LcdXY(15,3);LcdString("리턴" );LcdXY(0,4);LcdString("연결해야 함");LcdString("12V DC 부하");}void show_inv_ctrl(void){LcdXY(0,dp);LcdString("->");LcdXY( 15,0);LcdString("AC Inv 켜짐");LcdXY(15,1);LcdString("AC Inv 꺼짐");LcdXY(15,2);LcdString("2XDC 로드");LcdXY(15,3 );LcdString("반환");LcdXY(0,4);LcdString("2XDC 로드,NO");LcdXY(0,5);LcdString("TRANSFORMER!");}무효 show_led_ctrl(무효){LcdXY( 0,dp);LcdString("->");LcdXY(15,0);LcdString("LED ++");LcdXY(15,1);LcdString("LED --");LcdXY(15,2 );LcdString("LED 블록" );LcdXY(15,3);LcdString("반환");LcdXY(0,4);LcdString("LED 비활성화");LcdXY(0,5);LcdString("INVR이 켜졌을 때");}// ///////////// 인터럽트 ISR //////////////void SW1(){dp++;if(dp>
    3){dp=0;} }void SW2 (){ds^=1;} ISR(TIMER1_OVF_vect) { noInterrupts(); TCNT1 =45535; // TCNT1 =25535; 주기^=1; if(주기==0); { 디지털 쓰기(PIN_INVP,HIGH); 지연마이크로초(1); // 불감대 digitalWrite(PIN_INVN,LOW); 지연마이크로초(1); } if(주기==1) { digitalWrite(PIN_INVP,LOW); 지연마이크로초(1); // 불감대 digitalWrite(PIN_INVN,HIGH); 지연마이크로초(1); } 인터럽트(); }/////////////Nokia 5110 함수 //////////정적 const 바이트 ASCII[][5] ={{0x00, 0x00, 0x00, 0x00, 0x00} / / 20,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 ",{0x14, 0x7f, 0x14,0} ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %,{0x36, 0x49, // 0x55, 0x2, // 0x00, 0x05, 0x03, 0x00, 0x00} // 27 ',{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (,{0x00, 0x41, 0x22, 0x90}, // 0x08, 0x3e, 0x08, 0x14} // 2a *,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +,{0x00, 0x50, 0x30, 0x00, 0x00, // ,{ 0x08, 0x08, 0x08} // 2d -,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .,{0x20, 0x10, 0x08, 0x04, 0x02} // 0x51,,, 0x45, 0x3e} // 30 0,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1,{0x42, 0x61, 0x51, 0x49, 0x46} // 32, 2,{0x46} // 32 0x31} // 33 3,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 ,{0x3c, 0x45,{0x3c, 0x44 // 36 6,{0x01, 0x71, 0x09, 0x05, 0x03 } // 37 7,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9,{0x00, 0x36,00 / 3a :,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b;,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <,{0x14, // 0x14, 0x144, // 3b =,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e>,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?,{0x32, 0x49, // 0x79, 40x4 {0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B,{0x3e, 0x41, 0x41, 0x221}, , 0x41, 0x41, 0x22, 0x1c} // 44 D,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E,{0x7f, 0x09, 0x09, 0x09, {0x6 F , 0x49, 0x49, 0x7a} // 47 G,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H,{0x00, 0x41, 0x7f, 0x41, 0x00,{0x40, I , 0x3f, 0x01} // 4a J,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c, L,{0x02, , 0x7f} // 4d M,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O,{0x7f, 0x09, } // 50P,{0x3e, 0x41, 0x 51, 0x21, 0x5e} // 51 Q,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R,{0x46, 0x49, 0x49, 0x49, 0x31} // 51, S,{0x0x 0x01, 0x01} // 54 T,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V,{0x83f, 0x3f} // 57 W,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y,{0x61, 0x491,0, // 5a Z,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c,{0x00, 0x41, 0x70,0} ],{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _,{0x00, 0x01, 0x02, 0x0 ` {0x20, 0x54, 0x54, 0x54, 0x78} // 61 a,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b,{0x38, 0x44, 0x44, 0x204}, , 0x44, 0x44, 0x48, 0x7f} // 64 d,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e,{0x08, 0x7e, 0x09, //{ , 0x52, 0x52, 0x3e} // 67 g,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68시간,{0x00, 0x44, 0x7d, 0x40, 0x00,{0x40, 0x00} // , 0x3d, 0x00} // 6a j,{0 x7f, 0x10, 0x28, 0x44, 0x00} // 6b k,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l,{0x7c, 0x04, 0x18, 0x84, //{0 0x08, 0x04, 0x04, 0x78} // 6e n,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o,{0x7c, 0x14, 0x14, 0x14, 0x08, // 0x14, 0x08 0x14, 0x18, 0x7c} // 71 q,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r,{0x48, 0x54, 0x54, 0x54, 0x20s, // 0x30 0x40, 0x20} // 74 t,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76, v,{0x30 0x3c} // 77 승,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y,{0x44, 0x54,0, // 7a z,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |,{0x00, // 0x41, 0x086, // 7d },{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f };void LcdCharacter(문자 문자){ LcdWrite(0x08){ LcdWrite(0x08) for (int 인덱스 =0, 인덱스 <5, 인덱스++) { LcdWrite(LCD_D, ASCII[문자 - 0x20][인덱스]); } LcdWrite(LCD_D, 0x00);}void LcdClear(void){ for (int index =0; index  0) {digitalWrite(PIN_LOAD,HIGH);} if (Load_Auto_Enable ==1 &&PV_Voltage>10.5 || cdc_level==0) {digitalWrite(PIN_LOAD,LOW);} }void Charging_Control (void){// BattExt_Voltage Level 14.3 충전 꺼짐, 13.5 이하 충전 켜짐, 10.8 로드 꺼짐, 12.5 로드 켜짐 // 이 다음 조건이 방지됨 the attemps of charging during night % night PV is 0 volt !if (PV_Voltage> 10.5 &&BattExt_Voltage>8.0){if (BattExt_Voltage <=12.5) { analogWrite(PIN_BATTPWM,255); cdc_level =0; } if (BattExt_Voltage> 12.5 &&BattExt_Voltage <=12.9) { analogWrite(PIN_BATTPWM,200); cdc_level =1; } if (BattExt_Voltage> 12.9 &&BattExt_Voltage <=13.3) { analogWrite(PIN_BATTPWM,160); cdc_level =1; } if (BattExt_Voltage> 13.3 &&BattExt_Voltage <=13.6) { analogWrite(PIN_BATTPWM,120); cdc_level =2; } if (BattExt_Voltage> 13.6 &&BattExt_Voltage <=13.9 &&cdc_level ==2) { analogWrite(PIN_BATTPWM,80); cdc_level =2; } if (BattExt_Voltage> 13.9 &&BattExt_Voltage <=14.3 &&cdc_level ==2) { analogWrite(PIN_BATTPWM,40); cdc_level =2; }// Over Voltage Lockout, while cdc_level is 3, NO Charging ! Charging Resumes when cdc is 2 which is below 13.5 v if (BattExt_Voltage> 14.3 ) { analogWrite(PIN_BATTPWM,0); cdc_level =3; } }else {analogWrite(PIN_BATTPWM,0);cdc_level =3;}}/// Under voltage Lockoutvoid Discharging_Control (void){if (BattExt_Voltage <=10.8) { cdc_level =0; {digitalWrite(PIN_LOAD,LOW);} Timer1_DeInit(); }}/////////////// Timer 2 Functions //////////////// This portion of the code is written in AVR stylevoid Timer1_Init(void){ noInterrupts(); // disable all interrupts pinMode(PIN_INVP,OUTPUT); pinMode(PIN_INVN,OUTPUT); TCCR1A =0; TCCR1B =0; /* ========================================50 Hz AC means 20 ms Wave which is formed by 2, 10 ms Pulses from PIN_INVP and PIN_INVN pins so both this pin should toggle at 100 Hz ! Now 100 Hz =.01 sec Arduino System Clock 16 MHz =16000000 cycle in 0,01 sec we have 160000 cycles using prescaler of 8 (CS11) makes timer count 160000/8 =20000 timer ticks Since the timer 2 is 16 bit Up Counter and it Overflows at 65635 value we need to start counting from 65535-20000 =from 45535 value upto 65535 thus TCNT1 starts at 45535 ..then tick tick tick ... 46000 .... 50000 .............. 65536 !!! Boom Timer Over Flow Interrupt and toggle the Inverter driving pins in ISR and start counting from 45535 Again !!! (This happens in the Background) ========================================*/ TCNT1 =45535; //TCNT1 =25535; TCCR1B |=(1 < 
    Full CodeC/C++
    Code Organized &Readable
    No preview (download only).
    BootloadersC/C++
    미리보기 없음(다운로드만 가능).

    회로도


    제조공정

    1. 태양광 인버터란 무엇이며 어떻게 작동합니까?
    2. 할로겐 램프
    3. 용암 램프
    4. 태양열 난방 시스템
    5. 집적 회로
    6. 태양 전지
    7. 스마트 신호등
    8. Arduino 게임 컨트롤러
    9. 솔라 트래커 V2.0
    10. 태양 에너지 이해