Перейти к содержанию

Пид Регулятор


ukr823f

Рекомендуемые сообщения

Добрый день товарищи. Так как люблю делать всякие поделки на микроконтроллерах, мой товарищ попросил меня сделать регулятор холостого хода для его автомобиля. Авто - мерседес w124, в котором для регулирования холостого хода применяется моментный регулятор холостого хода (обычный клапан который с помощью ШИМ открывается от 0 до 100%) . То есть подали на клапан 50% ШИМ - клапан открылся на 50%. Начал искать алгоритмы, и тут без ПИД регулятора никак не обойтись. Никогда с ним не имел общения, но вот почитал - всё хорошо и удобно - но есть ньюансы. Я нашёл пример реализации ПИД регулятора для регулирования температуры нагревателя воды. Это простейший пример, но он впринципе отображает работу. Но мне нужны дополнительные условия, которые не могу определиться как вставить в код. Итак по порядку:

Для реализации проекта будет использован МК Atmega8 работающий на частоте 8Мгц. К нему подключеныж

1)Концевик педали газа (замыкаетя при отпускании педали газа - ну типа у нас холостой ход)

2)Датчик температуры - подключённый к одному входу АЦП

3)Датчик оборотов (считывает текущие обороты

Ну и выход - ШИМ на электроклапан.

Теперь - по оборотам холостого хода. Они у нас задаются табличкой (массивом) в зависимости от температуры мотора. Допустим обороты будут на

0гр- 1600, на 30 гр - 1200об\мин, на 60гр - 1000об\мин, на 80 гр - 800 об\мин (Число точек конечно будет больше, это я просто для примера привёл)

И вот вопрос. Где должны быть расположено условия включения регулировки оборотов холостого хода. Условие регулировки такое)

if(концевик замкнут на массу) {то выполняем регулировку холостого хода на основе ПИД), else (ничего не делаем).

В скачанном примере у нас всё обрабатывается через равные промежутки времени в прерывании. ПИД то и должен работать через равные промежутки времени. Это что, каждый раз из главного цикла программы вызывать функцию обработки ПИД? - но тогда я так понимаю у нас точно не выйдут равные промежутки времени.

И второй вопрос - мы же должны при всём этом ещё и считывать показания АЦП с датчика температуры - чтобы на её основе устанавливать нужные (заданные) обороты от температуры. Где эту функцию распологать в коде?

Вот код примера работы ПИД-регулятора для нагревателя.

/*****************************************************
Chip type		 : ATmega8
Program type	 : Application
Clock frequency	 : 1,000000 MHz
Memory model	 : Small
External RAM size : 0
Data Stack size	 : 256
*****************************************************/
#include <mega8.h>
// требуемая температура в градусах
#define Target 125
// коэффициент пропорционального усиления
#define Kp 30				 // 30 - оптимально	
// коэффициент интегрального усиления
#define Ki 0.3					 // 0.3 - оптимально
// коэффициент дифференциального усиления
#define Kd 90				 // 90 - оптимально	
// максимальная сумма ошибок
#define MaxIntegral 1000	 // 1000 - оптимально
volatile signed int Error;		 // отклонение измеренной величины от заданной
volatile signed int PrevValue;	 // предыдущее значение измерения
volatile signed int P_Term;	 // пропорциональный компонент
volatile signed int I_Term;	 // интегральный компонент
volatile signed int D_Term;	 // дифференциальный компонент
volatile signed int Out;			 // управляющее воздействие
volatile signed int Integral;	 // сумма ошибок

// Timer 0 overflow interrupt service routine
// Приблизительно 0.1 сек
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x9E;
ADCSRA|=0x40;
while(ADCSRA & 0x40);
Error = Target - ADCH;
P_Term = Kp * Error;
if (Integral > MaxIntegral) {Integral = MaxIntegral;}
else if (Integral < - MaxIntegral) {Integral = - MaxIntegral;}
else Integral += Error;
I_Term = Ki * Integral;
D_Term = Kd * (PrevValue - ADCH);
PrevValue = ADCH;
Out = P_Term + I_Term + D_Term;
if(Out > 0xFF) { OCR2 = 0xFF; }
else if(Out < 0) { OCR2 = 0;}
else OCR2 = Out;
}
void main(void)
{
// Port B initialization
PORTB=0x00;
DDRB=0x08;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 0,977 kHz
TCCR0=0x05;
TCNT0=0x9E;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 0,977 kHz
// Mode: Phase correct PWM top=FFh
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x63;
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// ADC initialization
// ADC Clock frequency: 62,500 kHz
// ADC Voltage Reference: Int., cap. on AREF
// ADC1 - PC1
ADMUX=0xE1;
ADCSRA=0x87;
#asm ("sei")
while (1)
 {
 };
}

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Идёт дикая раскачка. обороты сбавляет, нужное число оборотов пролетаем, потом, начинаем нагонять, опять пролетаем. Если и стабилизируется то очень оченб долго. В основном просто глохнет иза за инерционности системы. Поэтому и ПИД нужно реализовывать....

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

чтобы небыло раскачки, надо увеличивать постоянную времени регулирования. То есть ввести задержку с момента считывания показаний датчиков, до момента выдачи управляющего воздействия.

Но это будет все равно слишком по деревенски. Там еще желательно бы получать дифференциал изменений показаний датчиков и в зависимости от его значения изменять пропорциональность управляющего воздействия.

но это тоже по деревенски

Надо бы еще интегрировать сигналы обратной связи для оценки правильности пропорций управляющих воздействий

объяснить на пальцах как правильно спроектировать пид регулятор весьма непросто. Читать, читать и еще раз читать. Потом думать и писать

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Про раскачку я писал , что она есть при работе без ПИД регулятора.

Поэтому и хочу сделать устройство с ПИД регулятором. Весь алгоритм ПИД регулятора описан в коде выше. Только туда ещё нужно добавить таблицу зависимости оборотов холостого хода от температуры, а также условие проверки замыкания концевика холостого хода.

Вот немогу понять куда в коде эти вот вычисления вставить, чтобы не мешать вычислениям ПИДа. Прикинул немного. В основной код вставляем считывание температуры мотора с АЦП. А подсчёт оборотов будем делать по приходящим импульсам на ножку INT0. И вот как раз с подсчётом оборотов самая проблема. Нам то нужен определённый промежуток времени для того чтобы мы насобирали некоторое количество импульсов. Допустим мы будем собирать импульсы за 500мсек. То есть если за 500мсек у нас пришло 3 импульса на INT0,, то значит у нас 360 оборотов в минуту (3имп * 120(чтобы посчитать за минуту) = 360 об\мин).

Для ПИД я так понимаю 500мсек это большой промежуток времени. Так как подсчёт импульсов должен вызываться раз в 5 чаще чем расчёт ПИД регулятора....

Если мы алгоритм ПИД будем обрабатывать в том же прерывании от таймера, в котором и будем считать обороты полученные за 500мсек, то у меня такое чувство, пока мы всё это дело просчитаем - у нас уже начнётся следующее прерывание....

Изменено пользователем ukr823f
Ссылка на комментарий
Поделиться на другие сайты

Я предлагал не считать обороты. Вот моя логика --

Вы просто выставляете шим на 20 процентов, при этом двигатель крутится примерно

1200 об. Контролируете температуру. Она становится 60 гр.

Вы меняете шим на 15 процентов. Обороты падают до 1000.

При достижении 80гр, снижаете шим до 10 процентов.

Цифры относительные, подбираются на машине.

Изменено пользователем croc19
Ссылка на комментарий
Поделиться на другие сайты

Не выйдет так. А невыйдет потому что, двигатель инерционная система. И если при простом стоянии на месте и холостом ходу, повышать ШИМ, то будет конечно регулировка оборотов и они будут держаться на заданном уровне. А вот если мы не едем на 3000 оборотах, бросаем газ. Целевые обороты у нас допустим 1000 оборотов. И мотор сбрасывает обороты и пролетает их (хотя и мы шим на клапане холостого хода утсановлен для поддержания 1000) , потом начинает догонять и так по кругу..... При ПИД регулировании это отсутствует.

Ссылка на комментарий
Поделиться на другие сайты

Вы попробуйте. Я не могу понять, почему при выставленном клапане и

соответственно примерно стабильной смеси, двигатель вдруг

начнет гулять по оборотам.

Ссылка на комментарий
Поделиться на другие сайты

Потому что - двигатель инерционная система. И мотор, сбрасывающий резко обороты с 4000 об\мин до 1000 об\мин епе сможнт остановиться резко на 1000???? Попробуйте раскрутить 10кг маховик до 4000 об\мин, а потом его з секунду оттормозить до 1000 нажатием с одним и тем же усилием прикладываемым для торможения и попасть ровно в 1000 оборотов...

Как вы думаете - для чего всё это в ЭБУ Январь встраивать все эти параметры??

Вот если интересно - https://www.drive2.ru/b/194560/

Изменено пользователем ukr823f
Ссылка на комментарий
Поделиться на другие сайты

Нет, нет, нет и ещё раз нет!!

Ну по теме можете писать?? Никогда так двигатель не будет себя вести, запомните это. Почитайте ссылку, потом расскажете как всё просто было сделать, а эти инженеры взяли и засунули в ЭБУ -2 (ДВА) - ПИД регулятора для стабилизации холостого хода! Всё. Если есть что по теме, жду конструктивного разговора. А разговоры о том будет или небудет мотор колебаться, давайте не будем обсуждать. Разговор тут о алгоритме на основе ПИД.

Ссылка на комментарий
Поделиться на другие сайты

Давайте потеоретизируем. Клапан небольшой и скорость реакции думаю

небольшая. Допустим 1-5 мС. Вы хотите управлять им сигналом, который измеряете

500мС. Это полсекунды. При однократном измерении.

Нажмите на газ. Что будет с оборотами за полсекунды?

Отпустите газ. Обороты упадут быстрее, чем полсекунды. Соответственно полсекунды

вы будете считать изменяющиеся обороты. И получите не точные обороты, а усредненные

за полсекунды. И этими значениями вы будете управлять быстрым клапаном.

Вот это будут качания.

Ссылка на комментарий
Поделиться на другие сайты

Вообще то для этого ПИД и придуман. Чтобы не было качель.

В среднем время набора оборотов - за 1 миллисекунду - 6 оборотов коленвала. Так что всё разгоняется и тормозится очень и очень быстро.

Итого 6000 об\мин за 1секунду.

Изменено пользователем ukr823f
Ссылка на комментарий
Поделиться на другие сайты

Об этом и писал.

Вешаете сигнал от датчика оборотов коленвала или распредвала на

внешнее прерывание. По нему запускаете таймер для измерения

оборотов двигателя. Второй таймер работает на клапан в режиме шим.

АЦП занимается температурой. Программа сравнивает реальные обороты

с заданными в зависимости от температуры и меняет коэффициент шим.

Ссылка на комментарий
Поделиться на другие сайты

Ну и представьте код,

Следим, смотрим всё хорошо..

Обороты на момент отпускания педали газа - 4000. Обороты холостого хода нужные нам - 1000.

Ну всё педаль бросили, обороты полетели вниз. Клапан холостого хода закрыт ибо обороты то больше чем нам нужны , соответсвенно ШИМ=0.

Итак обороты считываемые у нас., достигают нашей 1000об\мин (достигают за 0,6секунды)... Период измерения обортов у нас 0,5 секунды. Итого, за 100мсек, до того чтобы обороты достигли 1000, мы устанавливаем наш ШИМ для работы мотора на 1000 оборотов. То есть открываем клапан допустим на 25% (25% ШИМ). Но что это???? Мотор как летел вних с огромной скоростью - так и летит. , и уже пролетел нашу 1000 об\мин. проходит ещё 0,5 секунды (и мы замеряем обороты (в реалии мотор заглох уже давно), но мы представим что у нас обороты опустились до 500 об\мин... Мы даём команду срочно набрать обороты - ШИМ - 100% , клапан холостого хода открыт.... Мотор погнал набирать обороты, хотть и с меньшей скоростью, но мы опять вылетаем за 1000 об\мин но только на 300 об\мин выше и так далее пока не устаканимся. Ну наверное раза с десятого мотор может и успокоиться....

Но если я такое покажу людям - сначала они будут молотком разбивать устройство. Что будет дальше - страшно представить....

Изменено пользователем ukr823f
Ссылка на комментарий
Поделиться на другие сайты

Обороты меряем временем между сигналами с датчика с помощью

таймера. Желательно, чтоб на один оборот, датчик выдавал

несколько сигналов на оборот, тогда время измерения оборотов

кратно уменьшается. При одном сигнале на оборот при 1000 оборотах

время измерения составит 1сек/1000/60.

Программу кроме Вас , врят ли кто писать будет. И обижаться на это не нужно.

Просто включаем голову, пишем и выкладываем с вопросами почему не

так работает. Тогда помогут. Можно по кускам. Сначала кусок измерения

оборотов, кусок измерения температуры и т .д.

Ссылка на комментарий
Поделиться на другие сайты

Я програму напишу - это не проблема, може кому и поможет ещё. Просто для меня сейчас проблема, как проще посчитать обороты. За какой промежуток времени это делать, учитывая сорость изменения оборотов коленчатого вала. Мы то должны Допустим считать наш ПИД алгоритм раз в 0,5 секунды, а получать текущие обороты раз в 0,4 секунды. И нам этого короткого промежутка времени должно хватать для выявления минимальных текущих оборотов. Допустим выберем минимальные обороты которые наш контроллер должен понмать - это 200 об\мин. Максимальные это 8000 об\мин. С датчика мы получаем 1 импульс за 1 оборот коленвала . (4х цилиндровый мотор с попарно-параллельным зажиганием . Где за один оборото искра проскакивает в двух цилиндрах - в одном поджигая смесь, во втором в холостую)

Итого выходит. 200об\мин = 3,33 об\в секунду. Значит минимальное число импульсов ща секунду пример 3. Тогда за пол секунды у нас выйдет 1,5 импульса. Не мало ли это для расчёта? Учитывая что мы не просто тахометр делаем - а систему которая должа ещё что то регулировать.

Ссылка на комментарий
Поделиться на другие сайты

Сейчас уже иду бай-бай.

Создайте проект в Протеусе . На вход можно подавать сигналы с генератора,

а на выходе осцилом смотреть шим. И начните со связки обороты --шим,

через ПИД регулирование.

По измерению оборотов. Датчик выдает 1 импульс на 1 оборот. Итого

1000/60=16,6 об/сек. 1/16,6=62,5мС. Т.е. если между импульсами время

62,5мС, то двигатель крутит на 1000 об. Измеряем конечно не в мС,

а числом в таймере, которым это измеряем.

Приходит импульс с датчика, срабатывает перерывание INT0 (INT1), в нем запускаем

обнуленный таймер и выходим. Таймер фоном считает. Прога занимается другим.

ШИМ автоматом выдается на ножку. Снова приходит импульс датчика.

Прерывание. Считываем значение таймера, обнуляем таймер и запускаем.

Выходим из прерывания. Имеем значение оборотов в попугаях. Переводить в

другие величины не нужно. Исходя из количества попугаев с помощью ПИД

регулируем значение ШИМа. А тут снова сигнал с датчика.... и так по кругу.

Ссылка на комментарий
Поделиться на другие сайты

Ок, буду пробовать и походу дела задавать вопросы

А с каким предделителем тогда таймер лучше использовать? Чтобы он быстрее или наоборот медленнее переполнялся?

Допустим Мега 8 будет работать на частоте 8Мгц. Для расчётов будем использовать таймер 1. Для ШИМ будем использовать таймер 2.

Таймер 1 будем использовать например с делителем 8. Итого получим 8мгц\ 8 = 1мГц \ 65536 = каждое прерывание будет вызываться через 15 мсек.

А каждый тик равен 1 микросекунде. Этого будет достаточно - или нужно больше меньше?

Немного вот не пойму с этого места. Допустим у нас 100 об\мин - периоду между импульсами - 600 мсек. Таймер у нас переполниться за 600мсек - 40 раз.

600мсек\ 15мсек(время одного переполнения)

И как же тогда вычислить эту длину периода учитвая наше значение счётчика тиков + переполнения (40 штук прошло)

Изменено пользователем ukr823f
Ссылка на комментарий
Поделиться на другие сайты

Перечитал это уже 3 раза. Очень много полезного и доступно написано. Но как я указывал, проблема сейчас не ПИДе, а в алгоритме подсчёта оборотов и передаче его в ПИД. Так как для правильной работы, Подсчёт оборотов должен быть произведён раньше, чем будет просчёт алгоритма ПИДа.

Ссылка на комментарий
Поделиться на другие сайты

Замеряй обороты каждые пол оборота коленвала, как раз учтешь работу каждого цилиндра (если их 4), если будет избыточно, то как раз можно будет фильтр применить для сглаживания пульсаций, а пульсации будут, цилиндры по разному работают. Непонятно, что за датчики и какой сигнал от них.

Нашел по датчику

С датчика мы получаем 1 импульс за 1 оборот коленвала . (4х цилиндровый мотор с попарно-параллельным зажиганием . Где за один оборото искра проскакивает в двух цилиндрах - в одном поджигая смесь, во втором в холостую)

но, что-то не сходится, каждые пол оборота должен быть импульс.

Изменено пользователем fog
Ссылка на комментарий
Поделиться на другие сайты

Считывание оборотов будет с катушки зажигания. Поэтому каждые пол оборота коленвала не сможем проверять обороты. Минимум через 1 оборот. Сигнал приходит - за 1 оборот коленвала - 1 импульс на катушку зажигания.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...