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

Arduino - PV MPPT 태양열 충전기

구성품 및 소모품

Arduino Nano R3
× 1
인덕터 100uH
현재 등급은 필요한 전력과 일치해야 합니다.
× 1
전력 MOSFET N-채널
× 1
Adafruit Standard LCD - 파란색 바탕에 16x2 흰색
× 1

필요한 도구 및 기계

납땜 인두(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

시중에 많은 충전 컨트롤러가 있지만 일반 저렴한 충전 컨트롤러는 태양광 패널의 최대 전력으로 사용하기에 효율적이지 않습니다. 그리고 효율적인 것은 매우 비용이 많이 듭니다.

그래서 배터리 요구 사항과 태양열 조건을 이해할 수 있을 만큼 효율적이고 똑똑한 충전 컨트롤러를 만들기로 결정했습니다. 태양광에서 최대 가용 전력을 끌어와 배터리 내부에 매우 효율적으로 배치하기 위해 적절한 조치를 취합니다.

제 노력이 마음에 들면 이 튜토리얼에 투표하세요.

1단계:MPPT란 무엇이며 왜 필요한가요?

우리의 태양 전지판은 멍청하고 배터리 상태를 이해할 만큼 똑똑하지 않습니다. 12v/100와트 태양광 패널이 있고 제조업체에 따라 18V-21V 사이의 출력을 제공하지만 배터리의 정격 전압은 12v라고 가정합니다. 완전 충전 상태에서는 13.6v가 되고 완전 방전 시에는 11.0v가 됩니다. 이제 배터리가 13v 충전 상태이고 패널이 100% 작동 효율에서 18v, 5.5A를 제공한다고 가정해 봅시다(100%를 가질 수는 없지만 가정해 봅시다). 일반 컨트롤러에는 전류 이득 없이 전압을 13.6으로 낮추는 PWM 전압 조정기 ckt가 있습니다. 야간에만 패널의 과충전 및 누설 전류에 대한 보호 기능을 제공합니다.

이 문제를 해결하기 위해 smps 벅 컨버터를 사용했습니다. 이러한 종류의 변환기는 효율이 90% 이상입니다. 90%도 가난한 것으로 간주됩니다.

두 번째 문제는 태양광 패널의 비선형 출력입니다. 최대 가용 전력을 수확하려면 특정 전압에서 작동해야 합니다. 출력물은 하루 종일 다양합니다.

이 문제를 해결하기 위해 MPPT 알고리즘이 사용됩니다. MPPT(Maximum Power Point Tracking)라는 이름에서 알 수 있듯이 이 알고리즘은 패널에서 사용 가능한 최대 전력을 추적하고 상태를 유지하기 위해 출력 매개변수를 변경합니다.

따라서 MPPT를 사용하여 패널은 최대 가용 전력을 생성하고 벅 컨버터는 이 전하를 배터리에 효율적으로 투입합니다.

2단계:MPPT는 어떻게 작동합니까?

이에 대해 자세히 논의하지 않을 것이므로 이해를 원하시면 이 링크를 살펴보세요. - MPPT란 무엇인가요?

이 프로젝트에서는 입력 V-I 특성과 출력 V-I도 추적했습니다. 입력 V-I와 출력 V-I를 곱하면 와트 단위의 전력을 얻을 수 있습니다.

하루 중 언제든지 17V 5A, 즉 17x5 =85와트가 있다고 가정해 보겠습니다. 동시에 우리의 출력은 13V 6A, 즉 13x6 =78W입니다.

이제 MPPT는 이전 입력/출력 전력과 비교하여 출력 전압을 높이거나 낮춥니다.

이전 입력 전력이 높고 출력 전압이 현재보다 낮으면 출력 전압을 다시 낮추어 다시 고전력으로 돌아갑니다. 출력 전압이 높으면 현재 전압이 이전 수준으로 증가합니다. 따라서 최대 전력점을 중심으로 계속 진동합니다. 이러한 진동은 효율적인 MPPT 알고리즘에 의해 최소화됩니다.

3단계:Arduino에서 MPPT 구현

이것이 이 충전기의 두뇌입니다. 다음은 단일 코드 블록에서 출력을 조절하고 MPPT를 구현하는 Arduino 코드입니다.

// Iout =출력 전류// Vout =출력 전압// Vin =입력 전압// Pin =입력 전력, Pin_previous =마지막 입력 전력// Vout_last =마지막 출력 전압, Vout_sense =현재 출력 전압void 레귤레이트 (float Iout, float Vin, float Vout) {
if((Vout>Vout_max) || (Iout>Iout_max) || ((Pin>Pin_previous &&Vout_senseVout_last ))) { if(duty_cycle>0) { duty_cycle -=1; } analogWrite(buck_pin,duty_cycle); } else if ((VoutPin_previous &&Vout_sense>Vout_last) || (Pin 듀티 사이클+=1; } analogWrite(buck_pin,duty_cycle); } Pin_previous =핀; Vin_last =Vin;Vout_last =Vout;}

4단계:벅 컨버터

벅 컨버터를 만들기 위해 N-채널 MOSFET을 사용했습니다. 일반적으로 사람들은 하이 사이드 스위칭을 위해 P-채널 MOSFET을 선택하고 동일한 목적으로 N-채널 MOSFET을 선택하는 경우 드라이버 IC 또는 부트스트래핑 ckt가 필요합니다.

그러나 N-채널 MOSFET을 사용하여 로우 사이드 스위칭을 갖도록 벅 컨버터 ckt를 수정했습니다. 저비용, 높은 전력 등급 및 낮은 전력 손실 때문에 N-채널을 사용하고 있습니다. 이 프로젝트는 IRFz44n 로직 레벨 MOSFET을 사용하므로 Arduino PWM 핀으로 직접 구동할 수 있습니다.

더 높은 부하 전류의 경우 MOSFET을 완전히 포화 상태로 만들고 전력 손실을 최소화하기 위해 게이트에서 10V를 적용하는 트랜지스터를 사용해야 합니다. 저도 그렇게 했습니다.

위의 ckt에서 볼 수 있듯이 MOSFET을 -ve 전압에 배치하여 패널의 +12v를 접지로 사용합니다. 이 구성을 통해 최소 구성 요소로 벅 컨버터용 N-채널 MOSFET을 사용할 수 있습니다.

그러나 몇 가지 단점도 있습니다. 양측 -V 전압이 분리되어 있으므로 더 이상 공통 기준 접지가 없습니다. 따라서 전압 측정은 매우 까다롭습니다.

Arduino의 -V 라인을 접지로 사용하여 Arduino를 태양열 입력 단자에 연결했습니다. 요구 사항에 따라 전압 분배기 ckt를 사용하여 이 시점에서 입력 전압을 쉽게 측정할 수 있습니다. 그러나 공통 접지가 없기 때문에 출력 전압을 쉽게 측정할 수 없습니다.

이제 이것을 하기 위한 트릭이 있습니다. 출력 커패시터 양단의 전압을 측정하는 대신 두 개의 -V 라인 사이의 전압을 측정했습니다. Arduino의 접지로 태양광 -Ve를 사용하고 측정할 신호/전압으로 출력 -Ve를 사용합니다. 이 측정으로 얻은 값을 측정된 입력 전압에서 빼야 출력 커패시터 양단의 실제 출력 전압을 얻을 수 있습니다.

Vout_sense_temp=Vout_sense_temp*0.92+float(raw_vout)*volt_factor*0.08; //입력 gnd와 출력 gnd의 전압을 측정합니다.
Vout_sense=Vin_sense-Vout_sense_temp-diode_volt; //두 접지 간의 전압 차이를 출력 전압으로 변경합니다.

전류 측정을 위해 ACS-712 전류 감지 모듈을 사용했습니다. Arduino에 의해 전원이 공급되고 입력 GND에 연결되었습니다.

내부 타이머는 MOSFET을 구동하는 데 사용되는 핀 D6에서 62.5Khz PWM을 얻도록 수정됩니다. 이를 위해 원하는 정격 전류의 쇼트키 다이오드를 사용하여 역 누설 및 역 극성 보호를 제공하려면 출력 차단 다이오드가 필요합니다. 인덕터 값은 주파수 및 출력 전류 요구 사항에 따라 다릅니다. 온라인에서 사용 가능한 벅 컨버터 계산기를 사용하거나 100uH 5A-10A 부하를 사용할 수 있습니다. 인덕터의 최대 출력 전류를 80%-90% 초과하지 마십시오.

5단계:최종 수정

충전기에 추가 기능을 추가할 수도 있습니다. 광산에는 매개변수를 표시하는 LCD와 사용자의 입력을 받는 2개의 스위치가 있습니다.

곧 최종 코드를 업데이트하고 ckt 다이어그램을 완성하겠습니다.

6단계:실제 회로도, BOM 및 코드

업데이트:

코드, bom 및 회로를 업로드했습니다. 저랑은 조금 다른데, 만들기가 더 쉽거든요.

Solar_charger_tutorial_code.ino

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • Solar_charger_tutorial_code.ino
  • Solar_charger_tutorial_code.ino아두이노
    <사전>///////////////////////////////////////////////// ///////////////////////////////////////////이용 약관///// ////////////////////////////////////////////////////// /////////////////////////////////소프트웨어는 어떠한 종류의 보증 없이 "있는 그대로" 제공됩니다. 또는//상품성,//특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않는 묵시적. 어떠한 경우에도//저작자 또는 저작권 소유자는 계약, 불법 행위 또는 기타 행위로 인해 발생하는 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다. 소프트웨어/////////////////////////////////////////////////에서 사용 또는 기타 거래 ///////////////////////////////////////////////////#포함 #include #include #define vin_pin A1#define vout_pin A0#define iout_pin A2#define iin_pin A3#define lm35 A4#define 팬 5#define buck_pin 6#define 메뉴 3#define 버튼 2#define led 13#define charge_led A5#define light 4uint8_t auto_mode=1;float Pin=0,Pout=0,Pin_previous=0;float efficiency=0.0;int raw_vin=0, raw_vout=0, raw_iout =0,raw_iin=0, raw_lm35=0;float Vout_boost=14.5,Vout_max=15.0, Iout_max=5.0, Vout_float=13.5, Iout_min=0.00,Vin_thresold=10.0;float Iout_sense,Iin_sense,Ilastin;float;float Vin_sense;uint8_t duty_cycle =0;float volt_factor =0.05376; //이 값을 변경하여 전압 판독값을 보정합니다...String mode="";bool startup=true, lcd_stat=true,charge=true,mppt_init =true;unsigned int count=0;LiquidCrystal lcd(7, 8, 9, 10, 11, 12); 무효 lcd_show(문자열 데이터, int 열, int 행); 무효 UI(); 무효 set_limits(int cmd,int temp); 무효 mem_read(); 무효 mem_write(); 무효 mppt(); 무효 설정() { wdt_disable(); 감시 설정(); // 여기에 설정 코드를 넣어 한 번 실행:Serial.begin(115200);mem_read();pinMode(light,OUTPUT);pinMode(charge_led,OUTPUT);digitalWrite(charge_led,LOW);digitalWrite(light,HIGH);pinMode(LED,OUTPUT);pinMode(팬,OUTPUT);pinMode(메뉴,INPUT);pinMode(버튼,INPUT);digitalWrite(메뉴,HIGH);digitalWrite(버튼,HIGH);TCCR0B =TCCR0B &0b11111000 | 0x01; / 최대 pwm 설정... 62.5 KhzanalogWrite(buck_pin,0);lcd.begin(16,2);lcd_show("태양열 충전기",0,0);delay(64000);wdt_reset();delay(64000);wdt_reset();lcd_show("Vi Vb Ib ",0,0);//////////////////for(int i=0;i<10;i++) { raw_iout +=analogRead(iout_pin)-513;raw_iin +=analogRead(iin_pin)-513;raw_vin +=analogRead(vin_pin);raw_vout +=analogRead(vout_pin);raw_lm35 +=analogRead(lm35);delay(2); } raw_iout=raw_iout/10; raw_iin=raw_iin/10; raw_vout=raw_vout/10; raw_vin=raw_vin/10; Iout_sense=float(raw_iout)*5/1023/0.066; Iin_sense=float(raw_iin)*5/1023/0.066; Vout_sense_temp=float(raw_vout)*volt_factor; Vin_sense=float(raw_vin)*volt_factor; // 방열판 온도 =raw_lm35*0.48; // 0.0049*1000/10 // heat_sink_temp =heat_sink_temp-273.15; //LM235를 사용하는 경우 주석 처리 해제}//////////void watchdogSetup(void){cli(); // 모든 인터럽트 비활성화swdt_reset(); // WDT 타이머 재설정// 워치독 구성 모드 시작:WDTCSR |=(1<Vout_max) || (Iout>Iout_max) || ((Pin>Pin_previous &&Vin_senseVin_last))) { if(duty_cycle>0) { duty_cycle-=1; } analogWrite(buck_pin,duty_cycle); } else if((VoutPin_previous &&Vin_sense>Vin_last) || (PinIout_min+1){ charge =true; } ///////////// if((Vout>Vout_max) &&(Iout 80.0){ duty_cycle=0; analogWrite(buck_pin,duty_cycle); Serial.println("과열 종료"); lcd_show("과열 실패",0,1); wdt_reset(); for(int i=0;i<10;i++){ digitalWrite(led,HIGH); digitalWrite(charge_led,LOW); 지연(4000); digitalWrite(charge_led,HIGH); 디지털 쓰기(LED, LOW); 지연(4000); } wdt_reset(); } else { 충전 =참; digitalWrite(charge_led,HIGH); 조절(Iout_sense, Vin_sense, Vout_sense); 디지털 쓰기(LED, LOW); }} 무효 soft_start() { for(int i=0;i<20;i++) { 규제(Iout_sense, Vin_sense, Vout_sense);Serial.print("Vin=");Serial.println(Vin_sense);Serial.print ("Vout=");Serial.println(Vout_sense);Serial.print("Iout=");Serial.println(Iout_sense);Serial.print("듀티 사이클=");Serial.println(duty_cycle);Serial .print("충전기 모드 :");Serial.println(모드);Serial.println("소프트 스타트 활성화됨"); 지연(32000); } 시작=거짓; mppt_init =false;} 무효 lcd_show(문자열 데이터, 정수 열, 정수 행) { lcd.setCursor(열, 행); if(data.length()>0) { for(int i=0;i 45.0){ digitalWrite(fan,HIGH);}else if(heat_sink_temp<37.0){ digitalWrite(fan,LOW);}count++;}

    회로도


    제조공정

    1. 불도저
    2. 태양 전지
    3. Arduino를 사용한 태양 전지판의 실시간 데이터 수집
    4. Arduino 스파이봇
    5. FlickMote
    6. 수제 TV B-Gone
    7. 마스터 시계
    8. 나를 찾기
    9. 솔라 트래커 V2.0
    10. 풍력 발전