Создал отдельную тему ШИМ регулирования тока ТЭНа
[ШИМ регулятор тока ТЭНа ( TRUE_RMS)]
Аппаратная платформа Arduino для автоматизации наших процессов
ace
Студент
Балашиха
46 23
Отв.300 16 Марта 13, 21:39
KD
Научный сотрудник
Танкоград
1.4K 648
Отв.301 16 Марта 13, 22:15, через 36 мин
просьба всем нафлудившим - если есть какие либо хорошие сообщения по ШИМу, перенесите их в тему ace. А тут я несколько позже почищу
ace
Студент
Балашиха
46 23
Отв.302 16 Марта 13, 22:27, через 13 мин
И это правильно!
Давайте по темам
Давайте по темам
Rager
Специалист
Смоленск
162 45
Отв.303 19 Марта 13, 23:10
Итак, обещанное.Rager, а код(скетч) у тебя секретный?Нет, не секретный
Может быть подвесил бы опробованные тобою примеры.
Я имею ввиду тот кусок скетча, который управляет "силовой частью".
Alex2x, 31 Янв. 13, 12:03
Я выложу его вместе с полной схемой, как только хотя бы три перегонки пройдут без вопросов. Сейчас пока - отладка. Сырые куски кода, думаю, никому неинтересны.
Затачиваю его (и оборудование заодно) под вторую дистилляцию: разгон, плавный подход к головам, отбор голов, отбор тела, отбор хвостов.Rager, 31 Янв. 13, 13:55
Обвеска Ардуины:
Не нарисованы релюшки (4 штуки, подключены к выводам 22, 24, 26, 28; управляют клапаном подачи воды из водопровода для охлаждения, насосом для откачивания барды после перегонки, двумя клапанами для голов и тела).
Еще не нарисована клавиатура, вот такая. Она подключена к выводам 30, 32, 34, 36, 38, 40, 42, 44.
Принцип регулировки мощности следующий. Датчик перехода сети через 0 подключен к 21 выводу Ардуины, на этот вывод вешается прерывание, возникающее при переходе через 0 (void ZeroCross() в скетче). Часть периодов симисторы открыты, часть периодов закрыты - например, для мощности в 70% они открыты 70 периодов и закрыты 30 периодов.
Дисплей от Нокии 5110, вот такой. Библиотеку для его подключения выкладывать не стал, она запросто находится в инете.
На выводы 51 и 49 заведены датчики уровня воды с гальванической развязкой по питанию (чтобы ТЭНы не сгорели). Один датчик чуть выше ТЭНов, второй - сантиметров на 5 выше первого. Еще к каждому ТЭНу припаяна гильза (кусочек нержовой трубки от телескопической антенны) с датчиком температуры внутри - просто еще одна защита от перегрева ТЭНа из-за выкипания барды. В скетче температура этих трех датчиков не измеряется, просто отслеживается флаг аварийной температуры (есть у DS18B20 такая фишка). Для этого чуть модифицировал стандартную библиотеку OneWire, она в приложении.
Клапаны для голов и тела пока не подключены, меняю банки вручную Это клапаны от газового автомобильного оборудования Lovato, вот такой.
Скетч старался комментировать по-максимуму.
Grover
Бакалавр
Москва
88 20
Отв.304 20 Марта 13, 09:42
Rager, А можно gif-ку покрупнее? Не очень хорошо читается. Я вот так и не решился себе ардуину заказать. Уж больно времени надо много, чтобы разобраться. Заказал обычный температурный контроллер + твердотельную релюшку на 40А. А тут ты, с таким подарком. Опять хочу ардуину.)
Rager
Специалист
Смоленск
162 45
Отв.305 20 Марта 13, 10:12, через 30 мин
Rager, А можно gif-ку покрупнее? Не очень хорошо читается.Grover, 20 Марта 13, 09:42На открывшейся картинке нажми справа внизу на крестик из 4 стрелочек.
Sambedded
Кандидат наук
Vancouver
376 87
Отв.306 20 Марта 13, 11:48
Rager
Пару замечаний
- поскольку ноль ты и так детектируешь, то можно вместо 3043 поставить более дешевые оптопары типа 3023
- для уменьшения потребляемого тока открытие симистора можно делать импульсом где-то в 100 мкс.
- я не совсем понял зачем тебе 2 переменных в ZeroCross()? Достаточно одной:
void ZeroCross()
{
static byte per=0;
if ((per<cur_pwr)
{
digitalWrite (PIN_TEN_1, HIGH);
digitalWrite (PIN_TEN_2, HIGH);
digitalWrite (PIN_TEN_3, HIGH);
}
else
{
digitalWrite (PIN_TEN_1, LOW);
digitalWrite (PIN_TEN_2, LOW);
digitalWrite (PIN_TEN_3, LOW);
}
++per;
if (per>=100) per=0;
}
А вообще лучше сделать по алгоритму Брезинхема - равномерно распространить пропущенные периоды вдоль всего интервала.
Пару замечаний
- поскольку ноль ты и так детектируешь, то можно вместо 3043 поставить более дешевые оптопары типа 3023
- для уменьшения потребляемого тока открытие симистора можно делать импульсом где-то в 100 мкс.
- я не совсем понял зачем тебе 2 переменных в ZeroCross()? Достаточно одной:
void ZeroCross()
{
static byte per=0;
if ((per<cur_pwr)
{
digitalWrite (PIN_TEN_1, HIGH);
digitalWrite (PIN_TEN_2, HIGH);
digitalWrite (PIN_TEN_3, HIGH);
}
else
{
digitalWrite (PIN_TEN_1, LOW);
digitalWrite (PIN_TEN_2, LOW);
digitalWrite (PIN_TEN_3, LOW);
}
++per;
if (per>=100) per=0;
}
А вообще лучше сделать по алгоритму Брезинхема - равномерно распространить пропущенные периоды вдоль всего интервала.
Grover
Бакалавр
Москва
88 20
Отв.307 20 Марта 13, 11:48, через 1 мин
Rager, Блин, точно. Не заметил. Спасибо.
Rager
Специалист
Смоленск
162 45
Отв.308 20 Марта 13, 12:10, через 22 мин
Sambedded, согласен. Я еще скетч не оптимизировал вообще, он корявый, но это первый работающий вариант.
Разницы в цене между 3043 и 3023 то ли нет, то ли она очень незначительна, у нас рублей по 25 они. К тому же первые варианты я пробовал без отдельного детектора 0, на ШИМе - в этом случае нужны оптопары со своим детектором. Потом от ШИМа отказался, а узел управления симисторами оставил старый.
Разницы в цене между 3043 и 3023 то ли нет, то ли она очень незначительна, у нас рублей по 25 они. К тому же первые варианты я пробовал без отдельного детектора 0, на ШИМе - в этом случае нужны оптопары со своим детектором. Потом от ШИМа отказался, а узел управления симисторами оставил старый.
ironman
Академик
Синегорье
5.2K 2.7K
Отв.309 20 Марта 13, 12:17, через 8 мин
В Arduino IDE есть прикол такой, что можно выделить кусок кода и потом правой кнопкой мышки выбрать из меню "Копировать для форума", а потом можно вставить в своё сообщение и получить удобно читаемую красоту.
void ZeroCross()
{
// Считаем периоды: per_1 - кол-во периодов, когда выходные тиристоры должны быть открыты; per_2 - соответственно, закрыты.
if ((per_1==0) && (per_2==0))
{
per_1=cur_pwr;
per_2=100-cur_pwr;
}
if ((per_1>0) && (per_2>=0))
{
per_1=per_1-1;
digitalWrite (PIN_TEN_1, HIGH);
digitalWrite (PIN_TEN_2, HIGH);
digitalWrite (PIN_TEN_3, HIGH);
}
if ((per_1==0) && (per_2>0))
{
per_2=per_2-1;
digitalWrite (PIN_TEN_1, LOW);
digitalWrite (PIN_TEN_2, LOW);
digitalWrite (PIN_TEN_3, LOW);
}
}
Sambedded
Кандидат наук
Vancouver
376 87
Отв.310 21 Марта 13, 11:25
В Arduino IDE есть прикол такой, что можно выделить кусок кода и потом правой кнопкой мышки выбрать из меню "Копировать для форума", а потом можно вставить в своё сообщение и получить удобно читаемую красоту.
ironman, 20 Марта 13, 12:17
Спасибо, не знал. Я вообще ардуиновсокой IDE практически не пользуюсь.
Rager
Специалист
Смоленск
162 45
Отв.311 22 Марта 13, 07:24
Обнаружилась пара принципиальных косяков в скетче.
Нужно поменять temp1 на temp2 в двух местах:
Нужно поменять temp1 на temp2 в двух местах:
if (cur_mode == 4 ) // Отбор телаи
{
if (temp1 > TEMP_TAIL_START) // Достигнута температура начала хвостов - переключаемся на отбор хвостов
if (cur_mode == 5 ) // Отбор хвостов
{
if (temp1>TEMP_FINISH) // Температура достигла температуры окончания перегонки - останавливаемся
Alex2x
Кандидат наук
DЕ
325 64
Отв.312 28 Марта 13, 23:45
вторую неделю юзаю ACS712 только 30-ти амперную, изумительная вещица. сначала запустил ёё на постоянном токе , точность совместно с авроским ацп +/- 40мА, линейность также укладывается в этот диапазон. сегодня испытал совместно с фазоимпульсным регулятором с подсчётом среднеквадратичного значения тока , результатом доволен - та же ошибка +/- 40мА ( сравнивал с образцовым цифровым rms амперметром). точность можно поднять внешним 12-16 ти разрядым ацп ,но имхо это лишнее , для наших дел этого за глаза.
НО, писал на асме быстрый код и не для ардуины, банальная мега16 с программным фазоимпульсным регулятором , rms амперметром и т.д.m16, 19 Февр. 13, 19:38
Не смог бы для ардуины пример кода?
У меня на 20а.Нагрузка 1квт ТЕН.
Измеряет ток 3.7а. Клещами 4.3а(проконтролировал точность)
Пересчитывает в ваты согласно измеренному току.
Что, где подправить?
#include <LiquidCrystal.h>
LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);
int backLight = 29;
void setup() {
pinMode(backLight, OUTPUT);
digitalWrite(backLight, HIGH);
lcd.begin(20, 4);
}
void loop() {
float average = 0;
for(int i = 0; i < 1000; i++) {
average = abs(average) + abs((0.048875855327468 * analogRead(A0) -25) / 1000);
delay(1);
}
float watt;
for(int i = 0; i < 1000; i++) {
watt = 220 * average;
delay(1);
}
lcd.setCursor ( 0, 0);
lcd.print(average);
lcd.print("A ");
lcd.setCursor ( 0, 1);
lcd.print(watt);
lcd.print("W ");
}
Sambedded
Кандидат наук
Vancouver
376 87
Отв.313 29 Марта 13, 00:27, через 42 мин
А можно по подробнее - что за клещи и как они подключения к ардуинке?
Alex2x
Кандидат наук
DЕ
325 64
Отв.314 29 Марта 13, 00:34, через 8 мин
Так тут же было уже.
Вот такая вот фиговина.
Цепляешь последовательно с ТЕНом.
Измерительные клещи-для измерения тока.
Вот такая вот фиговина.
Цепляешь последовательно с ТЕНом.
Измерительные клещи-для измерения тока.
Sambedded
Кандидат наук
Vancouver
376 87
Отв.315 29 Марта 13, 00:49, через 16 мин
я знаю что такое измерительные клещи. Вопрос какие именно клещи, в каком виде они выдают результат и как именно подключены к ардуине. на картинках номера модели и схемы подключения не видно.
Alex2x
Кандидат наук
DЕ
325 64
Отв.316 29 Марта 13, 00:58, через 9 мин
я знаю что такое измерительные клещи. Вопрос какие именно клещи, в каком виде они выдают результат и как именно подключены к ардуине. на картинках номера модели и схемы подключения не видно.
Sambedded, 29 Марта 13, 00:49
Не совсем понятен вопрос.
Обычные клещи.К ардуине они не подключены ни как. Накинуты на одну жилу идущую на ТЕН.
Да и вообще какое имеют значение клещи? Просто не было под рукой мультиметра, вот и померил клещами.
Sambedded
Кандидат наук
Vancouver
376 87
Отв.317 29 Марта 13, 01:47, через 49 мин
есть клещи с выходом на внешние устройства. и до того как ты исправил свое сообщение, можно было понять что ты меряешь подумал данные с клещей.
но все равно остается вопрос - как именно подключения у тебя датчик холла? напрямую к аналоговому входу без дополнительных элементов ?
но все равно остается вопрос - как именно подключения у тебя датчик холла? напрямую к аналоговому входу без дополнительных элементов ?
Брагин
Магистр
Краснодар
278 76
Отв.318 29 Марта 13, 09:28
Sambedded, перевожу с русского на русский - несовпадение показаний измерительных клещей (без подключения куда-то) и показний ардуины
Alex2x, нужно узнать в чем показывают клещи ток (скорее всего эфективное, а не средневыпрямленное). а раз у тебя ток 3,7А, то скорее всего на тенЕ не 100%, а при фазовой регулировке "(скорее всего эфективное, а не средневыпрямленное)"- не совпадают
Alex2x, нужно узнать в чем показывают клещи ток (скорее всего эфективное, а не средневыпрямленное). а раз у тебя ток 3,7А, то скорее всего на тенЕ не 100%, а при фазовой регулировке "(скорее всего эфективное, а не средневыпрямленное)"- не совпадают
Alex2x
Кандидат наук
DЕ
325 64
Отв.319 29 Марта 13, 11:08
есть клещи с выходом на внешние устройства. и до того как ты исправил свое сообщение, можно было понять что ты меряешь подумал данные с клещей.
но все равно остается вопрос - как именно подключения у тебя датчик холла? напрямую к аналоговому входу без дополнительных элементов ?
Sambedded, 29 Марта 13, 01:47
На прямую как есть, без дополнительных элементов.
Sambedded, перевожу с русского на русский - несовпадение показаний измерительных клещей (без подключения куда-то) и показний ардуины
Alex2x, нужно узнать в чем показывают клещи ток (скорее всего эфективное, а не средневыпрямленное). а раз у тебя ток 3,7А, то скорее всего на тенЕ не 100%, а при фазовой регулировке "(скорее всего эфективное, а не средневыпрямленное)"- не совпадают
Брагин, 29 Марта 13, 09:28
Понятно.Эффективное.