Цитата(AndryG @ May 8 2008, 14:01)

последний затык был ... выбор времени интегрования ... через какие промежутки читать температуру? сколько выборок использовать в интеграторе? и т.д.
Все временные параметры нужно выбирать исходя из инерционности всей системы.
Основные проблемы при реализации ПИ-, ПИД-регуляторов, это механизм
антинасыщения, и собственно подбор коэффициентов. Вот небольшой кусок
из фидошной эхи RU.EMBEDDED, где простым языком описана реализация
ПИ-регулятора на МК :
==============================================
Изложенный ниже (1)алгоритм не мой, и уже публиковался в эхе, но без привязки к
системе Физическая величина-АЦП-процессор(2).
(1)
И так:
Uz - задание регулятора , code
Uos - обратная связь , code
e=Uz-Uos - рассогласование , code
Ky - коэффициент усиления , byte
Ti - постоянная времени интегрального звена , sec
t - период опроса АЦП , sec
E=E+e - "виртуальный"конденсатор интегрального звена
Итоговая формула ПИ регулятора:
Uout=Ky*(e+Е*t/Ti)
(2)
Для оптимизации работы параметры Uz, Uos, e, Uout - это числа с разрядностью
как у АЦП (8, 10, 12, 16 ... и т.д. бит) процессору ведь всё равно, что он
считает, 0.001В(Вольт) или 0х0001 (только для 0.001 неплохо было бы иметь FPU).
Коэффициент усиления пусть будет целым однобайтным числом (ни разу на практике
не встречал коэффициент больше 100)
t/Ti вычисляются заранее и представляют собой число с фиксированной точкой,
размерность которого зависит от максимальной Ti которую ты планируешь
использовать в системе регулирования
Пример:
Частота опроса АЦП - 14500 Гц
т.е. t=1/14500=0.00006897 сек
максимальная Ti = 3 сек
t/Ti=0.00002299
Перевод в число с фиксированной точкой с точностью 4 знака после запятой:
0.00002299*0х10000 =1.5066.. полученная целая часть и есть значение с
точностью 4знака после запятой (0х10000 - кл-во нулей после 1 определяет
точность) после чего можно записать, что t/Ti=0.0x0001 - если ты не собираешся
использовать постоянные времени меньше 0.001 сек то смело можешь считать что
полученная константа - двухбайтовое беззнаковое число 0х0001.
Если Ti будут небольшими (в данном случае меньше 0.00006 сек) то придётся
учитывать и целую часть числа (0х01.0х2640).
Если тебе нужны Ti>10 то увиличивай точность 0х10000... но чтобы точность
всегда была чётной иначе будут серьёзные тормоза при умножении (особенно на
восьмибитке)
Выбор разрядности Е:
Требование одно, чтобы Е не переполнялся при самой большой постоянной
времени, а то получишь генератор пилообразного напряжения (или температуры

Контролируй и ограничивай Uout на предмет максимального значения (не больше чем
макмальный код АЦП) после этого нужно обходить процесс интегрирования до тех
пор
пока е (рассогласование) не сменит знак, иначе регулятор уйдёт в глубокой
насыщение
что при больших Ti чревато серьёзными последствиями (например на двигатель
совершенно бесконтрольно (допустим ты написал регулятор и решил его проверить,
а
защиты ещё не реализовал) подаётся максимальное напряжение в течении
длительного
времени).
Из произведения E*t/Ti для дальнейшихз вычисления (сложение с е) бери только
челую часть , в данном случае отбрасываешь два младших байта. При сложении не
забывай учитывать знак е, т.к. результат будет многобайтовым, перед сложением
расширяй е до разрядности Е с учётом знака (аналог movsx в х386).
Как и чем управлять:
Uout имеет тоже кол-во разрядов что и АЦП, соответственно напрашивается
таблица КодУправленияПреобразователем=ТаблицаКодов[Uout] что при большом
количестве памяти совершенно логично, целесообразно и экономит немалое кол-во
вычислительных ресурсов.
Допустим у меня тиристорный преобразователь (ТП), угол управления кодируется -
2х байтным числом, следовательно при разрядноси АЦП 12бит размер таблицы
0xFFF*2=8Кб.
С ШИМ всё гораздо проще т.к. он чаще всего реализован аппаратно.
Таблицу нужно сразу расчитать для получения наилучшей характеристики эдс
преобразователя от кода управления ,для ТП это синус.
==============================================
На этом форуме обитает авторитетный человек, по этим вопросам - LordN,
поищите поиском, тема уже обсуждалась.
h_t_t_p://lord-n.narod.ru/walla.html#Automatica
И по поводу градиента температуры, для ее выравнивания нужно перемешивать
воздух, например вентилятором.