Тестер ПИД регулятора из говна и палок

Как по быстрому проверить работу ПИД регулятора контроллера имея выход 0-10V, мощный составной транзистор и нагрузочное сопротивление.

Сначала мой мозг родил — контроллер получающий 0-10В шимит МДП транзистор, потом была идея с вентилятором и клапаном на 0-10В, но все было отвергнуто из за громоздкости или сложности т.к. лень было рисовать травить паять. Вспомнив, что есть эмиттерный повторитель да и еще составные транзисторы, немного посимулировал это дело и поехал на радиорынок где купил TIP142 и 2-х ваттных сопротивлений на 40 Ом. Дома выдрал из старой розетки контакт решил что он идеально налезет на резистор — что почти так и вышло. Термистор с того же рынка — 10К3. Плюс к простоте мы получаем чудесную нелинейность характеристики в начале, что делает данную конструкцию похожей на реальную связку клапан+привод.






Результаты в более удобно виде:

OUT/10 = напряжение на базе транзистора.

Схема:

При большом падении напряжения и/или токе транзистор может сильно греться так что лучше поставить на радиатор.

Несмотря на простоту данная конструкция по ощущениям достаточно хорошо эмулирует поведение регулирующего механизма — типа привода и клапана на воду.
UPDATE: Как это все жило по времени, верхний тренд — выход 0-10V. Нижний — зеленая уставка, красная температура.


Между большими рисками — 2 минуты
И выход на режим правда с немного другими коэффицентами ( Не очень удачно развел плату поэтому ко всему прочему заметно скачет АЦП)


UPDATE1: Код ПИД регулятора по просьбам телезрителей. Предоставляется как есть в проекте, есть не всем нужные фичи и косяки. Дискретность исполнения 1секунда.

inline void PID_OBJ(unsigned char k)
{

if(res_byte(k,5))//run pid
{
if((((res_float(k,3)-res_float(k,4))*2)>CNTRL_MEM.OBJ[k].conf_byte[0])|(((res_float(k,3)-res_float(k,4))*2)<-CNTRL_MEM.OBJ[k].conf_byte[0]))
{
//p-part
if(res_float(k,0)>0)
CNTRL_MEM.OBJ[k].conf_float[0]=(res_float(k,3)-res_float(k,4))/(res_float(k,0))*100;
else
CNTRL_MEM.OBJ[k].conf_float[0]=0;

//improoved positive offset
if((CNTRL_MEM.OBJ[k].conf_int[0]>0) & (CNTRL_MEM.OBJ[k].conf_int[1]>0))
CNTRL_MEM.OBJ[k].conf_float[0]=CNTRL_MEM.OBJ[k].conf_float[0]+CNTRL_MEM.OBJ[k].conf_int[0];

//i-part
 if(res_float(k,1)>0)
 {
CNTRL_MEM.OBJ[k].conf_float[1]=CNTRL_MEM.OBJ[k].conf_float[1]+(res_float(k,3)-res_float(k,4))/res_float(k,1);
}
else
{
CNTRL_MEM.OBJ[k].conf_float[1]=0;
}

res_table[k].res_float=CNTRL_MEM.OBJ[k].conf_float[0]+CNTRL_MEM.OBJ[k].conf_float[1];
//reducing pid if integral overload
if(CNTRL_MEM.OBJ[k].conf_float[1]!=0)
{
if(res_table[k].res_float>CNTRL_MEM.OBJ[k].conf_int[1])//max
CNTRL_MEM.OBJ[k].conf_float[1]=CNTRL_MEM.OBJ[k].conf_int[1]-CNTRL_MEM.OBJ[k].conf_float[0];

if(res_table[k].res_float<CNTRL_MEM.OBJ[k].conf_int[0])//min
CNTRL_MEM.OBJ[k].conf_float[1]=CNTRL_MEM.OBJ[k].conf_int[0]+CNTRL_MEM.OBJ[k].conf_float[0];
}


res_table[k].res_float=CNTRL_MEM.OBJ[k].conf_float[0]+CNTRL_MEM.OBJ[k].conf_float[1]-CNTRL_MEM.OBJ[k].conf_float[2]+(res_float(k,3)-res_float(k,4))*res_float(k,2);

//d-part
CNTRL_MEM.OBJ[k].conf_float[2]=(res_float(k,3)-res_float(k,4))*res_float(k,2);

if(CNTRL_MEM.OBJ[k].conf_int[1]>CNTRL_MEM.OBJ[k].conf_int[0])
{
if(res_table[k].res_float<CNTRL_MEM.OBJ[k].conf_int[0])
res_table[k].res_float=CNTRL_MEM.OBJ[k].conf_int[0];

if(res_table[k].res_float>CNTRL_MEM.OBJ[k].conf_int[1])
res_table[k].res_float=CNTRL_MEM.OBJ[k].conf_int[1];
}
else
res_table[k].res_float=0;
}
}
else
{
res_table[k].res_float=0;
CNTRL_MEM.OBJ[k].conf_float[1]=0;//i- part
CNTRL_MEM.OBJ[k].conf_float[2]=0;//d- part
}

}



  • +1
  • 14 мая 2012, 12:54
  • GYUR22

Комментарии (11)

RSS свернуть / развернуть
А что это за платка?
0
  • avatar
  • Vga
  • 14 мая 2012, 16:15
очень люблю вопросы Василия, пофиг о чем пост — че за плата :)
Это мой девелопмент борд очередного контроллера уже на STM32
+2
Ну так все остальное и так понятно :)
0
У меня первым делом такой-же про плату вопрос возник:) А следующим — почему скриншоты с трендами не увеличиваются?
0
почему не увеличиваются хз
ни одна фотка у меня при импорте в сообщество не импортируется
0
не увеличивается
0
Было бы здорово увидеть код для stm32 ПИД регулятора!
0
он ничем не отличается от AVR :)
0
Это понятно. С другой стороны, на код правильного регулятора, который учитывает все известные грабли (ну там ресеты в нужное время и прочие заморочки), я бы тоже поглядел.
0
Сомневаюсь что мой код оптимальный т.к. в нем могу разобраться :), а ни в одном примере данном в сети не мог — пришлось самому по формуле опыту и ощущениям (и точно есть один косяк который в моей области врятли скажется), плюс к этому он адаптированный к объектам контроллера и специфике. Щас апдейтну статью.
0
Уфф. Рефакторинг этому коду явно бы не повредил.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.