требуется перенести значение переменной в следующий цикл loop
- Войдите на сайт для отправки комментариев
Пнд, 23/03/2015 - 15:58
Здравствуйте. Подскажите где и как мне объявить переменную 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); }
строка 41 P=temp; при первом проходе будет ложь. Объявить глобальной переменной в 3 строке float P; Вроде так.
Ошибочка вышла ... требуется объявить переменную P из формулы y = y + P; так, чтобы она была предыдущим значением переменной a, т.е. значением из прошлого цикла loop'а
Не помогло или я что-то не так сделал? По идее в каждом новом цикле должно быть приращение переменной y на величину переменной P из прошлого цикла.
lopezmil, при первом проходе неинициализированная переменная P, в которой может быть всякий мусор закинет Y неизвестно куда.
Поэтому лучше так:
Спасибо за отклик, это интересно, а можно объяснить эти строки, что это такое или ссылку на описание?
Один вопрос. Это у Вас пропорциональный регулятор?
Расчет мощьности интересный.
Надо просто поменять строки y=y+P и P=a местами!
Я думаю что Вам нужно ввести зону регулирования, вне которой мощность будет или 0% или 100%
например у Вас при temp==0 получаеться деление на 0, а при temp>ust отрицательное значение мощности.
Надо ограничить y
Да, это регулятор, но не просто пропорциональный. Должен получиться регулятор с затухающими колебаниями при выходе на уставку регулирования, чего нет у пропорционального регулятора. Я бы назвал его пропорциональный регулятор с аналогом интегральной состовляющей.
Отдельные спасибо за :
Надо просто поменять строки 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
}
Это должно было быть следующим шагом в написании этого кода и, скорее всего вопросом. А вы опередили вопрос ответом. Я приятно удивлён. У меня есть некоторые идеи, но реализовать их самостоятельно пока не могу. Плохо знаком с текстовыми языками программирования. Поэтому и задаю вопросы.
Опробовал Вашу формулу в железе, если интересны результаты выложу код, видео работы и схему. Управлял нагрузкой через симстор по алгоритму Брезенхема, в качестве нагревателя была лампочка, а в качестве датчика температуры диод. (известно што за 1 сек в сети 100 полупериодов-100% мощности, если в 1 сек. пропустить 10 полупериодов, то 10% мощности, а если их распределить на 1 сек. то получиться равномерное распределение расчетной мощности в течении 1 сек.)
Если не затруднит, я бы изучил ваш материал.
Я не совсем понял "если в 1 сек. пропустить 10 полупериодов, то 10% мощности, а если их распределить на 1 сек. то получиться равномерное распределение расчетной мощности в течении 1 сек" ?
А у меня этот код не работает, потому что в нём нужно ещё сравнивать предыдущее и нынешнее значения измеренной температуры и на основании этого выбирать сложение или вычитание коэффицента Р. Можно это делать тем же оператором for.
Про равномерное распределение мощьности я писал тут там и алгоритм лежит.
Вот мой код
В расчете мощности много мусора, пытаюсь откорректировать Вашу формулу, а то на уставку не выходит.
Вы там что то писали по поводу сравнивания предыдущей и текущей температуры, можно по подробней?
А я пока Видео сниму и лог.
Как сюда можно вставить видео? Долго описывать всё, легче показать на конкретном примере. Только что придумал интересную штуку. Temp необходимо сделать глобальной переменной и сранивать temp и Temp, если Temp>temp, то P имеет положительный знак, а если Temp<temp, то Р отрицательна. Без этого ( есть ещё один вариант добиться того же результата, но он более объёмный, больше действий) величина Р растёт пока не достигнет уставки и может по достижении уставки дойти до 100%.
Идея с обрезанием части мощности мне понравилась. Но возможна ли она? Если я правильно понял, то вместо 50 Гц в секунду, т.е. 50 "пучков тока" мы пропускаем только 10, к примеру. Срезая положительные или отрицательные полупериоды? Чем это можно осуществить? Очень похоже начастотный преобразователь. Правда я не вдавался в прнцип его дествия.
Завтра днём попробую подкорректировать ваш расчет мощности, там действиетльно кое-что лишнее и непонятное. Я и сам путаюсь, кода занимаюсь всей этой писаниной.
Можно ли ваш код залить в ардуино и какой датчик мне для этого понадобяться?
Завтра днём попробую подкорректировать ваш расчет мощности, там действиетльно кое-что лишнее и непонятное. Я и сам путаюсь, кода занимаюсь всей этой писаниной.
Можно ли ваш код залить в ардуино и какой датчик мне для этого понадобяться?
Идея с обрезанием части мощности мне понравилась. Но возможна ли она? Если я правильно понял, то вместо 50 Гц в секунду, т.е. 50 "пучков тока" мы пропускаем только 10, к примеру. Срезая положительные или отрицательные полупериоды? Чем это можно осуществить? Очень похоже начастотный преобразователь. Правда я не вдавался в прнцип его дествия.
Типо так .
Почти так, только полуволны не обрезаются, а пропускаються полностью. Если надо 50% мощности то через одну. За началом полуволны следит детектор нуля сети, а пропускать или нет полуволну вычисляет алгоритм Брезенхема в зависимости от расчетной мощности.
Такой подход уменьшает комутационные помехи в сети и облегчает жизнь семистору, но лампочка при таком регулировании будет заметно мерцать.
А какой датчик температуры использовали? И я не понял как и чем тут температура замеряется?
//Замер температуры
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;
}
Этот язык программирования я очень слабо знаю, поэтому достаточно трудно сразу всё понять. Но в расчёте выходной мощности есть вопросы
Здесь расчёт должен быть примерно таким:
a=ust/temp
b=a*100
y=b-100
y=y+P
P=a - идет в следующий цикл, т.е. в Р - величина а из предыдущего цикла.
Ещё одно дополнение
Вообщем у меня заработало вот с таким расчетом. Но это получился ПИ регулятор
Работает отлично, температуру держит, внешним возмущениям сопротивляеться.
Вот лог уже на уставке. Первая цифра уставка, вторая текущая температура, третья выходная мощность.
Лог выхода на уставку
Датчик температуры у меня не самый точный (сделан повторюсь из двух диодов).
А так всё нормально работает
Видео работы по алгоритму брезенхема (чередованием полуволн пропорционально мощьности 0101010101010)
Видео работы 2 в этом видео отсчитывает полупериоды подряд, пропорционально мощьности 1111100000.
В 1 сек при частоте сети 50Гц проходит 100 полуволн (положительных и отрицательных) если пропустить только 50 то и получите 50% мощьности в секунду.
Будут вопросы обращайтесь.
Весь код (непричесанный)
Про мой датчик температуры для lopezmil`а
На аналоговый вход посажен диод как тут видео.
Так как у диода линейная зависимость сопротивления от температуры, то я замерил показания АЦП при двух крайних температурах, затем вбил эти данные сюда и получил формулу для расчета температуры относительно показаний АЦП.
Но так как у меня на 1/1024 ацп приходилось более 1 градуса и показания сильно дергались мне пришлось искать способ программно расширить диапазон АЦП. Нашел выход в оверсемплинге теперь у меня шкала 1/4096 и показания как видите в моих логах уже не скачут, формулу конечно пересчитал опя по новым показаниям.
Просмотрел лог выхода на уставку ... какие-то странные скачки выходной мощности. При такой близости к уставке выходная мощность варьируется в пределах ±1-5% , а с 24 строки начинаются чудеса )) с чего такой скачок?
С двадцать четвертой строки я начал поднимать уставку.
В логах первый столбец УСТАВКА, второй ТЕКУЩАЯ ТЕМПЕРАТУРА, третий МОЩНОСТЬ.
Замер температуры, расчет мощности и вывод в терминал осуществляеться 1 раз в секунду.
Вот график по логу изменения уставки, на нем видно что на 24 секунде я меняю уставку с 36С на 39С.
Хорошо держит уставку. У вас всё правильно получилось. Некоторые моменты в программе мне остались непонятны, но это ввиду плохого знания самомго языка программирования. Но алгоритм вполне ясен. Поздравляю с успешным решением задачи!
Предлагаю решить ещё одну задачу: измерять ток каждой фазы трёхфазного асинхронного двигателя, записывать показания, обрабатывать их и в соответствии с условиями включать/выключать двигатель и выдавать предупреждающие или аварийные сигналы.
Хорошо держит уставку. У вас всё правильно получилось. Некоторые моменты в программе мне остались непонятны, но это ввиду плохого знания самомго языка программирования. Но алгоритм вполне ясен. Поздравляю с успешным решением задачи!
Предлагаю решить ещё одну задачу: измерять ток каждой фазы трёхфазного асинхронного двигателя, записывать показания, обрабатывать их и в соответствии с условиями включать/выключать двигатель и выдавать предупреждающие или аварийные сигналы.
С этим и сами справитесь. Надо на каждую фазу поставить шунт или трансформатор тока, и считывать с него напряжение через диодный мост (напряжение будет пропорционально току), программно подогнать шкалу, а дальше делай с этими данными всё что угодно. Но для безопасности надо будет развязать шунт и диодный мост трансформатором.
Про шунты и развязку можно найти через ГУГЛ.
А в коде моего регулятора много мусора, когда будет время подчищу.
Датчик температуры у меня не самый точный (сделан повторюсь из двух диодов).
А так всё нормально работает
Видео работы по алгоритму брезенхема (чередованием полуволн пропорционально мощьности 0101010101010)
Видео работы 2 в этом видео отсчитывает полупериоды подряд, пропорционально мощьности 1111100000.
В 1 сек при частоте сети 50Гц проходит 100 полуволн (положительных и отрицательных) если пропустить только 50 то и получите 50% мощьности в секунду.
Будут вопросы обращайтесь.
с лампочками понятно, разница очень заметна. а вы не сравнивали стабильность при поддержании температуры на более инерционных системах? к примеру, плитки/тэны от 0.5 квт и выше? у меня сейчас мощность регулируется шимом 1/2 гц, к которому подключено твердотельное реле, полупериоды не отсчитываю, просто меняю duty 0..100. вроде все устраивает, колебания температуры в пределах 0.3 градуса, но шило перфекционизма в заднице не дает успокоиться.
com. вы уже не первый раз вытаскиваете из архива какое-то старье... вы бы хотя б на даты смотрели. Думаете, ваш комментарий через 3 года интересен автору? :)
com. вы уже не первый раз вытаскиваете из архива какое-то старье... вы бы хотя б на даты смотрели. Думаете, ваш комментарий через 3 года интересен автору? :)
Так он и сам в анабиозе был.)))))
Я не в анабиозе, а сначала получил диплом бакалавра, а теперь учесь на магистра. И за это время еще и двоих детей заделал. Так что пока времени на ардуино практически нет. Но за темой слежу. Да и к следующему отопительному периоду тёще управление отоплением буду делать на ардуино. Оборудование уже готово. Осталась программная часть. Так что я в теме.
похоже, и вы тоже :)
Если что - речь не про вас была :)
com. вы уже не первый раз вытаскиваете из архива какое-то старье... вы бы хотя б на даты смотрели. Думаете, ваш комментарий через 3 года интересен автору? :)
неуважаемый b707!
очевидно, у вас очень много свободного времени, чтобы следить за другими пользователями - когда и на какие темы они отвечают. это наводит на определенные мысли.... это, а так же то, что два года для вас - неимоверно длинный срок, и все, что написано чуть ранее, чем позавчера, суть полная ерунда.
к сожалению, на этом форуме нет лички. если бы была - я непременно ей бы воспользовался. потому что у меня конкретный вопрос к конкретному человеку. заметьте, не м_н_е_н_и_е, а в_о_п_р_о_с. Ведь мнение и вопрос это разные вещи, да ведь? если бы вы следили не за тем, как, когда и кто пишет, а читали бы сами посты внимательнее, т.е обращали бы внимание на то, что пишут, наверно, пользы было бы больше для всех.
я вообще понятно излагаю свою мысль? а то мало ли, опять что-нибудь не поймете ....
так вот, у меня есть вопрос. я задал его в теме, потому что человек, которому я его задал, привел именно эту тему совсем недавно как пример своего труда. отсюда я сделал вывод, что для него этот труд важен, он следит за ним, и спрашивать лучше всего в этой теме, а не создавать новую. тем более, что результат будет одинаковый - тема появится на первой странице. и <возможно> беседа продолжится.
учитывая все вышеизложенное, хочу донести до вас одну простую мысль: ваш комментарий это последнее, что мне нужно в данной ситуации. если вы знаете, как связаться с yul-i-an-ом - буду признателен, а нет - воздержитесь от своих тупых реплик. по крайней мере, в мой адрес.
боюсь, что моя просьба, изложенная максимально вежливо, тем не менее не пробъется до вашего восприятия через слой хамства. поэтому повторю ее еще раз, упростив до мимимума
b707, иди нахрен
какой выброс эмоций-то... хватило бы и последней фразы, нет? :)
Действительно, у меня хорошая память и мне хватает одного взгляда на ник, чтобы сразу вспомнить 2-3 темы. где тот засветился. Например про участника yul-i-an могу вам сказать. что он потратил несколько лет. чтобы разобраться в том, что есть ПИД - и потому ваш вопрос вполне по адресу. Хотя я советовал бы вам просто прочитать какое-нибудь пособие по ПИД-регуляторам в инете - толку будет больше.
Не благодарите, мне это нетрудно.
хватило бы и последней фразы, нет? :)
а подействует? попробую
я советовал бы вам просто прочитать какое-нибудь пособие по ПИД-регуляторам в инете
b707, иди нахрен
Началса пятничный вброс гагна в вентилятор...
Хорошо, что я уже плюшевый. :)
Пердец, опять говнеца быдлячьего на форум позаносило, жесть :)
У меня на даче отопление без проблемам, только настройки регулятора надо подбирать под объект. Сейчас работаю над автоматической настройкой.
http://arduino.ru/forum/proekty/pi-regulyator-otopleniya
ПИД переписал http://arduino.ru/forum/proekty/narodnyi-inkubator?page=2#comment-328166