Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Arduino - солнечное зарядное устройство PV MPPT

Компоненты и расходные материалы

Arduino Nano R3
× 1
Индуктор 100 мкГн
текущие рейтинги должны соответствовать требуемой мощности.
× 1
N-канал Power MOSFET
× 1
Стандартный ЖК-экран Adafruit - 16x2, белый на синем
× 1

Необходимые инструменты и машины

Паяльник (общий)

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

На рынке доступно множество контроллеров заряда, но обычные дешевые контроллеры заряда неэффективны для использования с максимальной мощностью от солнечных батарей. А те, которые эффективны, очень дороги.

Поэтому я решил сделать свой собственный контроллер заряда, чтобы он был достаточно эффективным и умным, чтобы понимать потребности батареи и условия солнечной энергии. Требуются соответствующие действия, чтобы получить максимально доступную мощность от солнечной батареи и очень эффективно поместить ее в батарею.

Если вам нравятся мои старания, проголосуйте за это руководство.

Шаг 1. Что такое MPPT и зачем он нам нужен?

Наши солнечные панели глупы и недостаточно умны, чтобы понимать состояние батареи. Предположим, у нас есть солнечная панель 12 В / 100 Вт, и она будет давать выходную мощность от 18 до 21 В в зависимости от производителя, но батареи рассчитаны на номинальное напряжение 12 В. В условиях полной зарядки они будут 13,6 В и будут 11,0 В при полной разрядке. Теперь предположим, что наши батареи заряжаются на 13 В, панели выдают 18 В, 5,5 А при 100% эффективности работы (невозможно получить 100%, но давайте предположим). Обычные контроллеры имеют ШИМ-регулятор напряжения ckt, который понижает напряжение до 13,6 без увеличения тока. Он обеспечивает защиту только от перезарядки и утечки тока на панели в ночное время.

Чтобы решить эту проблему, я использовал понижающий преобразователь smps. Этот тип преобразователя имеет КПД более 90%. Даже 90% считаются плохими.

Вторая проблема - это нелинейная мощность солнечных батарей. Они должны работать при определенном напряжении, чтобы получить максимальную доступную мощность. Их производительность меняется в течение дня.

Для решения этой проблемы используются алгоритмы MPPT. MPPT (отслеживание максимальной точки мощности), как следует из названия, этот алгоритм отслеживает максимальную доступную мощность от панелей и изменяет выходные параметры для поддержания условий.

Таким образом, при использовании MPPT наши панели будут вырабатывать максимальную доступную мощность, а понижающий преобразователь будет эффективно направлять этот заряд в батареи.

Шаг 2. Как работает MPPT?

Я не собираюсь обсуждать это подробно, поэтому, если вы хотите понять это, взгляните на эту ссылку - Что такое MPPT?

В этом проекте я отслеживал входные характеристики V-I и выходные V-I. Умножив входное V-I и выходное V-I, мы можем получить мощность в ваттах.

Допустим, у нас есть 17 В 5 А, т.е. 17x5 =85 Вт, в любое время суток. При этом наша мощность составляет 13 В на 6 А, т.е. 13x6 =78 Вт.

Теперь MPPT будет увеличивать или уменьшать выходное напряжение до по сравнению с предыдущей входной / выходной мощностью.

Если предыдущая входная мощность была высокой, а выходное напряжение было ниже настоящего, то выходное напряжение будет снова понижено, чтобы вернуться к высокой мощности. И если выходное напряжение было высоким, то текущее напряжение будет увеличено до предыдущего уровня. Таким образом, он продолжает колебаться около точки максимальной мощности. Эти колебания минимизируются эффективными алгоритмами MPPT.

Шаг 3. Реализация MPPT на Arduino

Это мозг этого зарядного устройства. Ниже приведен код Arduino для регулирования вывода и реализации MPPT в одном блоке кода.

  // Iout =выходной ток // Vout =выходное напряжение // Vin =входное напряжение // Pin =входная мощность, Pin_previous =последняя входная мощность // Vout_last =последнее выходное напряжение, Vout_sense =текущее выходное напряжение. (float Iout, float Vin, float Vout) {
if ((Vout> Vout_max) || (Iout> Iout_max) || ((Pin> Pin_previous &&Vout_sense Vout_last ))) {if (duty_cycle> 0) {duty_cycle - =1; } analogWrite (buck_pin, duty_cycle); } else if ((Vout Pin_previous &&Vout_sense> Vout_last) || (Pin duty_cycle + =1; } analogWrite (buck_pin, duty_cycle); } Pin_previous =Пин; Vin_last =Vin; Vout_last =Vout;}

Шаг 4. Понижающий преобразователь

Я использовал N-канальный МОП-транзистор, чтобы сделать понижающий преобразователь. Обычно люди выбирают МОП-транзистор с P-каналом для переключения на высокой стороне, и если они выбирают МОП-транзистор с N-каналом для той же цели, то потребуется ИС драйвера или загрузочная обвязка ckt.

Но я модифицировал понижающий преобразователь ckt, чтобы он имел переключение на низком уровне с помощью N-канального МОП-транзистора. Я использую N-канал, потому что это низкая стоимость, высокая мощность и меньшее рассеивание мощности. В этом проекте используется МОП-транзистор логического уровня IRFz44n, поэтому им можно управлять напрямую через вывод ШИМ Arduino.

Для более высокого тока нагрузки следует использовать транзистор для подачи 10 В на затвор, чтобы полностью перевести МОП-транзистор в насыщение и минимизировать рассеиваемую мощность. Я сделал то же самое.

Как вы можете видеть на скриншоте выше, я поместил МОП-транзистор на -ve напряжения, таким образом используя + 12В от панели в качестве земли. Эта конфигурация позволяет мне использовать N-канальный МОП-транзистор для понижающего преобразователя с минимальным количеством компонентов.

Но есть и недостатки. Поскольку у вас есть две стороны -Ve напряжения, разделенные, у вас больше нет общего опорного заземления. Поэтому измерение напряжений очень сложно.

Я подключил Arduino к входным клеммам солнечной батареи, используя его линию -Ve в качестве заземления для Arduino. Мы можем легко измерить входное напряжение в этой точке, используя делитель напряжения ckt в соответствии с нашими требованиями. Но мы не можем так легко измерить выходное напряжение, потому что у нас нет общей земли.

Для этого есть хитрость. Вместо измерения напряжения на выходном конденсаторе я измерил напряжение между двумя линиями -Ve. Использование солнечного -Ve в качестве заземления для Arduino и выхода -Ve в качестве измеряемого сигнала / напряжения. Значение, полученное в результате этого измерения, следует вычесть из измеренного входного напряжения, и вы получите реальное выходное напряжение на выходном конденсаторе.

  Vout_sense_temp =Vout_sense_temp * 0,92 + float (raw_vout) * volt_factor * 0,08; // измеряем напряжение между землей входа и выхода. 
Vout_sense =Vin_sense-Vout_sense_temp-diode_volt; // изменяем разницу напряжений между двумя землями на выходное напряжение ..

Для измерения тока я использовал токоизмерительные модули ACS-712. Они были запитаны от Arduino и подключены к входу GND.

Внутренние таймеры модифицированы для усиления ШИМ 62,5 кГц на выводе D6, который используется для управления полевым МОП-транзистором. Для обеспечения защиты от обратной утечки и обратной полярности потребуется выходной блокирующий диод. Для этой цели используется диод Шоттки с желаемым номинальным током. Значение индуктивности зависит от требований к частоте и выходному току. Вы можете использовать доступные онлайн калькуляторы понижающего преобразователя или использовать нагрузку 100uH 5A-10A. Никогда не превышайте максимальный выходной ток индуктора на 80% -90%.

Шаг 5. Последний штрих

Вы также можете добавить к зарядному устройству дополнительные функции. У меня есть ЖК-дисплей для отображения параметров и 2 переключателя для ввода данных от пользователя.

Я обновлю окончательный код и завершу схему ckt очень скоро.

Шаг 6. Фактическая принципиальная схема, спецификация и код

ОБНОВЛЕНИЕ:

Я загрузил код, бомбу и схему. Он немного отличается от моего, потому что его проще сделать.

Solar_charger_tutorial_code.ino

Код

  • Solar_charger_tutorial_code.ino
Solar_charger_tutorial_code.ino Arduino
 /////////////////////////////////////////////// //////////////////////////////////////////Условия эксплуатации///// ////////////////////////////////////////////////// ////////////////////////////////// ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ // ПОДРАЗУМЕВАЕМЫЕ, ВКЛЮЧАЯ ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ, НО НЕ ОГРАНИЧЕННАЯ, НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ // АВТОРЫ ИЛИ ДЕРЖАТЕЛИ АВТОРСКИХ ПРАВ НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГИЕ // ОТВЕТСТВЕННОСТЬ, БЫЛИ В ДЕЙСТВИИ КОНТРАКТА, ИЛИ ИНОСТРАННЫМИ ПРОТИВОПОКАЗАНИЯМИ, ПРОЯВЛЯЕМЫЕ ИЗ, // НЕ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИСПОЛЬЗОВАНИЕ ИЛИ ДРУГИЕ СДЕЛКИ В // ПРОГРАММНОМ ОБЕСПЕЧЕНИИ .//////////////////////////////////////// /////////////////////////////////////////////// # include  #include  #include  #define vin_pin A1 # define vout_pin A0 #define iout_pin A2 # define iin_pin A3 # define lm35 A4 # define fan 5 # define buck_pin 6 # define menu 3 # кнопка определения 2 # определение светодиода 13 # определение charge_led A5 # определение света 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, Iin; float_sense, Vin_Sense, Vin_Sense, Vin_ssense, Vin_Sense, Vout_sense; 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); void lcd_show (строковые данные, столбец int, строка int); void UI (); void set_limits (int cmd, int temp); void mem_read (); void mem_write (); void mppt (); недействительная настройка () {wdt_disable (); watchdogSetup (); // поместите здесь свой установочный код для однократного запуска: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; // heat_sink_temp =raw_lm35 * 0,48; // 0,0049 * 1000/10 // heat_sink_temp =heat_sink_temp-273.15; // раскомментируйте при использовании LM235} ////////// void watchdogSetup (void) {cli (); // отключить все прерыванияwdt_reset (); // сбросить таймер WDT // Войти в режим конфигурации сторожевого таймера:WDTCSR | =(1 < Vout_max) || (Iout> Iout_max) || ((Pin> Pin_previous &&Vin_sense  Vin_last))) {if (duty_cycle> 0) {duty_cycle- =1; } analogWrite (buck_pin, duty_cycle); } else if ((Vout  Pin_previous &&Vin_sense> Vin_last) || (Pin  Iout_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 (); для (int я =0; я <10; я ++) {digitalWrite (светодиод, ВЫСОКИЙ); digitalWrite (charge_led, НИЗКИЙ); задержка (4000); digitalWrite (charge_led, ВЫСОКИЙ); digitalWrite (светодиод, НИЗКИЙ); задержка (4000); } wdt_reset (); } еще {заряд =истина; digitalWrite (charge_led, ВЫСОКИЙ); регулировать (Iout_sense, Vin_sense, Vout_sense); digitalWrite (светодиод, НИЗКИЙ); }} void soft_start () {for (int i =0; i <20; i ++) {regate (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 ("Duty cycle ="); Serial.println (duty_cycle); Serial .print ("РЕЖИМ зарядного устройства:"); Serial.println (режим); Serial.println ("Мягкий запуск активирован"); задержка (32000); } startup =false; mppt_init =false;} void lcd_show (строковые данные, столбец int, строка int) {lcd.setCursor (столбец, строка); if (data.length ()> 0) {для (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 Spybot
  5. FlickMote
  6. Самодельный телевизор B-Gone
  7. Основные часы
  8. Найди меня
  9. Solar Tracker V2.0
  10. Сила ветра