Свежие обсуждения
Микроконтроллеры

ПИД-регулятор на микроконтроллере

1 2 5

Так я же говорю, у меня не все так просто. У меня сопротивление нагрузки (аккумулятора) может лежать в широких пределах, ток тоже может меняться от 80 мА до 1,62А - в зависимости от выбранного режима (у меня стабилизатор ТОКА а не напряжения), выходное напряжение может быть от 0,8 до 1,5 В.

 

Леха: Щас сделано что-то типа пропорционального регулятора, но он не устойчив.

Пожалуй Вам хватит ПИ регулятора. Предсказывать будущее при зарядке аккумулятора - дело не благодарное.

 

Кароче, посмотрел зависимость тока от значения регистра OCR и вот что получилось:

Красный график - это ток.
Если OCR=50, 1 единица ШИМа соответствует изменению тока примерно на 5 мА. При OCR=50 ток около 280 мА, дальше наклон прямой резко изменяется и точность уже составляет 80 мА на 1 единицу ШИМа.
А точность измерения тока у меня 3 мА. Выходит, я никогда не смогу получить такую точность на больших токах и стабилизатор всегда будет "дергаться" с амплитудой как минимум 80 мА.

 

Леха: Выходит, я никогда не смогу получить такую точность на больших токах и стабилизатор всегда будет "дергаться" с амплитудой как минимум 80 мА.

Ну и пусть дёргается, усредняйте величину зарядного тока да и всё... Какая разница... аккумулятору всё равно будет ток чисто постоянным или будет дёргаться на 80мА. Есть вариант перейти на 10разрядный ШИМ но тогда у вас частота упадёт...

 

10-разрядный ШИМ не выдет - у меня 4 канала, а там некоторые таймеры урезанные и не позволяют делать произвольную разрядность ШИМа, да и частоту меньше 30 кГц опускать нельзя - дроссели звенеть начнут и все такое... Щас у меня 31,25 кГц.
Кароче, щас сделал так:

dI=(charge_current[N_canal-4]-Current_ADC); //Вычисляем ошибку
if(charge_current[N_canal-4]>CURRENT_mA(220))
PWM=PWM+(dI>>5);
else
PWM=PWM+(dI>>2);

Это типа учитывается перегиб на графике, чтобы на малых токах точность не терять.
Пойду прошивать...

 

Леха: Щас у меня 31,25 кГц.

А какая величина индуктивности дросселя?

 

90 мкГн

 

Леха: 90 мкГн
Вот от индуктивности и надо плясать. По тому , что сам шим является по сути источником тока , а не напряжения,
при условии , что на массу от дросселя стоит диод. Ведь дроссель , на частоте преобразования имеет довольно
большое индуктивное сопротивление .

 

По поводу ПИД регулятора. Если не брать простую форму (удобную для вычисления но неудобную для подбора коэффициентов АБС и не удобную для понимания. Для более подробной информации обратитесь к аппноуту AVR221: Discrete PID controller от Атмела, там есть формула ПИД регулятора:
u(n)=Кп*е(n)+Ки*S([k= 0 до n] от e(k)) + Kд*(y(n)-y(n-1))
Также можно почитать микрочиповский аппноут AN964.
В этой формуле u(n) - выход регулятора на n-ом шаге, е(n) - ошибка на n-ом шаге? y(n) - значение регулируемой величины на n-ом шаге. Кп, Ки, Кд - соответственно коэффициенты пропорциональной, интегральной и дифференциальной частей.
То что Вы говорите (насчёт ненулевого нулевого выхода ШИМ) будет обеспечичиваться интегральной частью. Её ещё часто называют смещением (bias), обязательно ограничивают сверху и снизу обычно на уровне диаппазона регулирования или чуть больше.
Есть ещё одна формула, о которой я говорил в начале:
ControlOutput = ControlOutput + ControlDifference[0] x PIDCoefficients[0] + ControlDifference[1] x PIDCoefficients[1] + ControlDifference[2] x PIDCoefficients[2]
Где ControlDifference[n] - разница между уставкой и текущим значением параметра, т.е. ошибка регулирования (dX) на шаге n, где n=0 принимается за текущий щаг. Коэффициенты рассчитываются так:
Modified PID coefficients from regular PID form to filter-like PID implementation:
PIDCoefficients[0] = Kp + Ki + Kd
PIDCoefficients[1] = -Kp - 2Kd
PIDCoefficients[2] = Kd
Эта формула более удобна для расчётов, но менее удобна для контроля и понимания, т.к. в ней связаны уже все каналы воедино. Формула очень удобна на MACах.
Желательно чтобы период ПИД регулятора был на порядок меньше самого быстрого звена в контуре регулирования, точнее самой быстрой постоянной времени. В крайнем случае быстрее этой величины.

По поводу того, что не хватает битов ШИМа, можно сделать так, добавив ещё пару бит ШИМ:
Допустим выход регулятора Y,Возможное ближайщее значение ШИМ y, разница между возможным ближайшим значением ШИМ и Y обозначим как DY. DY может принимать значения от -2 до +2.
Разобьём период между двумя выборками АЦП на 4 цикла 0 1 2 3
DY 0 1 2 3
-2 y-1 y y-1 y
-1 y y-1 y y
0 y y y y
+1 y y+1 y y
+2 y+1 y y+1 y
В зависимости от знака и значения дифференциальной составляющей можно перемещать слоты (y+-1) левее или правее в средних строчках.
Если же период АЦП и период ШИМ совпадают, то особого смысла заморачиваться нет - регулятор сам всё отрегулирует. если правильно настроен.
По данной аналогии можно увеличить количество циклов разбиения и добиться ещё большей точности.

 

Но стабилизатор все равно дергаться будет. Залил я прошивку, явного возбуждения вроде нет, но за счет интегральной составляющей, которая накапливает ошибку за достаточно длительное время, стабилизатор дергается +/- на 1 шаг ШИМа, который, как оказалось, чуть ли не 150...200 мА (!). Это хорошо видно при включении заряда, когда ток плавно растет в течение первых минут. И видимо, от этого никуда не уйти...
Правда была такая мысль: сделать так, чтобы он дергался с такой скоростью, что за счет индуктивности и емкости ток не успевал бы изменяться и эти неровности сглаживались бы, но пока не вышло...
Кстати АЦП у меня работает на минимальной скорости, чтобы была максимальная точность при измерении напряжений на аккумуляторах.