| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
ПИД регулятор на AVR
20.01.2009, 20:28
|
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
ПИД регулятор на AVR
Привет.
Ищется исходник на асме или сишке и если есть - описание работы ПИД на программном примере (алгоритм).
Другими словами - зная ПИД не могу его закодить. Не хватает инфы по конкретным переменным. В матлабе собрать и настроить не проблема, а вод сделать прогу - немогу  .
Зарание спасибо.
|
|
|
|
20.01.2009, 21:40
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
ПИД регулирование реализовано в апноутах по электроприводу - номера на AVR49x
Там они в низу - http://avr123.nm.ru/07.htm
=================
Однако ИМХО в апноутах http://Microchip.com растолковано лучше гораздо !
На картинке там
http://www.roboforum.ru/viewtopic.php?f=2&t=1070
Вы можете увидеть в каких апноутах микрочип есть описание PID.
=================
AN696 Серво привод с энкодером и ПИД регулированием в примерах PROTEUS ! Причем работает.
=================
Я тоже начал писать про PID регулирование.
http://pidcontrol.narod.ru/
PID ПИД регулирование для начинающих - краткое толкование.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
20.01.2009, 22:42
|
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Нашёл вот что:
Правильно ли реализованная идея ПИД??
|
Код:
|
signed int pid_control(signed char setpoint, signed char currentpoint)
{
static signed int last_error;
signed int P;
signed int D;
static signed int I;
signed int PID;
P = (setpoint - currentpoint);
I = (I + (setpoint - currentpoint) * INTERVAL);
D = (((setpoint - currentpoint) - last_error) / INTERVAL);
last_error = setpoint - currentpoint;
PID = (Kp * P) + (Ki * I) + (Kd * D);
return (PID);
} |
|
|
|
|
21.01.2009, 03:05
|
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Да, спс за помощь.
Разобрался.
Проблемка в тому ка проверить его работу.
Хочу сначала проверить его работу на конкретном случае (например в екселе или на Сшарпе) а дальше уже писать на асме. Ибо может возникнуть ситуация когда будет ошибка в коде, а поймать ее (узнать то, что неверно работает ПИД) будет невозможно, если на выходе не будет полный бред...
Какая методика проверки работы ПИД???
По идеи управления он должен выдавать перерегулирование а дальше выход на установленную величину. Проблемка в том, как можно портестить его работу....
Есть идея в матлабе собрать стандартную схему, поставить как объект управления инерционное звено и запустить. Хотя с другой стороны можно и сделать в екселе (все звенья + обратная связь).
Подход верен?
|
|
|
|
21.01.2009, 08:59
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Подход верен, но в PROTEUS уже собрано все.
ПИД должен достаточно быстро устанавливать заданый параметр и колбасится в нужных вам допусках.
От ваших потребностей все зависит.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
22.01.2009, 00:50
|
|
|
Временная регистрация
Регистрация: 13.07.2006
Сообщений: 90
Сказал спасибо: 10
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Ещё неплохо бы добавить ограничение по интегральной части и по выходу ПИДа... ну и выполнять ПП через строго равные промежутки времени и за определенный квант времени... иначе выкинуть интегральную и диф. части ... правда в приведенный код особо не вглядывался
|
|
|
|
22.01.2009, 02:47
|
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
И так....
Сидю колупаю...
Написал код на делфи (меньше места занимает при инстале).
Возникло куча вопросов.
Рассмотрим методику и мой подход к решению вопроса о наглядности ПИД регулятора.
Знание в ТАУ есть немного (теория автоматического управления). Просьба прочитать и исправить то что я возможно неправильно написал (ошибаюсь в подходе).
И так, приступим.
Взял звено инерционное.
Формула вот:

Дальше замкнул систему по обратной связи и подал на вход единицу (сори, схему не выложу, но по идее ниже похожая схема)
Для делфи получил формулу:
|
Код:
|
B:=0.2;
for i:=1 to 2000 do
begin
A:=i/10;
f[i]:=1-(1/A)/(B+1/A);
end; |
А в даном случае есть временной переменной (Т на формуле).
Получил график запаздывания - график медленно набирает значение.
Дальше постал вопрос о ПИД регуляторе.
Взял по инфе выше описал его формулу.
Сделал схему (Пид регулятор включен последовательно с инерционным звеном, а именно перед ним), дальше обратная отрицательная связь.

В схеме дальше стоит инерционное звено, дальше обратная отрицательная связь на вход ПИД.
По теории ТАУ передаточные функции должны умножатся (при параллельном подключении - суммироватся) (прав ли я??)
Для делфи получил вот что:
|
Код:
|
procedure TForm1.Button1Click(Sender: TObject);
var f2:array [1..2000] of double;
Kprop, Kinteg, Kdef:real;
i: integer;
t_step, error, integral, setpoint, currentpoint, pre_error, pid: real;
min, max: real;
A,B:real;
begin
//------------------------------------
t_step:=0.1;
setpoint:=1;
min:= -0.3;
max:= 0.3;
//------------------------------------
Kprop:= StrToFloat(Form1.Edit1.Text);
Kinteg:= StrToFloat(Form1.Edit2.Text);
Kdef:= StrToFloat(Form1.Edit3.Text);
for i:=1 to 2000 do
begin
error:= setpoint-currentpoint;
A:=i/10;
B:=0.1;
//---------------------------
if (min ‹ integral) then
if (integral‹ max) then
integral:=integral+error;
pid:=Kprop*error+Kinteg*integral*t_step+Kdef*(erro r-pre_error)/t_step;
f2[i]:=1-pid*(1/A)/(B+1/A);
//currentpoint:=f2[i];
pre_error:=error;
end;
Chart1.Series[1].AddArray(f2)
end; |
В результате получилось непонятно что.... Без пререригулирования и "начало" воздействия идет не с нуля.
Где промазал?
Вопрос возник с вычислением ошибки. Что в данном случае (например температура) играет "currentpoint"?? Можете пояснить как его получить в данном контексте?
Да, на вход подается единица (единичный скачек):
f2[i]:= 1-pid*(1/A)/(B+1/A);
|
|
|
|
22.01.2009, 03:28
|
|
|
Временная регистрация
Регистрация: 13.07.2006
Сообщений: 90
Сказал спасибо: 10
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Сразу глюк - огранич интегратор уровнем выхода всего ПИД регулятора. Завтра пиво из мозгов вылью  - гляну дальше в чем бока... Вообще то для полного понимания надо расписать в цифре и перейти к конечно-разностным уравнениям - тогда все само собой сложится.. просто башка ваще не варит сейчас...
|
|
|
|
22.01.2009, 14:26
|
|
|
Прописка
Регистрация: 14.11.2007
Сообщений: 150
Сказал спасибо: 3
Сказали Спасибо 47 раз(а) в 43 сообщении(ях)
|
Так, давайте сначала.
1) Я правильно понял, что объект управления у Вас описывается апереодическим звеном первого порядка?
2) К этому объекту управления Вы строите ПИД регулятор?
Если ответ да на все вопросы, то ПИД регулятор городить для системы 1-ого порядка совсем не обязательно. Хватит и ПИ регулятора, который обеспечит нулевую установившуюся ошибку по выходной величине. Посчитать его можно методом стандартных переходных характеристик. Уравнение типа Сильвестра можно решить в матлабе с помощью функции sylv.
|
|
|
|
22.01.2009, 15:09
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,552
Сказал спасибо: 75
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
|
Сообщение от svad0
|
|
1) Я правильно понял, что объект управления у Вас описывается апереодическим звеном первого порядка?
|
Вот такой простой и ясный каждому вопрос !
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
ПИД-регулятор и Proteus
|
oleg_harp |
Микроконтроллеры, АЦП, память и т.д |
16 |
01.07.2009 23:37 |
|
ПИД регулятор
|
masterpc |
Производственное оборудование |
14 |
05.03.2007 16:24 |
|
ПИД регулятор на AVR
|
mishutka |
Микроконтроллеры, АЦП, память и т.д |
40 |
31.12.2006 03:11 |
|
Пид-регулятор и AVR
|
French |
Микроконтроллеры, АЦП, память и т.д |
1 |
06.10.2004 23:30 |
Часовой пояс GMT +4, время: 17:19.
|
|