|
ПИД регулятор темперауры |
|
|
|
Dec 15 2008, 14:52
|
Группа: Участник
Сообщений: 11
Регистрация: 1-11-07
Пользователь №: 31 960

|
Помогите разобраться с цыфровым ПИД регулированием температуры. Моя цель: "разработать пид регулятор температуры на базе микроконтроллера AVR". Не могу разобраться с математикой пид регулирования.
|
|
|
|
|
 |
Ответов
|
Dec 25 2008, 14:34
|
Местный
  
Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476

|
Вот исходники ПИД-регулятора... *.h Коэффициенты введены для примера Код #define K_P 0.22 #define K_I 0.006 #define K_D 0.001
#define SCALING_FACTOR 128
typedef struct PID_DATA{ int lastProcessValue; long sumError; int P_Factor; int I_Factor; int D_Factor; int maxError; long maxSumError; } pidData_t;
#define INT16_MAX 32767 #define INT32_MAX 2147483647
#define MAX_INT INT16_MAX #define MAX_LONG INT32_MAX #define MAX_I_TERM (MAX_LONG / 2)
extern struct pidData_t PID_DATA;
void pid_Init(int p_factor, int i_factor, int d_factor, struct PID_DATA *pid); int pid_Controller(int setPoint, int processValue, struct PID_DATA *pid_st); *.c Код #include "pid.h"
void pid_Init(int p_factor, int i_factor, int d_factor, struct PID_DATA *pid) { pid->sumError = 0; pid->lastProcessValue = 0;
pid->P_Factor = p_factor; pid->I_Factor = i_factor; pid->D_Factor = d_factor; pid->maxError = MAX_INT / (pid->P_Factor + 1); pid->maxSumError = MAX_I_TERM / (pid->I_Factor + 1); }
int pid_Controller(int setPoint, int processValue, struct PID_DATA *pid_st) { int error, p_term, d_term; long i_term, ret, temp;
error = setPoint - processValue;
//----- Calculate Pterm and limit error overflow if (error > pid_st->maxError){ p_term = MAX_INT; } else if (error < -pid_st->maxError){ p_term = -MAX_INT; } else{ p_term = pid_st->P_Factor * error; }
//----- Calculate Iterm and limit integral runaway temp = pid_st->sumError + error; if(temp > pid_st->maxSumError){ i_term = MAX_I_TERM; pid_st->sumError = pid_st->maxSumError; } else if(temp < -pid_st->maxSumError){ i_term = -MAX_I_TERM; pid_st->sumError = -pid_st->maxSumError; } else{ pid_st->sumError = temp; i_term = pid_st->I_Factor * pid_st->sumError; }
//----- Calculate Dterm d_term = pid_st->D_Factor * (pid_st->lastProcessValue - processValue);
pid_st->lastProcessValue = processValue;
ret = (p_term + i_term + d_term) / SCALING_FACTOR; if(ret > MAX_INT){ ret = MAX_INT; } else if(ret < -MAX_INT){ ret = -MAX_INT; }
return((int)ret); } Инициализация выглядит примерно так: Код pid_Init(K_P * SCALING_FACTOR, K_I * SCALING_FACTOR , K_D * SCALING_FACTOR, &pidData);
|
|
|
|
|
Dec 26 2008, 08:27
|
Знающий
   
Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489

|
Цитата(MSprut @ Dec 25 2008, 17:34)  Вот исходники ПИД-регулятора... Расчеты в целых числах а коэффициенты дробные 0.001 или 0.006. А SCALING_FACTOR всего 128. При иницализации 0.001*128 = меньше 1 округлится до 0. Я использовал такой же код, но мне было лень разбираться с переводами в целочисленную арифметику, поэтому я все сделал во float. Быстродействия проца хватит. И ещё могут быть косяки в согласовании выхода регулятора и диапазона действия исполнительного органа.
--------------------
В действительности всё не так, как на самом деле.
|
|
|
|
|
Dec 26 2008, 09:23
|
Местный
  
Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476

|
Цитата(slog @ Dec 26 2008, 10:27)  Расчеты в целых числах а коэффициенты дробные 0.001 или 0.006. А SCALING_FACTOR всего 128. При иницализации 0.001*128 = меньше 1 округлится до 0. Я использовал такой же код, но мне было лень разбираться с переводами в целочисленную арифметику, поэтому я все сделал во float. Быстродействия проца хватит. И ещё могут быть косяки в согласовании выхода регулятора и диапазона действия исполнительного органа. Коэффициенты взяты для примера, SCALING_FACTOR можно увеличить, но сути это не меняет. А float не хочу использовать потому что проц загружен и так; измерение RMS напряжений, токов и частот по всем 3-м фазам, контроль за двигателем и интерфейс с другим девайсом, в который переганяется вся информация для отображения. Думаю float здоровье сильно не поправит. Цитата(evgeny_ch @ Dec 26 2008, 10:45)  Что вам мешает управлять, используя в кач. сигнала ОС конечный параметр, а не обороты двигателя ВАЗ-2101? ШД (гибридные) проектировались для работы без ОС, поскольку там есть статический синхронизирующий момент, им не нужно управлять постоянно. Вы знаете КПД червячного редуктора и момент ШД? От оборотов двигателя зависит частота тока на выходе генератора, к ней критично оборудование питаемое, а так больше ничего не мешает. Конструкция карбюратора, управляющего редуктора и вибрация не позволяют отпускать ШД в свободное плавание. КПД не знаю. Пишу вот это все и начинаю понимать, что система хуже некуда вырисовывается.
|
|
|
|
Сообщений в этой теме
Bobi ПИД регулятор темперауры Dec 15 2008, 14:52 _Pasha Цитата(Bobi @ Dec 15 2008, 18:52) Не могу... Dec 15 2008, 15:05 Bobi Цитата(_Pasha @ Dec 15 2008, 18:05) Поиск... Dec 15 2008, 15:23 mempfis_ Цитата(Bobi @ Dec 15 2008, 18:52) Помогит... Dec 15 2008, 15:26 Bobi Цитата(mempfis_ @ Dec 15 2008, 18:26) Нед... Dec 15 2008, 15:41 Alex128 Цитата(Bobi @ Dec 15 2008, 18:52) Помогит... Dec 15 2008, 19:17 evgeny_ch Цитата(Bobi @ Dec 15 2008, 18:52) Помогит... Dec 15 2008, 19:30 Alex128 Цитата(evgeny_ch @ Dec 15 2008, 23:30) За... Dec 15 2008, 20:14 Tanya Цитата(evgeny_ch @ Dec 15 2008, 22:30) За... Dec 16 2008, 08:04  evgeny_ch Цитата(Tanya @ Dec 16 2008, 12:04) Вот эт... Dec 16 2008, 08:13   Tanya Цитата(evgeny_ch @ Dec 16 2008, 11:13) Не... Dec 16 2008, 08:32    evgeny_ch Цитата(Tanya @ Dec 16 2008, 12:32) Внутри... Dec 16 2008, 09:25     Tanya Цитата(evgeny_ch @ Dec 16 2008, 12:25) Аг... Dec 16 2008, 10:05      evgeny_ch Цитата(Tanya @ Dec 16 2008, 14:05) Вряд л... Dec 16 2008, 13:21       Tanya Цитата(evgeny_ch @ Dec 16 2008, 16:21) А ... Dec 16 2008, 13:55        evgeny_ch Цитата(Tanya @ Dec 16 2008, 17:55) ...Вы ... Dec 16 2008, 14:12         Tanya Цитата(evgeny_ch @ Dec 16 2008, 17:12) Вс... Dec 16 2008, 14:20  _Pasha Цитата(Tanya @ Dec 16 2008, 12:04) Видели... Dec 16 2008, 09:33   evgeny_ch Цитата(_Pasha @ Dec 16 2008, 13:33) Это т... Dec 16 2008, 09:44    _Pasha Цитата(evgeny_ch @ Dec 16 2008, 13:44) Че... Dec 16 2008, 09:50     evgeny_ch Цитата(_Pasha @ Dec 16 2008, 13:50) Ну, в... Dec 16 2008, 10:11  IJAR Цитата(Tanya @ Dec 16 2008, 11:04) Вот эт... Dec 17 2008, 07:46 slog Я смотрю тут спецы по ПИД собрались. :-)
Проясните... Dec 16 2008, 10:52 _Pasha Цитата(slog @ Dec 16 2008, 14:52) P - 1..... Dec 16 2008, 11:04  Tanya Цитата(_Pasha @ Dec 16 2008, 14:04) Как-т... Dec 16 2008, 11:08 Tanya Цитата(slog @ Dec 16 2008, 13:52) Я смотр... Dec 16 2008, 11:06 Склихасовский Ребят а примером реализации на ASMе не поделитесь.... Dec 16 2008, 11:07 Склихасовский наверное не обрезать а ограничить по мин,макс. Dec 16 2008, 11:18 slog То что накапливает интегратор надо ограничивать, и... Dec 16 2008, 11:30 galjoen Добавлю, что в реальных условиях Д помогает бороть... Dec 16 2008, 12:12 Alex128 Цитата(slog @ Dec 16 2008, 15:30) Как опр... Dec 16 2008, 13:24 _Pasha Ранее не читал.
http://people.csail.mit.edu/unamay... Dec 16 2008, 13:41 Baser Встряну и я сюда со своим практическим вопросиком ... Dec 16 2008, 17:36 _Pasha Цитата(Baser @ Dec 16 2008, 21:36) Собств... Dec 16 2008, 18:29 Tanya Цитата(Baser @ Dec 16 2008, 20:36) Встрян... Dec 17 2008, 07:37 slog Вот еще момент какой. Предположим ПИДом поддержива... Dec 16 2008, 18:01 Alex128 Цитата(slog @ Dec 16 2008, 22:01) Но вот ... Dec 16 2008, 23:21  slog Цитата(Alex128 @ Dec 17 2008, 02:21) Помн... Dec 17 2008, 05:50   demiurg_spb Цитата(slog @ Dec 17 2008, 08:50) Объясню... Dec 17 2008, 09:50    slog Цитата(demiurg_spb @ Dec 17 2008, 12:50) ... Dec 17 2008, 10:20     Tanya Цитата(slog @ Dec 17 2008, 13:20) Я уже п... Dec 17 2008, 10:49  Alhen Цитата(Alex128 @ Dec 17 2008, 03:21) Ниче... Dec 17 2008, 05:53 slog Ограничить скорость нельзя. Нажали кнопку- начали ... Dec 17 2008, 11:15 _Pasha Цитата(slog @ Dec 17 2008, 15:15) Задача ... Dec 17 2008, 11:24 Tanya Цитата(slog @ Dec 17 2008, 14:15) Огранич... Dec 17 2008, 11:38 Alex128 Цитата(slog @ Dec 17 2008, 15:15) Задача ... Dec 17 2008, 14:33 slog Не вижу смысла ограничивать скорость или делать мн... Dec 17 2008, 13:05 _Pasha Цитата(slog @ Dec 17 2008, 17:05) Мне каж... Dec 17 2008, 13:19  Tanya Цитата(_Pasha @ Dec 17 2008, 16:19) Это с... Dec 17 2008, 13:39   _Pasha Цитата(Tanya @ Dec 17 2008, 17:39) Вот Ва... Dec 17 2008, 13:58    slog Цитата(_Pasha @ Dec 17 2008, 16:58) Как В... Dec 17 2008, 14:22     _Pasha Цитата(slog @ Dec 17 2008, 18:22) А-а-а т... Dec 17 2008, 14:43     Tanya Цитата(slog @ Dec 17 2008, 17:22) А-а-а т... Dec 17 2008, 14:52      galjoen Замечу, что все здесь почему-то считают, что в при... Dec 17 2008, 16:01       Alex128 Цитата(galjoen @ Dec 17 2008, 20:01) Заме... Dec 21 2008, 20:28        galjoen Цитата(Alex128 @ Dec 21 2008, 23:28) Дык,... Dec 22 2008, 12:11 an_ga Разрешите вставить свои пять копеек, т.к. регулято... Dec 20 2008, 14:01 kolobok0 Цитата(an_ga @ Dec 20 2008, 17:01) Разреш... Dec 24 2008, 13:10 Леонид Иванович Удобно пользоваться дифференциальной формой записи... Dec 21 2008, 15:30 ucMike Цитата(Леонид Иванович @ Dec 21 2008, 18... Dec 21 2008, 20:38  Tanya Цитата(ucMike @ Dec 21 2008, 23:38) Возмо... Dec 22 2008, 09:32   ucMike Цитата(Tanya @ Dec 22 2008, 12:32) Предст... Dec 23 2008, 11:35 MSprut Уважаемый All, может кто-нибудь в этой теме прокон... Dec 25 2008, 13:22 Alex128 Цитата(MSprut @ Dec 25 2008, 17:22) Уважа... Dec 25 2008, 20:42  MSprut Цитата(Alex128 @ Dec 25 2008, 22:42) Возм... Dec 26 2008, 07:45   evgeny_ch Цитата(MSprut @ Dec 26 2008, 11:45) Это р... Dec 26 2008, 08:45 slog Косяки в программе. Р и D должны быть больше 1, а ... Dec 25 2008, 13:36   evgeny_ch Цитата(MSprut @ Dec 26 2008, 13:23) ...
О... Dec 26 2008, 09:51    MSprut Цитата(evgeny_ch @ Dec 26 2008, 11:51) Из... Dec 26 2008, 10:16     evgeny_ch Цитата(MSprut @ Dec 26 2008, 14:16) Прошу... Dec 26 2008, 10:31      MSprut Цитата(evgeny_ch @ Dec 26 2008, 12:31) ..... Dec 26 2008, 10:41       evgeny_ch Цитата(MSprut @ Dec 26 2008, 14:41) В мое... Dec 26 2008, 11:17        MSprut Цитата(evgeny_ch @ Dec 26 2008, 13:17) То... Dec 26 2008, 11:24         Tanya Цитата(MSprut @ Dec 26 2008, 14:24) К сож... Dec 26 2008, 11:54         evgeny_ch Цитата(MSprut @ Dec 26 2008, 15:24) К сож... Dec 26 2008, 12:21          MSprut Цитата(evgeny_ch @ Dec 26 2008, 14:21) На... Dec 26 2008, 12:28           evgeny_ch Цитата(MSprut @ Dec 26 2008, 16:28) Редук... Dec 26 2008, 12:31            MSprut Цитата(evgeny_ch @ Dec 26 2008, 14:31) Ск... Dec 26 2008, 12:48 decsal Здравствуйте! Что бы не создавать новую тему, ... Dec 26 2008, 10:15 slog Резистор последовательно с обмоткой это древний сп... Dec 26 2008, 13:28 MSprut Цитата(slog @ Dec 26 2008, 15:28) Резисто... Dec 26 2008, 13:41  Tanya Цитата(MSprut @ Dec 26 2008, 16:41) L298 ... Dec 26 2008, 14:04   MSprut Цитата(Tanya @ Dec 26 2008, 16:04) Из Ваш... Dec 26 2008, 14:13  evgeny_ch Цитата(MSprut @ Dec 26 2008, 17:41) L298 ... Dec 26 2008, 14:18   MSprut Цитата(evgeny_ch @ Dec 26 2008, 16:18) Не... Dec 26 2008, 14:47    Tanya Цитата(MSprut @ Dec 26 2008, 17:47) Похож... Dec 26 2008, 14:58     MSprut Цитата(Tanya @ Dec 26 2008, 16:58) Похоже... Dec 26 2008, 15:00      Tanya Цитата(MSprut @ Dec 26 2008, 18:00) Думае... Dec 26 2008, 15:33       MSprut Цитата(Tanya @ Dec 26 2008, 17:33) В этом... Dec 26 2008, 15:41        Tanya Цитата(MSprut @ Dec 26 2008, 18:41) Две. ... Dec 26 2008, 15:48         MSprut Цитата(Tanya @ Dec 26 2008, 17:48) Никак ... Dec 26 2008, 15:55    evgeny_ch Цитата(MSprut @ Dec 26 2008, 18:47) Похож... Dec 26 2008, 15:14     MSprut Цитата(evgeny_ch @ Dec 26 2008, 17:14) Вы... Dec 26 2008, 15:24      evgeny_ch Цитата(MSprut @ Dec 26 2008, 19:24) Все, ... Dec 26 2008, 15:37  Maik-vs Цитата(MSprut @ Dec 26 2008, 16:41) L298 ... Dec 26 2008, 14:34
2 страниц
1 2 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|