требуется перенести значение переменной в следующий цикл loop

lopezmil
Offline
Зарегистрирован: 17.02.2015

Здравствуйте. Подскажите где и как мне объявить переменную P из формулы y = y + P; так, чтобы она была предыдущим значением переменной temp, т.е. значением из прошлого цикла loop'а 

#include <OneWire.h>
OneWire ds(10);

  void setup() {  
  Serial.begin(9600);
  }

  void loop()  {
   
  //инициализация уставки температуры:
  float ust = analogRead(0);
  ust = map(ust, 0, 1023, 0, 40);
  
  Serial.print("ust");
  Serial.println(ust);  
   
  // инициализация датчика температуры:
  byte data[2];
  ds.reset(); 
  ds.write(0xCC);
  ds.write(0x44);
  delay(750);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read(); 
  data[1] = ds.read();
  int Temp = (data[1]<< 8)+data[0];
  Temp = Temp>>4;
  float temp= Temp;  
  Serial.print("temp=");
  Serial.println(temp);

  // расчет выходной мощности:  
  float a= ust/temp;  
 
  float b = a*100;
 
  float y = b-100;
  y = y + P;
 
  Serial.print("nagrev ");
  Serial.print(y);
  Serial.println("% ");
  Serial.println(" ");  
  
  delay(2000);
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

строка 41  P=temp; при первом проходе будет ложь. Объявить глобальной переменной в 3 строке float P; Вроде так.

lopezmil
Offline
Зарегистрирован: 17.02.2015

Ошибочка вышла ... требуется объявить переменную P из формулы y = y + P; так, чтобы она была предыдущим значением переменной a, т.е. значением из прошлого цикла loop'а 

lopezmil
Offline
Зарегистрирован: 17.02.2015

Не помогло или я что-то не так сделал? По идее в каждом новом цикле должно быть приращение  переменной на величину переменной P из прошлого цикла.

#include <OneWire.h>
OneWire ds(10);
float P;

  void setup() {  
  Serial.begin(9600);
  }

  void loop()  {
   
  //инициализация уставки температуры:
  float ust = analogRead(0);
  ust = map(ust, 0, 1023, 0, 40);
  
  Serial.print("ust");
  Serial.println(ust);  
   
  // инициализация датчика температуры:
  byte data[2];
  ds.reset(); 
  ds.write(0xCC);
  ds.write(0x44);
  delay(750);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read(); 
  data[1] = ds.read();
  int Temp = (data[1]<< 8)+data[0];
  Temp = Temp>>4;
  float temp= Temp;  
  Serial.print("temp=");
  Serial.println(temp);

  // расчет выходной мощности:  
  float a= ust/temp;  
 
  float b = a*100;
 
  float y = b-100;
  y = y + P;
  P=a;
  Serial.print("P=");
  Serial.println(P);
  
  Serial.print("nagrev ");
  Serial.print(y);
  Serial.println("% ");
  Serial.println(" ");  
  
  delay(2000);
}

 

X-Dron
Offline
Зарегистрирован: 24.01.2015

lopezmil, при первом проходе неинициализированная переменная P, в которой может быть всякий мусор закинет Y неизвестно куда.

Поэтому лучше так:

#include <OneWire.h>
OneWire ds(10);
float P;
boolean First_Run;
 
void setup() { 
  Serial.begin(9600);
  First_Run = true;
}
 
void loop()  {
  
  //инициализация уставки температуры:
  float ust = analogRead(0);
  ust = map(ust, 0, 1023, 0, 40);
   
  Serial.print("ust");
  Serial.println(ust); 
	    
  // инициализация датчика температуры:
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(750);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1]<< 8)+data[0];
  Temp = Temp>>4;
  float temp= Temp; 
  Serial.print("temp=");
  Serial.println(temp);
 
  // расчет выходной мощности: 
  float a= ust/temp; 
  
  float b = a*100;
  
  float y = b-100;
  if (First_Run) P=a;
  y = y + P;
  P=a;
  Serial.print("P=");
  Serial.println(P);
   
  Serial.print("nagrev ");
  Serial.print(y);
  Serial.println("% ");
  Serial.println(" "); 
  
  First_Run = false;
   
  delay(2000);
}
lopezmil
Offline
Зарегистрирован: 17.02.2015

Спасибо за отклик, это интересно, а можно объяснить эти строки, что это такое или ссылку на описание?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012
// расчет выходной мощности: 
float a= ust/temp;
float b = a*100;
float y = b-100;
if (First_Run) P=a;
y = y + P;
P=a;

Один вопрос. Это у Вас пропорциональный регулятор?

Расчет мощьности интересный.

Надо просто поменять строки y=y+P и P=a местами!

Я думаю что Вам нужно ввести зону регулирования, вне которой мощность будет или 0% или 100%

например у Вас при temp==0 получаеться деление на 0, а при temp>ust отрицательное значение мощности.

Надо ограничить y

// расчет выходной мощности:
if (ust>temp){
  float a= ust/temp;
  float b = a*100;
  float y = b-100;
  P=a;//если P сюда поставить всё нормально будет
  y = y + P;
  if (y>100){
    y=100;
  }
}
if (ust<temp){
  y=0;
}

 

lopezmil
Offline
Зарегистрирован: 17.02.2015

Да, это регулятор, но не просто пропорциональный. Должен получиться регулятор с затухающими колебаниями при выходе на уставку регулирования, чего нет у пропорционального регулятора. Я бы назвал его пропорциональный регулятор с аналогом интегральной состовляющей.

Отдельные спасибо за :

Надо просто поменять строки y=y+P и P=a местами! Очень помогло.

 И за :

Надо ограничить y

01 // расчет выходной мощности:
02 if (ust>temp){
03   float a= ust/temp;
04   float b = a*100;
05   float y = b-100;
06   P=a;//если P сюда поставить всё нормально будет
07   y = y + P;
08   if (y>100){
09     y=100;
10   }
11 }
12 if (ust<temp){
13   y=0;
14 }

 Это должно было быть следующим шагом в написании этого кода и, скорее всего вопросом. А вы опередили вопрос ответом. Я приятно удивлён. У меня есть некоторые идеи, но реализовать их самостоятельно пока не могу. Плохо знаком с текстовыми языками программирования. Поэтому и задаю вопросы.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Опробовал Вашу формулу в железе, если интересны результаты выложу код, видео работы и схему. Управлял нагрузкой через симстор по алгоритму Брезенхема, в качестве нагревателя была лампочка, а в качестве датчика температуры диод. (известно што за 1 сек в сети 100 полупериодов-100% мощности, если в 1 сек. пропустить 10 полупериодов, то 10% мощности, а если их распределить на 1 сек. то получиться равномерное распределение расчетной мощности в течении 1 сек.)

lopezmil
Offline
Зарегистрирован: 17.02.2015

Если не затруднит, я бы изучил ваш материал.

Я не совсем понял  "если в 1 сек. пропустить 10 полупериодов, то 10% мощности, а если их распределить на 1 сек. то получиться равномерное распределение расчетной мощности в течении 1 сек" ?

А у меня этот код не работает, потому что в нём нужно ещё сравнивать предыдущее и нынешнее значения измеренной температуры и на основании этого выбирать сложение или вычитание коэффицента Р. Можно это делать тем же оператором for.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Про равномерное распределение мощьности я писал тут там и алгоритм лежит.

Вот мой код

int reg,er;
boolean out=0;
double temp=0;//текущая температура
float ust=21.97;//уставка
int ten=13;//выход на нагреватель
unsigned long PIDMillis;//сброс таймера
unsigned long tempMillis;//сброс таймера для замера темп
double pre_temp=0;
float P=0;
float a=0;
float b=0;
float c=0;
float d=0;
float zad=0;
void setup(){
  pinMode(ten,OUTPUT);
  Serial.begin(9600);
  attachInterrupt(0, zero_crosss_int, RISING);//внешнее прерывание ZC
}
void loop(){
  unsigned long currentMillis = millis();
  //каждую секунду мерим температуру
  if (currentMillis-tempMillis>=1000){

    temp= get_temp();

    tempMillis=currentMillis;
    ust= analogRead(1);
    ust = map(ust,0,1023,20,70);

  }
  //каждую секунду расчитываем Мощность
  if (currentMillis-PIDMillis>=1000){
    Power();
    Serial.print(ust);
    Serial.print("-");
    Serial.print(temp);
    Serial.print("-");
    Serial.print(zad);
    Serial.print("-");
    Serial.println(P);
    PIDMillis=currentMillis;
  }


}
//регулятор
void Power(){
  // расчет выходной мощности:
  c=ust-temp;
  d=ust/temp;
  if (ust>temp){
    a= ust/temp;
    b = a*100;
    zad = b-100;
    P=c*c;
    zad = zad + P;
    if (zad>100){
      zad=100;
      //P=0;
    }
  }
  if (ust<temp){
    zad=0;
    //P=0;
  }
}

//Замер температуры
float get_temp(){
  unsigned int DAC=0;
  unsigned int ar=0;
  for (int s=0; s<=16;s++){//оверсемплинг до 12 бит
    ar=analogRead(0);
    DAC=DAC+ar;
  }
  temp=DAC/4;
  DAC=0;
  temp = temp*0.44-1737.56;//расчет температуры от АЦП
  temp=(pre_temp*3+temp)/4;//фильтр НЧ
  pre_temp=temp;
  return temp;
}

//Внешнее прерывание детектора нуля
void zero_crosss_int()
{
  ResOut();//Вызов функции управления симистором
}

//управление симистором по алгоритму Брезенхема
void ResOut(){
  //delayMicroseconds(1230);//для попадания в ноль
  reg = zad + er;
  if (reg < 50){
    out=0;
    er = reg ; 
  }
  else {
    out=1;
    er=reg-100;
  }
  digitalWrite(ten,out);
}

В расчете мощности много мусора, пытаюсь откорректировать Вашу формулу, а то на уставку не выходит.

Вы там что то писали по поводу сравнивания предыдущей и текущей температуры, можно по подробней?

А я пока Видео сниму и лог.

lopezmil
Offline
Зарегистрирован: 17.02.2015

Как сюда можно вставить видео? Долго описывать всё, легче показать на конкретном примере. Только что придумал интересную штуку. Temp необходимо сделать глобальной переменной и сранивать temp и Temp, если Temp>temp, то P имеет положительный знак, а если Temp<temp, то Р отрицательна. Без этого ( есть ещё один вариант добиться того же результата, но он более объёмный, больше действий) величина Р растёт пока не достигнет уставки и может по достижении уставки дойти до 100%. 

 Идея с обрезанием части мощности мне понравилась. Но возможна ли она? Если я правильно понял, то вместо 50 Гц в секунду, т.е. 50 "пучков тока" мы пропускаем только 10, к примеру. Срезая положительные или отрицательные полупериоды? Чем это можно осуществить? Очень похоже начастотный преобразователь. Правда я не вдавался в прнцип его дествия.

lopezmil
Offline
Зарегистрирован: 17.02.2015

Завтра днём попробую подкорректировать ваш расчет мощности, там действиетльно кое-что лишнее и непонятное. Я и сам путаюсь, кода занимаюсь всей этой писаниной.

Можно ли ваш код залить в ардуино и какой датчик мне для этого понадобяться?

lopezmil
Offline
Зарегистрирован: 17.02.2015

Завтра днём попробую подкорректировать ваш расчет мощности, там действиетльно кое-что лишнее и непонятное. Я и сам путаюсь, кода занимаюсь всей этой писаниной.

Можно ли ваш код залить в ардуино и какой датчик мне для этого понадобяться?

bwn
Offline
Зарегистрирован: 25.08.2014

lopezmil пишет:

 Идея с обрезанием части мощности мне понравилась. Но возможна ли она? Если я правильно понял, то вместо 50 Гц в секунду, т.е. 50 "пучков тока" мы пропускаем только 10, к примеру. Срезая положительные или отрицательные полупериоды? Чем это можно осуществить? Очень похоже начастотный преобразователь. Правда я не вдавался в прнцип его дествия.

Типо так .

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Почти так, только полуволны не обрезаются, а пропускаються полностью. Если надо 50% мощности то через одну. За началом полуволны следит детектор нуля сети, а пропускать или нет полуволну вычисляет алгоритм Брезенхема в зависимости от расчетной мощности.
Такой подход уменьшает комутационные помехи в сети и облегчает жизнь семистору, но лампочка при таком регулировании будет заметно мерцать.

lopezmil
Offline
Зарегистрирован: 17.02.2015

А какой датчик температуры использовали? И я не понял как и чем тут температура замеряется?

//Замер температуры
float get_temp(){
  unsigned int DAC=0;
  unsigned int ar=0;
  for (int s=0; s<=16;s++){//оверсемплинг до 12 бит
    ar=analogRead(0);
    DAC=DAC+ar;
  }
  temp=DAC/4;
  DAC=0;
  temp = temp*0.44-1737.56;//расчет температуры от АЦП
  temp=(pre_temp*3+temp)/4;//фильтр НЧ
  pre_temp=temp;
  return temp;

}

 

 

 

 

lopezmil
Offline
Зарегистрирован: 17.02.2015

Этот язык программирования я очень слабо знаю, поэтому достаточно трудно сразу всё понять. Но в расчёте выходной мощности есть вопросы



//регулятор
void Power(){
  // расчет выходной мощности:
  c=ust-temp;
  d=ust/temp;
  if (ust>temp){
    a= ust/temp;
    b = a*100;
    zad = b-100;
    P=c*c;
    zad = zad + P;
    if (zad>100){
      zad=100;
      //P=0;
    }
  }
  if (ust<temp){
    zad=0;
    //P=0;
  }

Здесь расчёт должен быть примерно таким:

a=ust/temp

b=a*100

y=b-100

y=y+P

P=a - идет в следующий цикл, т.е. в Р - величина а из предыдущего цикла.

lopezmil
Offline
Зарегистрирован: 17.02.2015

Ещё одно дополнение 

17
  if (ust<temp){
18
   y=y-P;

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Вообщем у меня заработало вот с таким расчетом. Но это получился ПИ регулятор

void Power(){
  // расчет выходной мощности: 
 p=(ust-temp);//пропорциональная составляющая
 if  (temp>ust-5 && temp<ust+2){//в этих пределах рассчитываться И составляющая
 i=(i+p); //интегральная составляющая
 }
 else
 {
   i=i;
 }
 zad=(int)((p*25)+(i/2));//25 и 2 экспериментально подобранные коэффициенты
 if (zad<0){
   zad=0;
 }
  if (zad>100){
   zad=100;
 }

Работает отлично, температуру держит, внешним возмущениям сопротивляеться.

Вот лог уже на уставке. Первая цифра уставка, вторая текущая температура, третья выходная мощность.

35.00-35.09-20.00%
35.00-35.11-19.00%
35.00-35.13-19.00%
35.00-35.06-18.00%
35.00-35.08-20.00%
35.00-35.02-19.00%
35.00-34.97-21.00%
35.00-35.01-22.00%
35.00-34.96-21.00%
35.00-35.01-22.00%
35.00-34.96-21.00%
35.00-35.01-22.00%
35.00-34.96-21.00%
35.00-34.92-22.00%
35.00-34.89-23.00%
35.00-34.95-24.00%
35.00-34.91-23.00%

Лог выхода на уставку

36.00-35.98-20.00%-
36.00-36.09-22.00%-
36.00-36.18-20.00%-
36.00-36.24-17.00%-
36.00-36.21-16.00%-
36.00-36.19-16.00%-
36.00-36.08-17.00%-
36.00-36.08-20.00%-
36.00-36.08-20.00%-
36.00-36.08-20.00%-
36.00-35.99-19.00%-
36.00-35.92-22.00%-
36.00-35.86-23.00%-
36.00-35.91-25.00%-
36.00-35.85-24.00%-
36.00-35.81-25.00%-
36.00-35.86-26.00%-
36.00-35.82-25.00%-
36.00-35.87-26.00%-
36.00-35.91-25.00%-
36.00-35.95-24.00%-
36.00-35.97-23.00%-
36.00-36.08-23.00%-
37.00-36.17-45.00%-
38.00-36.15-69.00%-
39.00-36.23-96.00%-
39.00-36.37-96.00%-
39.00-36.58-93.00%-
39.00-36.74-89.00%-
39.00-36.87-86.00%-
39.00-37.16-84.00%-
39.00-37.38-78.00%-
39.00-37.65-73.00%-
39.00-37.86-67.00%-
39.00-38.03-62.00%-
39.00-38.17-59.00%-
39.00-38.28-56.00%-
39.00-38.37-53.00%-
39.00-38.44-51.00%-
39.00-38.58-50.00%-
39.00-38.70-46.00%-
39.00-38.79-44.00%-
39.00-38.86-41.00%-
39.00-39.01-40.00%-
39.00-39.04-36.00%-
39.00-39.07-35.00%-
39.00-39.08-35.00%-
39.00-39.10-34.00%-
39.00-39.20-34.00%-
39.00-39.28-31.00%-
39.00-39.26-29.00%-
39.00-39.24-29.00%-
39.00-39.22-30.00%-
39.00-39.21-30.00%-
39.00-39.11-30.00%-
39.00-39.03-33.00%-
39.00-38.97-35.00%-
39.00-39.01-36.00%-
39.00-39.04-35.00%-
39.00-38.97-34.00%-
39.00-39.01-36.00%-
39.00-39.04-35.00%-
39.00-38.98-34.00%-
39.00-39.01-36.00%-
39.00-39.04-35.00%-
39.00-39.07-34.00%-
39.00-39.09-34.00%-
39.00-39.10-33.00%-
39.00-39.11-33.00%-
39.00-39.03-32.00%-
39.00-38.97-34.00%-
39.00-38.92-36.00%-
39.00-38.88-37.00%-
39.00-38.85-38.00%-
39.00-38.82-39.00%-
39.00-38.80-40.00%-
39.00-38.79-40.00%-
39.00-38.77-41.00%-
39.00-38.76-41.00%-
39.00-38.84-42.00%-
39.00-38.91-40.00%-
39.00-38.87-38.00%-
39.00-38.84-39.00%-
39.00-38.81-40.00%-
39.00-38.80-41.00%-
39.00-38.78-41.00%-
39.00-38.77-42.00%-
39.00-38.85-42.00%-
39.00-38.82-40.00%-
39.00-38.89-41.00%-
39.00-38.94-40.00%-
39.00-38.90-38.00%-
39.00-38.86-39.00%-
39.00-38.83-40.00%-
39.00-38.81-41.00%-
39.00-38.79-42.00%-
39.00-38.87-42.00%-
39.00-38.93-41.00%-
39.00-38.88-39.00%-
39.00-38.94-40.00%-
39.00-38.90-39.00%-
39.00-38.95-40.00%-
39.00-38.99-39.00%-
39.00-39.02-38.00%-
39.00-39.05-37.00%-
39.00-39.07-36.00%-
39.00-39.00-36.00%-
39.00-39.03-37.00%-
39.00-39.06-37.00%-
39.00-39.08-36.00%-
39.00-39.01-35.00%-
39.00-39.04-37.00%-
39.00-39.06-36.00%-

Датчик температуры у меня не самый точный (сделан повторюсь из двух диодов).

А так всё нормально работает

Видео работы по алгоритму брезенхема (чередованием полуволн пропорционально мощьности 0101010101010)

Видео работы 2 в этом видео отсчитывает полупериоды подряд, пропорционально мощьности 1111100000.

В 1 сек при частоте сети 50Гц проходит 100 полуволн (положительных и отрицательных) если пропустить только 50 то и получите 50% мощьности в секунду.

Будут вопросы обращайтесь.

Весь код (непричесанный)

int reg,er;
boolean out=0;
double temp=0;//текущая температура
float ust=21.97;//уставка
int ten=13;//выход на нагреватель
unsigned long PIDMillis;//сброс таймера
unsigned long tempMillis;//сброс таймера для замера темп
double pre_temp=0;
int a=0;
int b=0;
int P=0;
float p=0;
float i=0;
float d=0;
float kw=0;
float zad=0;
int zc=0;
void setup(){
  pinMode(ten,OUTPUT);
  Serial.begin(9600);
  attachInterrupt(0, zero_crosss_int, RISING);//внешнее прерывание ZC
}
void loop(){
  unsigned long currentMillis = millis();
  //каждую секунду мерим температуру
  if (currentMillis-tempMillis>=1000){

    temp= get_temp();
    Serial.print(ust);
    Serial.print(" ");
    Serial.print(temp);
    Serial.print(" ");
    Serial.print(zad);
    Serial.print("% ");
    kw=kw+(((float)zad*0.6)/3600);//суммарно потребленная мощьность 0,6 это лампочка 60Вт
    Serial.print(kw);
    Serial.print(" Sum_Wt ");
    Serial.println((float)zad*0.6);//Потребление Вт/ч
    tempMillis=currentMillis;
    ust= analogRead(1);
    ust = map(ust,0,1023,20,70);

  }
  //каждые 250мс расчитываем ПИД
  if (currentMillis-PIDMillis>=1000){
    Power();

    PIDMillis=currentMillis;
  }


}
//регулятор
void Power(){
  // расчет выходной мощности: 
  p=(ust-temp);
  d=(ust/temp);
  if  (temp>ust-5 && temp<ust+2){
    i=(i+p); 
  }
  else
  {
    i=i;
  }
  zad=(int)((p*25)+(i/2));
  if (zad<0){
    zad=0;
  }
  if (zad>100){
    zad=100;
  }



  /* if (ust<temp){
   zad=0;
   //P=0;
   }*/
}


//Замер температуры
float get_temp(){
  unsigned int DAC=0;
  unsigned int ar=0;
  for (int s=0; s<=16;s++){//оверсемплинг до 12 бит
    ar=analogRead(0);
    DAC=DAC+ar;
  }
  temp=DAC/4;
  DAC=0;
  temp = temp*0.44-1737.56;//расчет температуры от АЦП
  temp=(pre_temp*4+temp)/5;//фильтр НЧ
  pre_temp=temp;
  return temp;
}

//Внешнее прерывание детектора нуля
void zero_crosss_int()
{
  zc++;
  if(zc<zad){
    digitalWrite(ten,1);
  }
  if (zc>=zad){
    digitalWrite(ten,0);
  }
  if (zc>=100){
    zc=0;
  }
  //digitalWrite(ten,out);
  //ResOut();//Вызов функции управления симистором
}

//управление симистором по алгоритму Брезенхема
void ResOut(){
  //delayMicroseconds(1230);//для попадания в ноль
  reg = zad + er;
  if (reg < 50){
    out=0;
    er = reg ; 
  }
  else {
    out=1;
    er=reg-100;
  }
  //  digitalWrite(ten,out);
}



 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Про мой датчик температуры для lopezmil`а

На аналоговый вход посажен диод как тут видео.

Так как у диода линейная зависимость сопротивления от температуры, то я замерил показания АЦП при двух крайних температурах, затем вбил эти данные сюда и получил формулу для расчета температуры относительно показаний АЦП.

Но так как у меня на 1/1024 ацп приходилось более 1 градуса и показания сильно дергались мне пришлось искать способ программно расширить диапазон АЦП. Нашел выход в оверсемплинге теперь у меня шкала 1/4096 и показания как видите в моих логах уже не скачут, формулу конечно пересчитал опя по новым показаниям.

lopezmil
Offline
Зарегистрирован: 17.02.2015

Просмотрел лог выхода на уставку ... какие-то странные скачки выходной мощности. При такой близости к уставке выходная мощность варьируется в пределах ±1-5% , а с 24 строки начинаются чудеса )) с чего такой скачок?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

lopezmil пишет:
Просмотрел лог выхода на уставку ... какие-то странные скачки выходной мощности. При такой близости к уставке выходная мощность варьируется в пределах ±1-5% , а с 24 строки начинаются чудеса )) с чего такой скачок?

С двадцать четвертой строки я начал поднимать уставку.

В логах первый столбец УСТАВКА, второй ТЕКУЩАЯ ТЕМПЕРАТУРА, третий МОЩНОСТЬ.

Замер температуры, расчет мощности и вывод в терминал осуществляеться 1 раз в секунду.

Вот график по логу изменения уставки, на нем видно что на 24 секунде я меняю уставку с 36С на 39С.

График перехходного процесса ПИ регулятора

lopezmil
Offline
Зарегистрирован: 17.02.2015

Хорошо держит уставку. У вас всё правильно получилось. Некоторые моменты в программе мне остались непонятны, но это ввиду плохого знания самомго языка программирования. Но алгоритм вполне ясен. Поздравляю с успешным решением задачи!

 Предлагаю решить ещё одну задачу: измерять ток каждой фазы трёхфазного асинхронного двигателя, записывать показания, обрабатывать их и в соответствии с условиями включать/выключать двигатель и выдавать предупреждающие или аварийные сигналы.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

lopezmil пишет:

Хорошо держит уставку. У вас всё правильно получилось. Некоторые моменты в программе мне остались непонятны, но это ввиду плохого знания самомго языка программирования. Но алгоритм вполне ясен. Поздравляю с успешным решением задачи!

 Предлагаю решить ещё одну задачу: измерять ток каждой фазы трёхфазного асинхронного двигателя, записывать показания, обрабатывать их и в соответствии с условиями включать/выключать двигатель и выдавать предупреждающие или аварийные сигналы.

С этим и сами справитесь. Надо на каждую фазу поставить шунт или трансформатор тока, и считывать с него напряжение через диодный мост (напряжение будет пропорционально току), программно подогнать шкалу, а дальше делай с этими данными всё что угодно. Но для безопасности надо будет развязать шунт и диодный мост трансформатором.

Про шунты и развязку можно найти через ГУГЛ.

А в коде моего регулятора много мусора, когда будет время подчищу.

com
Offline
Зарегистрирован: 06.09.2013

yul-i-an пишет:

Датчик температуры у меня не самый точный (сделан повторюсь из двух диодов).

А так всё нормально работает

Видео работы по алгоритму брезенхема (чередованием полуволн пропорционально мощьности 0101010101010)

Видео работы 2 в этом видео отсчитывает полупериоды подряд, пропорционально мощьности 1111100000.

В 1 сек при частоте сети 50Гц проходит 100 полуволн (положительных и отрицательных) если пропустить только 50 то и получите 50% мощьности в секунду.

Будут вопросы обращайтесь.

 

с лампочками понятно, разница очень заметна. а вы не сравнивали стабильность при поддержании температуры на более инерционных системах? к примеру, плитки/тэны от 0.5 квт и выше? у меня сейчас мощность регулируется шимом 1/2 гц, к которому подключено твердотельное реле, полупериоды не отсчитываю, просто меняю duty 0..100. вроде все устраивает, колебания температуры в пределах 0.3 градуса, но шило перфекционизма в заднице не дает успокоиться.

b707
Offline
Зарегистрирован: 26.05.2017

com. вы уже не первый раз вытаскиваете из архива какое-то старье... вы бы хотя б на даты смотрели. Думаете, ваш комментарий через 3 года интересен автору? :)

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

com. вы уже не первый раз вытаскиваете из архива какое-то старье... вы бы хотя б на даты смотрели. Думаете, ваш комментарий через 3 года интересен автору? :)

Так он и сам в анабиозе был.)))))

lopezmil
Offline
Зарегистрирован: 17.02.2015

Я не в анабиозе, а сначала получил диплом бакалавра, а теперь учесь на магистра. И за это время еще и двоих детей заделал. Так что пока времени на ардуино практически нет. Но за темой слежу. Да и к следующему отопительному периоду тёще управление отоплением буду делать на ардуино. Оборудование уже готово. Осталась программная часть. Так что я в теме.

b707
Offline
Зарегистрирован: 26.05.2017

lopezmil пишет:
Я не в анабиозе

похоже, и вы тоже :)

Если что - речь не про вас была :)

com
Offline
Зарегистрирован: 06.09.2013

b707 пишет:

com. вы уже не первый раз вытаскиваете из архива какое-то старье... вы бы хотя б на даты смотрели. Думаете, ваш комментарий через 3 года интересен автору? :)

неуважаемый b707!

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

к сожалению, на этом форуме нет лички. если бы была - я непременно ей бы воспользовался. потому что у меня конкретный вопрос к конкретному человеку. заметьте, не м_н_е_н_и_е, а в_о_п_р_о_с. Ведь мнение и вопрос это разные вещи, да ведь? если бы вы следили не за тем, как, когда и кто пишет, а читали бы сами посты внимательнее, т.е обращали бы внимание на то, что пишут, наверно, пользы было бы больше для всех.

я вообще понятно излагаю свою мысль? а то мало ли, опять что-нибудь не поймете ....

так вот, у меня есть вопрос. я задал его в теме, потому что человек, которому я его задал, привел именно эту тему совсем недавно как пример своего труда. отсюда я сделал вывод, что для него этот труд важен, он следит за ним, и спрашивать лучше всего в этой теме, а не создавать новую. тем более, что результат будет одинаковый - тема появится на первой странице. и <возможно> беседа продолжится.

учитывая все вышеизложенное, хочу донести до вас одну простую мысль: ваш комментарий это последнее, что мне нужно в данной ситуации. если вы знаете, как связаться с yul-i-an-ом - буду признателен, а нет - воздержитесь от своих тупых реплик. по крайней мере, в мой адрес.

боюсь, что моя просьба, изложенная максимально вежливо, тем не менее не пробъется до вашего восприятия через слой хамства. поэтому повторю ее еще раз, упростив до мимимума

b707, иди нахрен

 

 

b707
Offline
Зарегистрирован: 26.05.2017

какой выброс эмоций-то... хватило бы и последней фразы, нет? :)

Действительно, у меня хорошая память и мне хватает одного взгляда на ник, чтобы сразу вспомнить 2-3 темы. где тот засветился. Например про участника yul-i-an могу вам сказать. что он потратил несколько лет. чтобы разобраться в том, что есть ПИД - и потому ваш вопрос вполне по адресу. Хотя я советовал бы вам просто прочитать какое-нибудь пособие по ПИД-регуляторам в инете - толку будет больше.

Не благодарите, мне это нетрудно.

com
Offline
Зарегистрирован: 06.09.2013

b707 пишет:

хватило бы и последней фразы, нет? :)

а подействует? попробую

b707 пишет:

я советовал бы вам просто прочитать какое-нибудь пособие по ПИД-регуляторам в инете

com пишет:

b707, иди нахрен

 

 

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Началса пятничный вброс гагна в вентилятор...

Хорошо, что я уже плюшевый. :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Пердец, опять говнеца быдлячьего на форум позаносило, жесть :)

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

У меня на даче отопление без проблемам, только настройки регулятора надо подбирать под объект. Сейчас работаю над автоматической настройкой.
http://arduino.ru/forum/proekty/pi-regulyator-otopleniya
ПИД переписал http://arduino.ru/forum/proekty/narodnyi-inkubator?page=2#comment-328166