27 МОСКОВСКАЯ ВСТРЕЧА
Форум самогонщиков Сайт Барахолка Магазин 27 МОСКОВСКАЯ ВСТРЕЧА

Регулятор напряжения и тока на Arduino Pro Mini

Форум самогонщиков Автоматика
1 ... 37 38 39 40 41 42 43 ... 58 40
SlidingHawk Студент Дымер 18 4
Отв.780  28 Мая 18, 13:06
Ну я конечно далекий но не настолько. У меня как нагрузка паяльник 40Вт был включен.


Вот финальная печатка U-A reg. Элементы и перемычки с нашей стороны, СМД со стороны дорожек, дорожки на плате с противоположной стороны от нас, смотрим как на плату из прозрачного текстолита. Печатать на бумаге для струйной фотопечати на лазерном принтере как есть, потом утюгом к текстолиту, дать остыть и оторвать бумагу от текстолита на сухую, без воды. На дорожках остается белясый налет( пленка закрепляющая фотобумаги, ее не снимать травить как есть).

Сверлить советую после травки.
Final Ureg-Areg so storony detaley. dlya LUT.JPG
Final Ureg-Areg so storony detaley. dlya LUT.JPG Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.

Final Uregulator.lay6 69.4 Кб
anddin Магистр Астрахань 259 121
Отв.781  28 Мая 18, 13:51, через 46 мин
Ниже ссылка на трансформатор 220-12в.
Возможно ли его применение?
https://ru.aliexpress.com/...b01b783ce8fb634
Tomat7 Магистр Черноморская губинния 236 138
Отв.782  28 Мая 18, 14:20, через 29 мин
Ниже ссылка на трансформатор 220-12в.
Возможно ли его применение?anddin, 28 Мая 18, 13:51
У меня регулятор именно на таком и собран.  ;D
Можно еще меньше найти - https://ru.aliexpress.com/....274233ed8s7urs
В этой ветке уже кто-то писал что можно любой транс использовать выдающий на вторичной обмотке от 9 до 20 вольт.

поставлю на выходе диодный мост, и сглаживающие кондеры на 0,1 и 10 000 мкф, потом стрелочный вольтметрSlidingHawk, 28 Мая 18, 12:17
Шокированный Непонимающий Только сейчас обратил внимание... Ты же вроде спираль 300 Вт греть собирался, зачем постоянка??
SlidingHawk Студент Дымер 18 4
Отв.783  28 Мая 18, 15:06, через 47 мин
Все получилось, все работает, на выходе диодный мост GSIB 1580 И пара конденсаторов 680мкф 400 вольт.

Стабильность 149-150 вольт при напряжении в сети 201-219 вольт.

Добавлено через 4мин.:

Ты же вроде спираль 300 Вт греть собирался, зачем постоянка??Tomat7, 28 Мая 18, 14:20

Постоянка для того, что при постоянке, нихром не дает дребезга при резе пенополистирола, + конденсаторы у меня на постоянку были вот и поставил их. )


Добавлено через 15ч. 34мин.:

Ниже ссылка на трансформатор 220-12в.
Возможно ли его применение?anddin, 28 Мая 18, 13:51

Как раз под мою плату трансик. )))
SA1348 Профессор Саратов 3.3K 1.5K
Отв.784  29 Мая 18, 08:18
Оффтоп.
SlidingHawk, Вот у тебя заморочки. Всегда резал полистирол постоянкой, один раз подобрав режим длиной спирали.(Не рабочей части а именно спирали.) И плюс стабилизированная скорость подачи, которая имеет гораздо большую роль нежели стабилизация напряжения питания.


Как раз под мою плату трансик.SlidingHawk, 28 Мая 18, 15:06
500 рублей за трансик? Неужели нигде не валяются блоки питания? Я себе выпаял оттуда и норма. Только БП должен быть не импульсным, старого образца.
SlidingHawk Студент Дымер 18 4
Отв.785  29 Мая 18, 19:47
 
SlidingHawk, Вот у тебя заморочки. Всегда резал полистирол постоянкой, один раз подобрав режим длиной спирали.(Не рабочей части а именно спирали.)SA1348, 29 Мая 18, 08:18


Ну если бы выдели мой станок, то так бы не говорили, ))) У меня стоит 3 метра спирали, и система динамического изменения длины режущей части от 100мм до 1200. Подача задается програмно для разных резов. Вся проблема в том что у нас в сети прогулки вольтажа от 170 до 230 в зависимости от времени суток, и +- 15 вольт не зависимо от чего не понятно, более мение стабильно с 2-х до 5 утра. А моя программа выреза 14 пар крыльев для самолетиков занимает примерно 4 часа. И вместо того что бы загрузить пену в станок и пойти спать приходится сидеть и крутить ручку димера что бы держать хоть +- 3 вольта.
А сегодня ночью загрузил 7 листов пенопласта и утром получил 300 метров багетов (потолочных плинтусов) с точностью вырезки примерно в 0.02 мм. на глаз не видно а на ощупь ощутимо, но не критично.

Добавлено через 2мин.:


500 рублей за трансик?SA1348, 29 Мая 18, 08:18

У нас он стоит 50грн. это примерно 1.6$  для сравнения "биг мак" стоит 45 грн.


Добавлено через 1дн. 23ч. 21мин.:

Мужики, благодарочка всем кто приложил руку и голову к этому девайсу, сегодня еще раз протестировал с в жестком режиме, 7 часов реза, полет нормальный качество реза, просто замечательное, резал днем, в сети были скачки до 15 вольт в разные стороны, в среднем в сети было 205 вольт. стабилизация 157 прыгала 156-158. Доволен как слон. Еще раз всем спасибо.
tronik Студент Самара 26 6
Отв.786  01 Июня 18, 19:41
Приветствую!
Пользую данный регулятор тока как отдельный контроллер тэна с управлением по serial. Озадачился переделать куб под аналог ПВК, тоесть доделать к нему пароводяную рубашку. В связи с вновь возникшими задачами изменились требования к контроллеру тена, а именно теперь он должен работать не только как регулятор мощности, но и как пид регулятор, тоесть если по serial приходит значение мощности, держим эту мощность, если значение температуры - держим температуру. Как это можно реализовать?
sebra Куратор Республика Коми 147 85
Отв.787  03 Июня 18, 18:39
Как это можно реализовать?tronik, 01 Июня 18, 19:41

ПИД у вас должен быть реализован в вашей автоматике, и автоматика же дает команду на требуемую мощность регулятору. Не стоит пихать невпихуемое в простой регулятор напряжения/тока он для этого не предназначен =) Возможно стоит посмотреть в сторону автоматики, например АВВИ, как правило запросы по функционалу со временем только растут.
m16 Модератор Тамбов 1.9K 1K
Отв.788  03 Июня 18, 21:11
Не стоит пихать невпихуемое в простой регулятор напряженияsebra, 03 Июня 18, 18:39
поправлю - простой стабилизатор напряжения(тока).

tronik , пид нафик в нашем случае не нужен, сей стабилизатор напряжения(тока) выполняет те же функции пида при значительно компактном коде
tronik Студент Самара 26 6
Отв.789  03 Июня 18, 21:35, через 24 мин
Идею понял, регулятор не трогаю, буду добиваться нужной температуры путем подачи требуемой мощности.Спасибо.
сообщение удалено
Максим_В Новичок Тольятти 9
Отв.790  13 Июня 18, 18:53
Здравствуйте. Собрал в итоге по схеме и прошивке из этого сообщения [сообщение #13179698]
Соберите схему полностью, протестируйте, остануться вопросы пишите.sebra, 16 Апр. 18, 14:49
В железе не подтянул, детектор ноля-подтянул в программе.Начал прогонять на реальной нагрузке, измеренное сопротивление 32 Ома, мощность 1600Вт - кратковременно, затем снижается( в программе выставил 1500 максимальная(по "паспорту" и 32 ОМ)). Вопросы:
1. ТЭН 1500Вт, в программе записал 32 ома. Напряжение при "Разгоне" просело до 207В, потребляет по ваттметру 1350-отображает 1265,при потребляемой 724 показывает 670 Вт. Что подправить? Максимальную мощность или сопротивление? Это не основной вопрос.
2.Изначально не включалась нагрузка. При касании землёй осциллографа минуса управы, импульсы доходили до симистора. Повесил конденсатор 1нФ*1000В с минуса на вх. 220В(последнее фото, около светодиода). Всё вроде заработало, но в итоге сегодня прогонял с водой и заметил что скачет измеренная мощность ниже 800Вт, особенно когда дотрагиваешься радиатора симистора(даже слышно ну и по светодиоду заметно). Подскажите пожалуйста, кто знает как побороть. Компоновку выкладываю. Почему-то здесь не смог прикрепить, а ссылки на др. ресурсы только после 10 сообщений  Грустный


Добавлено через 33мин.:

Вот


Добавлено через 12ч. 6мин.:

В итоге с основным вопросом разобрался. Сначала подтянул вывод детектора к плюсу через 5к2-не помогло, затем через 1К-всё стабильно.
IMAG1204.jpg
IMAG1204.jpg Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
IMAG1206.jpg
IMAG1206.jpg Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
IMAG1210.jpg
IMAG1210.jpg Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
IMAG1212.jpg
IMAG1212.jpg Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
IMAG1213.jpg
IMAG1213.jpg Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
Tomat7 Магистр Черноморская губинния 236 138
Отв.791  14 Июня 18, 10:53
детектор ноля-подтянул в программе.
При касании землёй осциллографа минуса управы, импульсы доходили до симистора. Повесил конденсатор 1нФ*1000В с минуса на вх. 220В(последнее фото, около светодиода).
Сначала подтянул вывод детектора к плюсу через 5к2-не помогло, затем через 1К-всё стабильно.Максим_В, 13 Июня 18, 18:53

Как-то слишком много "сложностей" сразу и везде - и в программе, и в железе.
Должно работать безо всяких "доработок".

А что за светодиод? Куда подключен??
Максим_В Новичок Тольятти 9
Отв.792  14 Июня 18, 13:11
Подтяжка сейчас только в железе. Светодиод параллельно(через 680 ом) светодиоду оптопары симистора.
Выставил в программе сопротивление тэна 35 Ом, примерно всё соответствует, работает стабильно. Всем участвовавшим в разработке этого стабилизатора, большое спасибо!
dev11bk Студент Салават 20 31
Отв.793  19 Июля 18, 22:28
Всем привет!
Покурил тему пару-тройку дней. Желание бешенное появилось собрать сие чудо.

Что имеется:
1. ТЭН 4.5 кВт
2. Примитивный блок управления на симисторе BTA10 (точнее пока не могу сказать, какой именно). В блоке китайский диммер с алика (который с регулировкой потенциометром) якобы на 10 кВт, измеритель мощности (синенький жк экран с 4 показаниями, думаю всем знаком) и автомат. Ток и напряжение измеряется на входе, дабы контролировать потребляемую мощность.
3. Постоянно приходится подкручивать регулировку, так как мощность скачет +-250 Вт, судя по показанию измерителя.

Чего хочется:
1. Доработать этот хлам до стабилизированного.
2. Чтобы осталась регулировка потенциометром. (тут есть мысль подключить на аналоговый вход ардуины 10К потенциометр и конвертировать его в % задания)

В связи с этим всем несколько вопросов:
1. Возможно ли построить на этом симисторе стабилизированный регулятор? Может кто делал уже? Или лучше будет купить предложенный в схеме симистор?
2. Какую схему выбрать из предоставленных в первом посте? Наиболее простую что-ли. Мне главное, чтобы стабильная мощность подавалась на ТЭН. Измеритель хочу оставить и по нему ориентироваться.
3. Может проще купить в магазине стабилизатор напряжения и в него втыкать мой комплект? Но очень хочется заморочиться с ардуино.

Немного о себе
- в схемотехнике близок к нулю
- с паяльником дружу
- в программировании волоку
- ТЭН использую максимум до 3 кВт, так как страшно за китаюскую железяку и проводку.

Прошу сильно не шпынять, очень хочу разобраться и сделать. Так сказать первый шаг к автоматике в дистилляции.
Mnz Магистр Город 254 86
Отв.794  19 Июля 18, 23:21, через 53 мин
1. ТЭН 4.5 кВт2. Примитивный блок управления на симисторе BTA10dev11bk, 19 Июля 18, 22:28
Этот симистор потянет максимум 2.5 кВт (если китайский, смело делите на 2 или даже 4). От 4.5 киловатного ТЕНа у симистора случится неожиданный визит пушистого зверька (придет писец) и "симистор на радостях" пустит белый дым (а если "повезет" так же и искры с огнем со всеми последствиями)!
Берите BTA40.
killboss Студент Пермский край 33 6
Отв.795  20 Июля 18, 11:56
У меня mac15mg, на тэн 3,15 квт. Пока полет нормальный
sebra Куратор Республика Коми 147 85
Отв.796  20 Июля 18, 13:05
Какую схему выбрать из предоставленных в первом посте? Наиболее простую что-ли.dev11bk, 19 Июля 18, 22:28

РЕГУЛЯТОР ТОКА НА ACS712

тут есть мысль подключить на аналоговый вход ардуины 10К потенциометрdev11bk, 19 Июля 18, 22:28

Только надо подключить энкодер вместо потенциометра, если в программировании разбираетесь то проблем не возникнет.

Про симистор уже сказали, не стоит экономить на безопасности, берите с запасом. А то как известно кроилово ведет к попадалову)
dev11bk Студент Салават 20 31
Отв.797  20 Июля 18, 22:36
Спасибо за советы всем!
Почему не хочу регулятор тока: шумный датчик и ввод дополнительных констант (сопротивление тэна)
Нужно максимально простое и универсальное устройство. Всё, чего мне сейчас не хватает от моей балалайки - это стабилизации.
Пока идея такая:
Собрать регулятор напряжения, только задавать напругу не через сериал порт, а потенциометром. Для энкодера нужна будет визуализация, а тут минимум и максимум очевиден. Измерительный экранчик оставлю на входе, соберу по схеме регулятор, подстрою показания и замер регулятором через сериал порт. Заказал BTA40-700. По остальным компонентам вроде всё понятно. Остается вопрос с трансформатором. Я так понимаю подойдет любой транс на 12 В из старой зарядки для мобильника?
С ардуинки визуализации никакой не будет. На выходе должно получиться универсальное устройство с замером параметров питания и регулировкой напряжения потенциометром и стабилизацией напряжения. Я правильно рассуждаю?

Добавлено через 3мин.:

РЕГУЛЯТОР ТОКА НА ACS712sebra, 20 Июля 18, 13:05
Есть какие-нибудь плюсы перед регулятором напряжения?
По идее можно и его воткнуть плюс энкодер. На старте задавать минимальное напряжение, при регулировке тока смотреть показания на том же входном измерительном экране
AleksVM Новичок Москва 6
Отв.798  28 Июля 18, 14:34
Собрал я регулятор напряжения на acs712 , все работает отлично , использовал скетч  Chatterbox. Провел несколько дистиляций , решил добавить в схему термометр на ds18b20 . Переписал скетч , но тут ждала меня неудача , регулятор перестал работать . Стал выяснять в чем может быть дело, посмотрев библиотеку oneware а там сплошные запреты прерывания и delay , которые мешают работы открытию bta. Вопрос есть ли у кого наработки по внедрению в регулятор опроса ds18b20 ?

Добавлено через 3мин.:


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <EEPROM.h>



//адреса датчиков температуры
//byte Thermometer2[8] = {0x28, 0xFF, 0x0B, 0x88, 0x86, 0x16, 0x05, 0x37}; //температура куба
//byte Thermometer1[8] = {0x28, 0xFF, 0x27, 0xC6, 0x61, 0x16, 0x04, 0xF8}; //температура колонны

//Конфигурация пинов
//#define PIN_A 2                                          //Пин А энкодера
//#define PIN_SW 3                                        //Пин кнопки
//#define PIN_B 4                                          //Пин B энкодера
#define PIN_DS_KUB 5                                    // Пин датчика температуры куба
#define PIN_DS_DIS 10                                    // Пин датчика температуры дистиллятора
#define SW 7                                            // энкодер SW кнопка
#define CLK 8                                            // энкодер CLC
#define DT 9                                            // энкодер DT
#define detect 3                                        // детектор нуля
#define triac 5                                          // тиристор

#define PARAMS1_NUMBER 8                                //Количество параметров подменю 1

LiquidCrystal_I2C lcd(0x27, 16, 2);
OneWire ds_kub(PIN_DS_KUB);                              //Датчик температуры куба
OneWire ds_dis(PIN_DS_DIS);                              //Датчик температуры дистиллятора

double r_ten = 25.6; //сопротивление ТЭНа 2кВт
double ACS_coeff = 0.073242188; // Коэффициент датчика ACS712 |5А - 0.024414063 | 20А - 0.048828125 | 30A - 0.073242188 |

double t_kub,t_dis;                                                        //Переменные температуры полученные с датчиков
byte error_t_kub,error_t_dis=0;                                            //Счетчики ошибок считывания температур
unsigned long temp_refresh;                                                //Таймер для обновления температур

//Остальные параметры
char V[]="V1.0.1";             
//Массив значений параметров 1(целочисленные)
byte param1[PARAMS1_NUMBER]={0,0,0,0,20,1,5,10};                          //0,Emkost,Water,Stop,Kstop,t_sirena ,time_refresh,refresh_bluetooth,time_sirena       

//------------------------------------
double max_I = 10; //максимальный ток А
double step_I = 0.01; //шаг установки тока А
//------------------------------------

String Var;
String T1, T2;

volatile unsigned long Iism = 0; //мгновенные значения тока
volatile int cntr = 0; // счетчик в обработчике прерывания
volatile unsigned long Isumm = 0; // переменная для хранения суммы квадратов

double real_I = 0; //переменная расчета RMS тока
double real_W = 0; //рассчитанная мощность
double sqrtUsum = 0; //переменная расчете квадратного корня
double ust_I = 0;//установленный ток
unsigned long previousMillis = 0;
unsigned long previousMillis_info = 0;
unsigned long displayMillis = 0;
unsigned long reg_time = 0;

int angle_I = 2250;
int angle_I_ocr = 2250;
int t = 0;
int zero = 0;
int I_offset = 0;

int indicator_I;
unsigned long showTime = 0; //время обновления экрана
double buffer_ust_I = 0;
unsigned long encoderMillis = 0;
int encoder_CLK = 0;
int encoder_DT = 0;
int encoder_CLK_prev = 0;
byte set_menu_I = false;
int SW_time_press = 0;
int time_press_SW = 0;
int SW_press_time = 0;

void setup(void) {

  Serial.begin(9600);//активируем прием сообщения

  pinMode(detect, INPUT);    //детектор нуля
  pinMode(triac, OUTPUT);      //тиристор

  pinMode(CLK, INPUT);    //Выходы энкодера
  pinMode(DT, INPUT);
  pinMode(SW, INPUT);

  digitalWrite(SW, HIGH); //включаем подтягивающий резистор

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Distiller ");
  lcd.print(V);
  delay(3000);
// tone(PIN_SIRENA, 700, 700);
// delay(100);
// noTone(PIN_SIRENA);
  lcd.clear();
  //При удержании кнопки при запуске параметры скидываются на заводские
  if(digitalRead(SW)==LOW)
  {
  //  eeprom_write();
    lcd.setCursor(0, 0);
    lcd.print("Reset settings");
    delay(3000);
    lcd.clear();
  // button_pressed = 0;
  }

// start(ds_kub);
//  start(ds_dis);
  //===========================================================Настройка АЦП

  ADMUX = (0 << REFS1) | (1 << REFS0) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0); //

  /*    Биты 7:6 – REFS1:REFS0. Биты выбора опорного напряжения. Если мы будем менять эти биты во время преобразования,
        то изменения вступят в силу только после текущего преобразования. В качестве опорного напряжения может быть выбран AVcc
        (ток источника питания), AREF или внутренний 2.56В источник опорного напряжения.
        Рассмотрим какие же значения можно записать в эти биты:
        REFS1:REFS0
        00    AREF
        01    AVcc, с внешним конденсатором на AREF
        10    Резерв
        11    Внутренний 2.56В  источник, с внешним конденсатором на AREF
        Бит 5 – ADLAR. Определяет как результат преобразования запишется в регистры ADCL и ADCH.
        ADLAR = 0
        Биты 3:0 – MUX3:MUX0 – Биты выбора аналогового канала.
        MUX3:0
        0000      ADC0
        0001      ADC1
        0010      ADC2
        0011      ADC3
        0100      ADC4
        0101      ADC5
        0110      ADC6
        0111      ADC7*/
  //=======================================================================================
  ADCSRA = B11101111; //Включение АЦП
  /*    Бит 7 – ADEN. Разрешение АЦП.
      0 – АЦП выключен
      1 – АЦП включен
      Бит 6 – ADSC. Запуск преобразования (в режиме однократного
      преобразования)
      0 – преобразование завершено
      1 – начать преобразование
      Бит 5 – ADFR. Выбор режима работы АЦП
      0 – режим однократного преобразования
      1 – режим непрерывного преобразования
      Бит 4 – ADIF. Флаг прерывания от АЦП. Бит устанавливается, когда преобразование закончено.
      Бит 3 – ADIE. Разрешение прерывания от АЦП
      0 – прерывание запрещено
      1 – прерывание разрешено
      Прерывание от АЦП генерируется (если разрешено) по завершении преобразования.
      Биты 2:1 – ADPS2:ADPS0. Тактовая частота АЦП
      ADPS2:ADPS0
      000        СК/2
      001        СК/2
      010        СК/4
      011        СК/8
      100        СК/16
      101        СК/32
      110        СК/64
      111        СК/128*/

  //===========================================================
  ACSR = (1 << ACD);
  //------ Timer1 ---------- Таймер задержки времени открытия триака после детектирования нуля (0 триак не откроется)

  TCCR1A = 0x00;  //
  TCCR1B = 0x00;    //
  TCCR1B = (0 << CS12) | (1 << CS11) | (1 << CS10); // Тактирование от CLK.

  // Если нужен предделитель :
  // TCCR1B |= (1<<CS10);          // CLK/1 = 0,0000000625 * 1 = 0,0000000625, 0,01с / 0,0000000625 = 160000 отсчетов 1 полупериод
  // TCCR1B |= (1<<CS11);          // CLK/8 = 0,0000000625 * 8 = 0,0000005, 0,01с / 0,0000005 = 20000 отсчетов 1 полупериод
  // TCCR1B |= (1<<CS10)|(1<<CS11); // CLK/64 = 0,0000000625 * 64 = 0,000004, 0,01с / 0,000004 = 2500 отсчетов 1 полупериод
  // TCCR1B |= (1<<CS12);          // CLK/256  = 0,0000000625 * 256 = 0,000016, 0,01с / 0,000016 = 625 отсчетов 1 полупериод
  // TCCR1B |= (1<<CS10)|(1<<CS12); // CLK/1024
  // Верхняя граница счета. Диапазон от 0 до 255.
  OCR1A = 0;          // Верхняя граница счета. Диапазон от 0 до 65535.

  // Частота прерываний будет = Fclk/(N*(1+OCR1A))
  // где N - коэф. предделителя (1, 8, 64, 256 или 1024)

  TIMSK1 |= (1 << OCIE1A) | (1 << TOIE1); // Разрешить прерывание по совпадению и переполнению

  attachInterrupt(1, zero_crosss_int, RISING);//вызов прерывания при детектировании нуля

}
//======================================================== Прерывание по нулю
void zero_crosss_int() {

  TCNT1 = 0;
  OCR1A = angle_I_ocr;
  zero++;
}

//======================================================== Обработка таймера по совпадению нуля
ISR (TIMER1_COMPA_vect)
{
  PORTD |=  (1 << PORTD5);
  TCNT1 = 65535 - 200;  //Импульс включения симистора 65536 -  1 - 4 мкс, 2 - 8 мкс, 3 - 12 мкс и тд
}

ISR (TIMER1_OVF_vect) { //timer1 overflow
  PORTD &=  ~(1 << PORTD5);
  TCNT1 = OCR1A + 1;
}
//======================================================== Обработка прерывания АЦП для расчета среднеквадратичного тока
ISR(ADC_vect)
{
  byte An_pin = ADCL;
  byte An = ADCH;
  Iism = ((An << Крутой + An_pin) - 512;
  Iism *= Iism;// возводим значение в квадрат
  Isumm += Iism; // складываем квадраты измерений
  cntr++;
}

void parseParams(String inputString) { //Функция разбора принятой в Serial port строки
  String bb = inputString;
  if (bb.substring(0, 2) == "TW") {
    T1 = bb.substring(bb.indexOf("TW", 2) + 3); //команда
    ust_I = T1.toFloat(); //Выставленный ток с Serial порта
    buffer_ust_I = ust_I;
  }
}

void loop(void) {

  temperatura();
 
  //==================================================================================

  while (Serial.available()) { //Serial port, пока не конец сообщения, читаем данные и формируем строку
    char ch = Serial.read();
    Var += ch;
    if (ch == '\n') {
      parseParams(Var); //вызываем функцию разбора принятой строки
      Var = "";
    }

  }

  if (zero >= 6) {//расчет среднеквадратичного//zero - количество полупериодов дря рассчета среднеквадратичного
    sqrtUsum = Isumm / cntr; //
    real_I = sqrt(sqrtUsum) * ACS_coeff; //
    cntr = 0;
    Isumm = 0;// обнуляем суммы напряжений
    zero = 0;
    real_W = (real_I * real_I * r_ten);
  }

  //===================================================================Меню установки тока
  if (digitalRead(SW) == LOW) { //считаем сколько времени нажата 1 кнопка
    if (millis() - SW_time_press > 1) {
      SW_press_time++;
      SW_time_press = millis();
    }
  }

  if (digitalRead(SW) == HIGH) {//очищаем счетчик если кнопка 1 отпущена
    SW_press_time = 0;
  }

  if ( SW_press_time >= 100) { //если более хх мс то кнопка 1 нажата - режим установки тока
    SW_press_time = 0;
    if (!set_menu_I) {//и не режим установки
      set_menu_I = true;
    }
    else {
      set_menu_I = false;
    }
  }

  //=========================================================================Энкодер
  if (set_menu_I) {
    if (millis() >= (encoderMillis + 5)) { // проверяем каждые 5мс (200 Гц)
      encoder_CLK = digitalRead(CLK);    // считываем состояние выхода А энкодера
      encoder_DT = digitalRead(DT);    // считываем состояние выхода B энкодера
      if ((!encoder_CLK) && (encoder_CLK_prev)) {  // если состояние изменилось с положительного к нулю
        if (encoder_DT) {
          // выход DT в полож. сост., значит вращение по часовой стрелке
          // увеличиваем
          if (buffer_ust_I <= max_I - step_I) buffer_ust_I = buffer_ust_I + step_I;
        }
        else {
          // выход DT в 0 сост., значит вращение против часовой стрелки
          // уменьшаем
          if (buffer_ust_I >= 0 + step_I) buffer_ust_I = buffer_ust_I - step_I;
        }

      }
      encoder_CLK_prev = encoder_CLK;    // сохраняем значение А для следующего цикла

      encoderMillis = millis();
    }
  }

  //==============================================Регулятор тока

  if (millis() - previousMillis >= 15) { //Если регулировка долгая то уменьшите значение, если видно частые изменения регулировки то увеличте значение
    previousMillis = millis();

    if (real_I > ust_I + 0.05) {
      angle_I++;
    }
    if (real_I < ust_I - 0.05) {
      angle_I--;
    }
    if (real_I < ust_I + 0.05 && real_I > ust_I - 0.05) {
      angle_I = angle_I;
    }

    if (angle_I > 2250) {
      angle_I = 2250;
    }
    if (angle_I <= 1) {
      angle_I = 1;
    }
  }

//---------------------------------------------------------------

  if (ust_I < 0 || buffer_ust_I < 0) { //Если меньше 0, то 0
    ust_I = 0;
    buffer_ust_I = 0;
  }

  ust_I = (buffer_ust_I > 0) ? buffer_ust_I : 0;

  if (ust_I == 0) {
    TIMSK1 = 0x00;
    PORTD &=  ~(1 << PORTD5);
  }

  else
  {
    TIMSK1 |= (1 << OCIE1A) | (1 << TOIE1);
  }

  //------------------------------------

  angle_I_ocr = angle_I;


  //=========================Дисплей

  if (millis() - displayMillis >= 300) {
    displayMillis = millis();

    lcd.setCursor(0, 0);
    lcd.print("TOK:");
    lcd.print(real_I);
    lcd.print(" ");
    //lcd.print(int(real_W));
    //lcd.print("W");
    lcd.print("D ");
    lcd.print(t_dis,1);
   
    lcd.setCursor(0, 1);
    lcd.print("UST:");
    lcd.print(ust_I);

    if (set_menu_I) {
      lcd.print("--->");
      lcd.print(buffer_ust_I);
    }

  }

  //=========================Информация в порт раз в секунду

  if (millis() - previousMillis_info >= 1000) {
    previousMillis_info = millis();

    Serial.print("realI "); //Измеренный среднеквадратичный ток
    Serial.println(real_I);

    Serial.print("ustI  "); //Установленный выходной ток
    Serial.println(ust_I);

    Serial.print("angle  "); //Установленный выходной ток
    Serial.println(angle_I);

    Serial.println("-----------------");
  }
  //========================================================

}

//-----------------------------------------------Считывание температуры------------------------------------------------------//
//Команда на чтение температуры из памяти датчика
double get_temperature(OneWire ds)
{
  byte data[9];
  ds.reset();
  //Запрос температуры из памяти прибора
  ds.write(0xCC);
  ds.write(0xBE);
  ds.read_bytes(data,9);
  if(ds.crc8(data,8)!=data[8]||(data[5]!= 0xFF)) 
  {
    return 404;
  }
  double t = (data[1]<< Крутой+data[0];
  t = t*0.0625;
  return t;
}

//Команда на получение температуры с датчика и конвертации
void start(OneWire ds)
{
  ds.reset();
  //Запуск чтения и конвертации температуры
  ds.write(0xCC);
  ds.write(0x44);
}

//Получение и обработка температуры
void temperatura()
  {
  //Замер температуры раз в минуту
  if((millis()-temp_refresh)>param1[5]*1000)
  {
//    pressure();
    double tmp;
    //Запрашиваем температуру куба
    tmp = get_temperature(ds_kub);
    start(ds_kub);
    if(tmp < 110)
    {
    //  t_kub = tmp+(760-Davlenie)*0.035;  //Измеренная температура куба с поправкой на давление
      t_kub = tmp; 
      error_t_kub = 0;
    // sirena_stop();
    }
    else
    {
      if(error_t_kub < 3)
      {
        error_t_kub++;
      }
      }
  //Запрашиваем температуру дистиллятора
  tmp = get_temperature(ds_dis);
  start(ds_dis);
  if(tmp < 110)
    {
        t_dis = tmp;                                      //Измеренная температура пара с поправкой на давление
//  t_dis = tmp+(760-Davlenie)*0.035;                                      //Измеренная температура пара с поправкой на давление
  //  t_dis = t_dis+correct_temp();
      error_t_dis = 0;
    //  sirena_stop();
    }
    else
    {
      if(error_t_dis < 3)
      {
        error_t_dis++;
      }
      }

}
}
IMG_20180728_135805.jpg
IMG_20180728_135805.jpg Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
Chatterbox Специалист Калуга 123 60
Отв.799  28 Июля 18, 15:28, через 55 мин
Вопрос есть ли у кого наработки по внедрению в регулятор опроса ds18b20 ?AleksVM, 28 Июля 18, 14:34
Разочарую. С этой библиотекой даже не пытайся скрестить регулятор работающий на прерывании. В принципе если пренебречь некоторыми циклами регулировки, то двтчик можно пристроить. Но я даже не стал пытаться. Дешевле сделать термометр на отдельном контроллере. И связать их между собой. Важна конечная задача.