цифровая электроника
вычислительная техника
встраиваемые системы

 

Синусоидальный инвертор на Arduino своими руками

Автор: Mike(admin) от 29-03-2019, 04:55

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


Синусоидальный инвертор на Arduino своими руками

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


Итак, в случае с синусоидальной широтно-импульсной модуляцией ширина сигнала увеличивается и уменьшается, и это моделирует кривую синусоидальной волны. При импульсе малой ширины выходной сигнал будет немного увеличиваться, и это будет представлять зону после пересечения 0 синусоидальной волны. Затем с большей шириной выходной сигнал становится все больше и больше, а затем начинает снижаться, как синусоида. При использовании двух сигналов мы можем получить как положительные, так и отрицательные стороны синусоиды.


ШИМ

На рисунке ниже мы можем немного лучше увидеть, как ширина синусоидальной широтно-импульсной модуляции может создать хорошую синусоидальную форму на выходе. И это именно то, что необходимо для инвертора. Мы будем использовать Arduino для генерации этого сигнала на частоте 50 Гц, как обычного сигнала переменного тока из розетки дома. Мы применяем этот сигнал к драйверу, а затем к полевым МОП-транзисторам. Они будут подключены к трансформатору, который будет увеличивать напряжение, а также создавать синусоидальный сигнал.


Синусоидальный инвертор на Arduino своими руками

Схема подключения следующая:


Синусоидальный инвертор на Arduino своими руками

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


Так как мы можем создать сигнал синусоидальной широтно-импульсной модуляции? Что касается Arduino, то в коде мы реализуем два выхода для ШИМ, устанавливая регистры TCCR1B и TCCR1A. Теперь нам нужно изменить ширину этого сигнала, изменив значение OCR1A. Но какие значения нам нужно использовать? Приведенные вначале кода значения не являются случайными, они должны следовать кривой синусоиды. Таким образом, зная диапазон минимума и максимума сигнала ШИМ, мы могли бы создать значения синусоиды от 0 до 180 градусов. Мы храним эти значения в векторе.


В коде присутствует пустой бесконечный цикл, поскольку в прерывании ISR есть все, что мы должны сделать для генерации сигналов. Здесь мы меняем ширину ШИМ для обоих выводов. Изменяя скорость в ISR, мы меняем частоту выходного сигнала, в данном случае реализуем сигнал 50 Гц. Вот код синусоедального инвертора на Arduino.



#include <avr/io.h>
#include <avr/interrupt.h>

// Справочные таблицы по 200 записей в каждой, нормализованные до максимального значения 1600, которое является периодом ШИМ, загруженного в регистр ICR1
int lookUp1[] = {
50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,
542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,
981 ,1020 ,1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,
1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,
1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 ,1597 ,1599 ,1600 ,
1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,
1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,
1264 ,1233 ,1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,
899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,
446 ,398 ,349 ,300 ,250 ,201 ,151 ,100 ,50 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};

int lookUp2[] = {
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,
542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,
981 ,1020 ,1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,
1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,
1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 ,1597 ,1599 ,1600 ,
1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,
1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,
1264 ,1233 ,1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,
899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,
446 ,398 ,349 ,300 ,250 ,201 ,151 ,100 ,50 ,0};


void setup(){
    // Инициализация регистров, смотрите документацию для подробной информации
    TCCR1A = 0b10100010;
    TCCR1B = 0b00011001;
    TIMSK1 = 0b00000001;
    ICR1   = 1600;     // Частота кварца 16 МГц, для частоты переключения 100 кГц для 200 подвидов за период синусоидальной волны 50 Гц
    sei();             // Разрешаем глобальные прерывания
    DDRB = 0b00000110; // PB1 и PB2 выходные каналы.
    pinMode(13,OUTPUT);
}

void loop(){; /*Пустой бесконечный цикл*/}

ISR(TIMER1_OVF_vect){
    static int num;
    // менять рабочий цикл каждый период.
    OCR1A = lookUp1[num];
    OCR1B = lookUp2[num];
    
    if(++num >= 200){ // Предварительно увеличьте значение num, затем проверьте, что оно меньше 200
       num = 0;       // Сброс num.
     }
}



© digitrode.ru


Теги: Arduino, инвертор



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий