Оглавление:

Синусоида Arduino для инверторов: 4 шага
Синусоида Arduino для инверторов: 4 шага

Видео: Синусоида Arduino для инверторов: 4 шага

Видео: Синусоида Arduino для инверторов: 4 шага
Видео: Генератор с регулировкой частоты на Arduino 2024, Ноябрь
Anonim
Синусоида Arduino для инверторов
Синусоида Arduino для инверторов

В этом проекте я сгенерировал сигнал SPWM (синусоидальный импульс с широкой модуляцией) из двух цифровых выходов arduino pwm.

Поскольку для создания такой программы мне нужно поговорить о многих других функциях и свойствах Arduino, полный проект, включая изображения осциллографа и для разных частот, посетите мой веб-сайт:

eprojectszone

Шаг 1: Генерация ШИМ-сигнала для 50 Гц

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

Чтобы понять типы переменных рабочих циклов Arduino, вы можете прочитать эти 3 части того же поста 1, 2 и 3.

Предположим, наша частота составляет 50 Гц, что означает период времени 20 мс. Итак, 10 мс - это период полупериода. В течение этих 10 мс нам нужно иметь много импульсов с разными рабочими циклами, начиная с малых рабочих циклов, в середине сигнала у нас есть максимальные рабочие циклы и заканчиваются также небольшими рабочими циклами. Чтобы сгенерировать синусоидальную волну, мы будем использовать два контакта, один для положительный полупериод и один отрицательный полупериод. В нашем посте для этого мы используем контакты 5 и 6, что означает таймер 0.

Для плавного сигнала мы выбираем фазово-правильный ШИМ на частоте 31372 Гц - см. Предыдущий пост. Одна из самых больших проблем заключается в том, как мы вычисляем необходимый рабочий цикл для каждого импульса. Итак, поскольку наша частота f = 31372 Гц, период для каждого импульса составляет T = 1/31372 = 31,8 мкс, поэтому количество импульсов за полупериод составляет N = 10 мс / 31,8 мкс = 314 импульсов. Теперь, чтобы рассчитать рабочий цикл для каждого импульса, у нас есть y = sinx, но в этом уравнении нам нужны градусы, поэтому полупериод имеет 180 градусов для 314 импульсов. Для каждого импульса мы имеем 180/314 = 0,57 град / импульс. Это означает, что для каждого импульса мы продвигаемся вперед на 0,57 градуса.

y - рабочий цикл, а x - значение положения при половинном рабочем цикле. сначала x равен 0, затем x = 0,57, x = 1,14 и так далее до x = 180.

если мы вычислим все 314 значений, мы получим массив из 314 элементов (тип «int» для упрощения вычисления с помощью Arduino).

Такой массив:

int sinPWM = {1, 2, 5, 7, 10, 12, 15, 17, 19, 22, 24, 27, 30, 32, 34, 37, 39, 42, 44, 47, 49, 52, 54, 57, 59, 61, 64, 66, 69, 71, 73, 76, 78, 80, 83, 85, 88, 90, 92, 94, 97, 99, 101, 103, 106, 108, 110, 113, 115, 117, 119, 121, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 178, 180, 182, 184, 185, 187, 188, 190, 192, 193, 195, 196, 198, 199, 201, 202, 204, 205, 207, 208, 209, 211, 212, 213, 215, 216, 217, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 248, 248, 249, 249, 249, 249, 249, 250, 250, 250, 250, 249, 249, 249, 249, 249, 248, 248, 248, 248, 247, 247, 247, 246, 246, 245, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 239, 238, 237, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 217, 21 6, 215, 213, 212, 211, 209, 208, 207, 205, 204, 202, 201, 199, 198, 196, 195, 193, 192, 190, 188, 187, 185, 184, 182, 180, 178, 177, 175, 173, 171, 169, 168, 166, 164, 162, 160, 158, 156, 154, 152, 150, 148, 146, 144, 142, 140, 138, 136, 134, 132, 130, 128, 126, 124, 121, 119, 117, 115, 113, 110, 108, 106, 103, 101, 99, 97, 94, 92, 90, 88, 85, 83, 80, 78, 76, 73, 71, 69, 66, 64, 61, 59, 57, 54, 52, 49, 47, 44, 42, 39, 37, 34, 32, 30, 27, 24, 22, 19, 17, 15, 12, 10, 7, 5, 2, 1};

Вы можете видеть, что, как и у синусоиды, рабочий цикл самый низкий у первого и последнего элемента и самый высокий в середине.

Шаг 2: программа Arduino для переменного рабочего цикла

Программа Arduino для переменного рабочего цикла
Программа Arduino для переменного рабочего цикла

На изображении выше у нас есть сигналы с переменной скважностью со значениями из массива.

Но как сделать такой сигнал ??

часть программы ниже использует прерывания для изменения значений рабочих циклов

sei (); // разрешаем прерывания

}

ISR (TIMER1_COMPA_vect) {// прерывание, когда таймер 1 совпадает со значением OCR1A

if (i> 313 && OK == 0) {// конечное значение вектора для вывода 6

i = 0; // перейти к первому значению вектора (массива)

OK = 1; // включить вывод 5

}

x = sinPWM ; // x берет значение из вектора, соответствующего позиции i (i имеет нулевой индекс) -значение рабочего цикла

i = i + 1; // перейти на следующую позицию

}

Шаг 3: чередование контактов Arduino с частотой 50 Гц

Чередование на выводах Arduino 50 Гц
Чередование на выводах Arduino 50 Гц

Поскольку каждый вывод генерирует только половину рабочего цикла, чтобы получить полную синусоидальную волну, мы используем два вывода, которые чередуются один за другим через точно 10 мсек (для 50 Гц). Это изменение выводов выполняется в конце массива - после того, как, скажем, вывод 5 сгенерировал 314 импульсов, этот вывод отключается и активируется вывод 6, что делает то же самое, но для отрицательного рабочего цикла.

Поскольку arduino может генерировать только положительные сигналы, отрицательный рабочий цикл создается в мосте h - вы можете прочитать об этом здесь

Программа для смены пинов:

sei (); // разрешаем прерывания

}

ISR (TIMER1_COMPA_vect) {// прерывание, когда таймер 1 совпадает со значением OCR1A

if (i> 313 && OK == 0) {// конечное значение вектора для вывода 6

i = 0; // перейти к первому значению вектора

OK = 1; // включить вывод 5

}

if (i> 313 && OK == 1) {// конечное значение вектора для вывода 5

i = 0; // перейти к первому значению вектора

OK = 0; // включить вывод 6

}

x = sinPWM ; // x берет значение из вектора, соответствующего позиции i (i имеет нулевой индекс)

i = i + 1; // перейти на следующую позицию

if (OK == 0) {

OCR0B = 0; // делаем вывод 5 0

OCR0A = x; // активируем вывод 6 для соответствующего рабочего цикла

if (OK == 1) {

OCR0A = 0; // делаем вывод 6 0

OCR0B = x; // активируем вывод 5 для соответствующего рабочего цикла

}

}

Шаг 4: Установка Н-моста и фильтрация ШИМ-сигнала

Сигналы, полученные от Arduino, являются управляющей частью для приложений инвертора, потому что оба положительные. Чтобы получить полную синусоиду и практичный инвертор, мы должны использовать мост h, а для очистки ШИМ - фильтр нижних частот.

Здесь представлен H-образный мост.

Фильтр нижних частот, протестированный с небольшими двигателями переменного тока - здесь.

Рекомендуемые: