Arduino Mega PWM — период 100 мс — твердотельное реле и нагреватель

pwm

Я не очень разбираюсь в «основных» функциях Arduino, поэтому мне нужна ваша помощь.

Я использую твердотельное реле для управления нагревательным элементом с библиотекой ПИД (PID_v1.h) для получения ВЫХОДНЫХ сигналов ШИМ.

Сам код не является проблемой, поэтому выкладывать его сюда не буду.

Подводя итог, это код, в котором я отправляю ШИМ на реле: AnalogWrite(RELAY_OUT, выходное значение);

В этой статье я нашел следующее: «Функция AnalogWrite используется для установки рабочего цикла последовательности импульсов ШИМ, которая работает с частотой примерно 500 Гц. Таким образом, при частоте = 500 Гц период = 2 мс».

Меня беспокоит то, что время срабатывания реле (FOTEK SSR-60 DA) составляет 10 мс (на включение или выключение), но я НЕ ЗНАЮ, как настроить Arduino PWM для работы соответственно этому реле, в период больше 10 мс.

На некоторых страницах я обнаружил, что некоторые люди меняют тактовую частоту, чтобы получить «быструю ШИМ», но мне нужно знать, какие значения мне нужно использовать, чтобы получить «медленную ШИМ» на период больше этого 10 мс.

Можете ли вы мне с этим помочь? Я долго искал этот ответ, но не смог найти «окончательного» ответа.

Заранее спасибо!

Эвертон

, 👍1

Обсуждение

Я не думаю, что вы сможете ШИМ-регулировать эти SSR FOTEK на частоте 100 Гц! Они включаются только при пересечении нуля и остаются на покатой полуволне. Таким образом, в зависимости от того, насколько синхронизирован ваш таймер с частотой сети 50 Гц, реле будет все время включено или все время выключено., @Gerben

Вам нужен другой тип PID. В большинстве ПИД-кодов есть возможность использовать выходной сигнал включения/выключения вместо аналогового значения для ШИМ. Для обогревателя минимальное время между шансами может составлять от 5 секунд до 1 минуты, в зависимости от физической системы. Вы читали эту страницу о реле: https://playground.arduino.cc/Code/PIDLibrary. Если вы хотите использовать это твердотельное реле, вам придется игнорировать время его отклика (это не то, насколько быстро его можно повернуть). постоянно включается и выключается), и вам придется игнорировать всех, кто все еще говорит о ШИМ., @Jot

Знаете ли вы, насколько быстра физическая система? Нагреватели часто управляются очень медленно по сравнению с реакцией ТТР на переход через ноль ~10 мс. Печи размером с дом часто имеют рабочий цикл более минуты, а электрические плиты имеют рабочий цикл порядка секунд. Как быстро может измениться температура, если обогреватель включен на полную мощность? Выборка и настройка должны происходить в 5–20 раз быстрее, чем постоянная времени процесса, и вы можете использовать выход PID_v1 с вашим твердотельным реле для управления нагревателем, например, с разрешением 5 минут на 10 мс = 30 000 шагов., @Dave X

Спасибо большое, ребята! Я попытался реализовать решение с использованием регистров MEGA, как вы предложили, но думаю, что больше не буду использовать ШИМ с этим SSR. Мне понравилось предложение @Jot, и я реализую контроль включения/выключения. Поскольку я собираюсь нагреть 60 литров (15 галлонов) жидкости в своей пивной машине, я считаю, что период от 1 до 5 минут подойдет моим потребностям. Большое спасибо за все ваши быстрые и полезные ответы!, @Everton JS


2 ответа


0

Используйте регистры ШИМ ATmega напрямую, чтобы добиться частоты ШИМ около 100 Гц (период 10 мс).

Это пример периода ШИМ 10 мс с рабочим циклом 50% на Arduino Mega (контакт D11):

   /* Настройте вывод D11 ШИМ как выход */
   pinMode(11, OUTPUT); //D11/PB5/OC1A

   /* Регистры управления таймером/счетчиком: TCCRxx */
   TCCR1A = 0;            //Очистить реестр
   TCCR1B = 0;            //Таймер/счетчик остановлен (CS12=0,CS11=0,CS10=0)

   TCCR1A = (1<<WGM11)  | //Режим быстрой ШИМ 16 бит (WGM13=1,WGM12=1,WGM11=1,WGM10=0)
            (1<<COM1A1);  //Устанавливаем ВЫСОКИЙ выход во время периода рабочего цикла OC1A

   TCCR1B = 2                     |   //Прескалер: делим на 8
            (1<<WGM12)            | 
            (1<<WGM13);  

   /* Set PWM frequency */
   ICR1   = 20000; // Период, выраженный в тиках (10 мс)

   /* Clear PWM counter */
   TCNT1  = 0;

   /* Set duty cycle to 50% */
   OCR1A  = 10000;  

Я не проверял, но думаю, что это правильно.

Прочитайте это и это для подробностей.

,

1

Я бы предложил использовать библиотеку TimerOne.

Вызовите Timer1.initialize(10000) в setup. Затем вызовите Timer1.pwm(pin,duty); в своем цикле. Где pin равен 11, 12 или 13 для MEGA, а duty находится в диапазоне от 0 до 1023.

,

В физической интерпретации это устанавливает 10-секундный рабочий цикл с разрешением 10/1024 = 9,78 мс, что соответствует характеристикам скорости SSR., @Dave X