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

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

Если вам нужна дополнительная информация, дайте мне знать, заранее спасибо!

Оллс

таблицу, которую я использую для расчета значений.

р>
#include "TimerOne.h"

int duty_cycle;
int x = 0;

// таблица sin_table состоит из значений sin(0-400), умноженных на PWM_PERIOD
// https://docs.google.com/spreadsheets/d/1iyveHnOxIzqg907T6pu4znsJE-6tg40juMihDvU8Tbg/edit?usp=sharing
uint8_t _sin[] = { // Рассчитано для 50 Гц при 200 импульсах на полуволну.
    0,0,0,1,1,1,2,2,3,3,3,4,4,5,5,5,6,6,6,7,7,8,8,8,9,9,9,10,10,10,11,11,12,12,12,13,13,13,14,14,14,15,15,15,15,16,16,16,17,17,17,17,18,18,18,19,19,19,19,19,20,20,20,20,21,21,21,21,21,22,22,22,22,22,22,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,21,20,20,20,20,19,19,19,19,19,18,18,18,17,17,17,17,16,16,16,15,15,15,15,14,14,14,13,13,13,12,12,12,11,11,10,10,10,9,9,9,8,8,8,7,7,6,6,6,5,5,5,4,4,3,3,3,2,2,1,1,1,0,0,0,0,0,1,1,1,2,2,3,3,3,4,4,5,5,5,6,6,6,7,7,8,8,8,9,9,9,10,10,10,11,11,12,12,12,13,13,13,14,14,14,15,15,15,15,16,16,16,17,17,17,17,18,18,18,19,19,19,19,19,20,20,20,20,21,21,21,21,21,22,22,22,22,22,22,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,23,23,23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,21,20,20,20,20,19,19,19,19,19,18,18,18,17,17,17,17,16,16,16,15,15,15,15,14,14,14,13,13,13,12,12,12,11,11,10,10,10,9,9,9,8,8,8,7,7,6,6,6,5,5,5,4,4,3,3,3,2,2,1,1,1,0,0,0
};

void setup() {
    // Режим закрепления и установка низкого уровня.
    DDRD = DDRD | B00011000;
    PORTD = B00000000;

    Timer1.initialize(47);
    Timer1.attachInterrupt(pwm);
}

void pwm() {
    if (PIND & B00000100) { // Переключатель блокировки

        // Нижняя половина или верхняя половина волны, запуск импульса ШИМ
        if (x > 200) {
            PORTD = B00010000;
        } else {
            PORTD = B00001000;
        }

        duty_cycle = _sin[x];
        if (duty_cycle > 3) {
            delayMicroseconds(duty_cycle);
        }

        PORTD = B00000000;

        x++;
        if (x > 400) {
            x = 0;
        }
    }
}

void loop() {}

, 👍0

Обсуждение

Почему бы не использовать один таймер для ШИМ на выводах, а второй (более медленный) таймер для изменения рабочего цикла в соответствии с синусоидальной волной. Таким образом, вам также не нужно менять код, чтобы иметь другую частоту. Вероятно, вам также потребуется добавить RC-фильтр к выходным контактам и, возможно, повторитель напряжения, чтобы получить стабильный выходной сигнал, независимо от того, какой ток вы потребляете., @Gerben

У меня это заработало. К сожалению, схема не принадлежит мне, но она состояла из нескольких транзисторов для переключения ШИМ до 20 В, которые затем вошли в схему инвертора (созданную не мной, довольно сложную), которая объединила два сигнала ШИМ в переменный ток. сигнал. Затем был трансформатор и RC-фильтр для сглаживания и усиления ШИМ. Извините, я ничем больше не могу помочь, но это было давно, и я не все успел., @olls

http://arduinoprosto.ru/q/23842/three-phase-sine-wave-inverter-using-arduino указывает на статью с некоторыми схемами., @Dave X