Отвлекитесь, эмбеддеры! Отвлеченные темы - обсудить проблемы тепловой смерти вселенной, или просто пиво. Этот раздел - для отдыха. |
20.11.2017, 23:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от AR_Favorit
|
Откуда ты берешь 100 секунд-то? Пальцем покажи.
|
Показываю пальцем:
Сообщение от AR_Favorit
|
А еще эта строка в цикле прерывания с периодом в 1 мс будет отсчитывать "1 раз 100 секунд" только если оператор выставит уставку периода регулирования EE_PID_TIME в значение "100". Но на случай такого глупого оператора программа не даст ему это сделать, ибо период регулирования, исходя из характеристик оборудования (конкретно - определяемой объемом бака и мощностью нагреватля скорости нагрева) можно задать от 1 до 10 сек. Соответственно и значение дданной переменной EE_PID_TIME лежит в этом диапазоне.
|
Метода такая - найти неточность в объяснениях и выдавать её за ошибку в программе.
Уже третий день мается, болезный.
|
|
|
|
21.11.2017, 01:29
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от AR_Favorit
|
Откуда ты берешь 100 секунд-то? Пальцем покажи.
|
Я эти 100 секунд взял предположив, что будем производить расчет пида 10 раз в секунду! То есть принял что EE_PID_TIME = 100 мc (см первое сообщение темы, в котором написано
Сообщение от ALEGYR
|
EE_PID_TIME = 100 мc
|
Если я возьму твои значения EE_PID_TIME, которая раньше была CONST_PID_TIME и равнялась 1 секунде (см цитату из ТВОЕГО сообщения
Сообщение от AR_Favorit
|
Исторически так сложилось. Изначально планировалось жестко задать период регулирования, и на месте EE_PID_TIME был токен CONST_PID_TIME, определенный как
Цитата:
|
Код:
#define CONST_PID_TIME 1 //период регулирования в секундах
|
для того, чтобы подобрать его при отладке под параметры установки заказчика.
|
и твое заявление
Сообщение от AR_Favorit
|
В этой строке нет измерения температуры. Как и в последующих.
А еще эта строка в цикле прерывания с периодом в 1 мс
|
то твоя первая строка кода
if (pid_counter‹(EE_PID_TIME*1000)) pid_counter++;
вообще будет ждать расчета пида не 100 секунд, а целых 1000!
Ведь прерывание ты делаешь с периодом 1 мс (то есть 1000 раз в секунду), твой счетчик ожидания расчета пид pid_counter должен достичь значения 1000000
то есть переменную EE_PID_TIME равную 1 секунде (указанную в #define EE_PID_TIME 1 //период регулирования в секундах) в перевести в 1000 миллисекунд и умножить на 1000!!!
Последний раз редактировалось ALEGYR; 21.11.2017 в 01:33.
|
|
|
|
21.11.2017, 01:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
Я эти 100 секунд взял предположив, что будем производить расчет пида 10 раз в секунду! То есть принял что EE_PID_TIME = 100 мc (см первое сообщение темы, в котором написано
|
То есть ты, не поняв двух операндов в одной строчке кода, один из которых (EE_PID_TIME) задает период регулирования в секундах, а второй (1000) переводит это значение в миллисекунды для сравнения со счетчиком pid_counter, ведущим отсчет в миллисекундах, и проигнорировав неоднократно данное пояснение, что переменная (уставка) EE_PID_TIME может принимать только значения от 1 до 10, начал городить заведомую ерунду:
Сообщение от ALEGYR
|
твоя первая строка кода
if (pid_counter‹(EE_PID_TIME*1000)) pid_counter++;
вообще будет ждать расчета пида не 100 секунд, а целых 1000!
|
Уже и 1000 секунд, Карл!
Мы берем 1 (единицу! точно такую же единицу, которой была CONST_PID_TIME!), умножаем ее на 1000 (тысячу), и получаем число, до которого счетчик, тикающий каждую миллисекунду
Сообщение от ALEGYR
|
Ведь прерывание ты делаешь с периодом 1 мс (то есть 1000 раз в секунду)
|
должен натикать...... за 1000 секунд! Миллион!
Ты как в магазине с такой арифметикой рассчитываешься, а? Единицу умножили на тысячу и получили миллион!
Еще раз, медленно и печально.
Переменная EE_PID_TIME - период регулировки в секундах.
Переменная EE_PID_TIME, умноженная на 1000 - период регулировки в миллисекундах.
Счетчик, инкрементируемый в прерывании, вызывающемся каждую миллисекунду, отсчитает от 0 до 1*1000 за одну секунду.
Не понимаешь - спроси, десять раз уже говорил. Не городи ерунды.
|
|
|
|
21.11.2017, 01:48
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от omercury
|
Метода такая - найти неточность в объяснениях и выдавать её за ошибку в программе.
|
Ну какая же это неточность в объяснениях, если в ТЗ указано
Сообщение от AR_Favorit
|
период регулирования, исходя из характеристик оборудования ... можно задать от 1 до 10 сек. Соответственно и значение дданной переменной EE_PID_TIME лежит в этом диапазоне.
|
и в программе объявлено и даже выделено
Сообщение от AR_Favorit
|
#define CONST_PID_TIME 1 //период регулирования в секундах
|
|
|
|
|
21.11.2017, 01:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.06.2010
Адрес: Минск
Сообщений: 1,511
Сказал спасибо: 916
Сказали Спасибо 1,275 раз(а) в 488 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
AR_Favorit, как у Вас только хватает терпения
Последний раз редактировалось Марья-2; 21.11.2017 в 02:00.
|
|
|
|
21.11.2017, 01:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от omercury
|
Метода такая - найти неточность в объяснениях и выдавать её за ошибку в программе.
|
Была б там неточность, я б еще понял. Но сначала он долго выясняет, зачем-зачем-зачем EE_PID_TIME в программе умножается на тысячу, а затем, когда вроде как всё разжевано, берет значение EE_PID_TIME, умножает его на тысячу в уме ( ), затем еще раз на тысячу в программе, и получает миллион, до которого мой бедный счетчик должен досчитать. Прям слава богу, что я его 32-битным объявил, а то был бы 16-битный - никогда бы не досчитал, ни за тыщу смекунд, ни за миллион лет)))
Я не знаю, может я очень плохо объясняю? Прям как в том анекдоте - "сам уже понял, а они нет". Скажите кто-нить со стороны, неужели настолько плохо? Я же неоднократно умудрялся людям, не позиционирующим себя программистами, но желающими стать таковыми (в определенных пределах, хотя бы той же ардуины) , объяснять такие элементарные вещи, и они вроде бы как понимали. )))
|
|
|
|
21.11.2017, 01:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
Ну какая же это неточность в объяснениях, если в ТЗ указано
и в программе объявлено и даже выделено
|
ДА!!! В секундах! Отлично! Одна секунда, две секунды, три секунды.... до десяти.
А счетчик у нас тикает каждую миллисекунду - в одну секунду набегает ровно тысяча тиков.
И мы берем секунды - одну, или две, или пять, -умножаем их на эту тыщу, и получаем то самое количество тиков, которое должен протикать таймер для отсчета заданного времени: тыщу, или две тыжи, или пять тыщ. Откуда у тебя взялся миллион, до которого ему надо дотикать? Ну откуда?! Покажи "я вот это умножил на вот то".
|
|
|
|
21.11.2017, 02:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от Марья-2
|
AR_Favorit, как у Вас только хватает терпения
|
Плоховато хватает
Но мне жутко интересно, это настолько не вскрываемый троллинг, или человек пишет всерьез?!
Ожидали
Сообщение от ALEGYR
|
полноты освещения вопросов, связанных c созданием кода реализации ПИД-регулятора, и работы самого ПИД-регулятора
|
А в реальности освещающий застрял на первой же строчке кода, до собственно ПИД-регулятора и не дойдя. Что же будет, когда мы начнем обсуждать критерии устойчивости системы? (шутка, не начнем)
|
|
|
|
21.11.2017, 02:22
|
|
Вид на жительство
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от AR_Favorit
|
Мы берем 1 (единицу! точно такую же единицу, которой была CONST_PID_TIME!), умножаем ее на 1000 (тысячу), и получаем число, до которого счетчик, тикающий каждую миллисекунду
|
Так понимаешь в чем дело, если тебе в ТЗ указано, что регулирование производится в диапазоне от 1 до 10 секунд, то и надо исходить из этого. Перевел ОДИН раз данные вводимые оператором из секунд в миллисекунды, запомнил их в ЕЕПРОМе, и ЗАБЫЛ о всех умножениях в своем коде!!! записав
if (pid_counter ‹ EE_PID_TIME) pid_counter++;
или
if (heat_counter › EE_PID_TIME) heat_counter=0;
А если еще и таймер прерывания можно задать этим значением, то и саму первую строку вообще можно убрать, вместе со счетчиком pid_counter и строкой pid_counter = 0;
написав
Цитата:
|
PID_curr_err = EE_FUEL_TARGET_TEMP - temp;//Начало
if (integral_err‹(EE_PID_TIME*2000)) integral_err += PID_curr_err;
control = (int32_t)EE_PID_P*PID_curr_err;
control += (integral_err*(int32_t)EE_PID_I)/1000;
control -= (PID_prev_err - PID_curr_err)*(int32_t)EE_PID_D;
PID_prev_err = PID_curr_err;//конец
if (control›heat_counter) HEAT_ON; else HEAT_OFF;
heat_counter++;
if (heat_counter›(EE_PID_TIME) heat_counter=0;
|
|
|
|
|
21.11.2017, 02:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Мои ответы на вопросы [b]AR_Favorit[/b]
Сообщение от ALEGYR
|
Так понимаешь в чем дело, если тебе в ТЗ указано, что регулирование производится в диапазоне от 1 до 10 секунд, то и надо исходить из этого.
|
Регулирование и производится в диапазоне от 1 до 10 секунд, какие претензии?
Сообщение от ALEGYR
|
Перевел ОДИН раз данные вводимые оператором из секунд в миллисекунды, запомнил их в ЕЕПРОМе, и ЗАБЫЛ о всех умножениях в своем коде!!!
|
Можно сделать и так, а можно сделать, как я. А при определенной организации программы в результате компиляции вообще не будет этих умножений, несмотря на то, что в исходном тексте они есть. И в любом случае результат исполнения данного кода корректный, и ни о каких "думающих 100 секунд бачках" речи не идет. Это ты понимаешь или нет? Это вопрос, прочти название темы и ответь.
Сообщение от ALEGYR
|
А если еще и таймер прерывания можно задать этим значением
|
А если бы у бабушки были яйца, она пожарила бы яичницу.
Вот эта часть
Код:
|
if (control›heat_counter) HEAT_ON; else HEAT_OFF;
heat_counter++;
if (heat_counter›(EE_PID_TIME) heat_counter=0; |
В твоей пародии на мой код нормально работать уже не будет. ШИМ-сигнал с периодом 1-10с превратился в пшик. Вот так вот.
Последний раз редактировалось AR_Favorit; 21.11.2017 в 02:50.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:10.
|
|