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

AVR начинающим - вопросы и ответы

1 14 68

chav1961, гуляет скорее всего не от отсутствия задержки, а от шума АЦП.
Есть два пути:
1. Предварительно фильтровать результат АЦП (например, бегущее среднее по 4 замерам)
2. Ввести допуск в условие сравнения, типа:

if (Vdec>ZNACH_STAB+2) {
...

if (Vdec<ZNACH_STAB-2) {

Первый вариант немного снизит быстродействие, второй - точность установки.

Ну или городить полноценное PID-регулирование

 

От шума, конечно, гуляет, но ПИД-регулятор в любом случае делать надо

 

У меня в программе для АЦП стоит ФНЧ первого порядка.
А когда сделал вот так:
if (Vdec>ZNACH_STAB) {
if (OCR2!=0) {
delay_ms(5);
OCR2--; };};
То есть ввел задержку, то максимальная нестабильность тока упала до 50-70 мА
Интересно какого максимального результата можно добиться

 

Интегральную составляющую можно реализовать суммированием, что вы и делаете в вышеприведенных примерах. Только желательно разрядность увеличить в этом случае.
Т.е. OCR++ и OCR-- и есть своего рода интегральная составляющая. Наклон (постояннуя времени) можно изменить плюсуя и отнимаю не 1 а другое число. Но чтобы изменять на значение, меньше 1, надо увеличивать разрядность (При 1 байте 1 =1/256, при двух байтах = 1/65536 ).
Пропорциональный регулятор, это если напряжение ОС сразу оцифровывать и по нему выставляь управляющее воздействие напрямую(пропорционально, с каким-то коэф. усиления).
Т.е. в вашем случае, чтобы увеличить постоянную времени интегратора надо лидо суммировать с меньшим числом(чтобы было меньше 1/256 надо увеличивать разрядность) либо вводить задержку.
Т.е. у вас фактически ПИ-регулятор. Надо только подобрать коефициенты. Недостаток ПИ (без Д-составляющей) снижение быстродействия(нету оперативной реакции на резкое воздействие дестабилизации)

 

Да, но уменя используется OCR2
Т.е. 8 битный счетчик у которого макс. значение это 255
Так что обойдемся задержкой

 

shemmer: У меня в программе для АЦП стоит ФНЧ первого порядка.

По моим наблюдениям, этого часто бывает недостаточно. Всё равно шумит.

shemmer: А когда сделал вот так:

Вместо задержки можно просто пореже вызывать эту процедуру. Но если будет КЗ, то за 5мс всё сгорит нафиг

shemmer: 8 битный счетчик у которого макс. значение это 255

Можно расширять не сам счётчик , а другую переменную, а в OCR грузить её с урезанием нескольких битов. Типа:

unsigned int reaction;
if (Vdec > ZNACH_STAB & reaction!=0xFFFF) reaction++;
else if (Vdec < ZNACH_STAB & reaction) reaction--;
OCR2 = reaction >> 2;

Здесь уже 9 бит. Если

OCR2 = reaction >> 4;

то 10.

 

Нет все-таки с задержкой нестабильность до 200мА,
да еще и реакция медленная
Сделал как советует антоха с увеличением разряда что-то не получилось, ток уходит в максимум
Прилепил исходник, посмотрите как время будет.
А вообще полноценное ПИД регулирование кто-нибудь реализовывал программно для своих нужд?

126456.rar

 

А ток-то какой?

Я перепутал reaction++ и reaction-- . Потому и насыщается.
Ты поправил, но не полностью Надо:

if (Vdec > ZNACH_STAB & reaction!=0) reaction--;
else if (Vdec < ZNACH_STAB & reaction!=0xFFFF) reaction++;

А сравнения
if (OCR2!=0)
и
if (OCR2!=255)
уже не нужны.

Ещё замечания. ФНЧ не работает, prev_res нужно объявить как static.

delay_ms(7) в прерывании от АЦП как-то не очень смотрится. Ну и надо как-то опрос АЦП сделать более равномерным.

А про ПИД пока не думай, его мало написать, его ещё настраивать потом надо

 

Не что-то не получается.
Ток прыгает.допустим ставлю ZNACH_STAB =0.5 А.
На индикаторе 0.1-0.2 Тестер показывает броски при ПОСТОЯННОЙ НАГРУЗКЕ от 0.25 до 1 и выше.

 

shemmer: ставлю ZNACH_STAB =0.5 А.

Ок.

shemmer: На индикаторе 0.1-0.2

Это в смысле, измеренный внутри устройства ток?

ФНЧ исправил? Задержку из прерывания убрал? Кнопки в это время не нажимаются?