Эххх, давно не брал я в руки шашку.....
Несмотря на кужущуюся простоту, при минимальном требовании "плавности регулирования", система у Вас получается довольно сложной для проектирования, т.е. содержит существенную нелинейность в виде двустороннего нестационарного ограничения по управляющему воздействию на объектрегулирования под названием "бак". Если входной поток, заполняющий бак, обозначить как V, а поток откачиваемый насосом обозначить как Kн*u (предполагается, что насос линейно отрабатывает управляющее воздействие u>=0), то скорость изменения уровня в баке будет:
dLout/dt = V-Kн*u.
Lout - уровень в баке; Кн - коэффициент пересчета числа от 0 до 32768 в производительность насоса.
Двустороннесть ограничения здесь - при u=0 скорость заполнения не может быть больше V, а при u=max скорость слива не может быть быстрее V-Kн*u_max. Нестационарность - в Ваших условиях нет информации о скорости V, поэтому, на этапе проектирования она должна предполагаться неизвестной и нестационарной (как правило - медленно меняющейся). Дополнительная сложность - насос работает только на слив, поэтому нужно специльно отрабатывать знак ошибки:
Err = Lset-Lout
Lset - задающее воздейсвтие.
Поясню - положительная ошибка говорит о необходимости уменьшения скорости слива, или вообще его прекращения, а отрицательная - наоборот о необходимости увеличения скорости слива. Но насос работает только на слив и воспринимает только положительные значения - Т.е. знак ошибки нужно, как минимум, инвертировать.
Еще одна сложность - дискретность датчика уровня. Исполнитель у Вас 15-ти разрядный. Датчик уровня, скорее всего будет выдавать значительно грубее. Может так получиться, что система регулирования, в стационарном состоянии, бутет качаться вблизи установившегося значения на +/-1 разряд этого датчика. Такое явление называется "предельный цикл низкого уровня".
Простейший алгоритм поддержания заданного уровня здесь самоочевиден. Если DLout - один дискрет датчика уровня, то:
при Err > DLout устанавливается u=0
при Err < -DLout устанавливается u=u_max
где u_max - такое значение от 0 до 32768, что Kн*u_max заведомо больше максимально возможной скорости заполнения бака Vmax.
Если выставлено упомянутое требование "плавности регулировки", то Вам необходимо подобрать такое u0, при котором обеспечивается два равенства для текущего значения V0 (V0 неизвестно и медленно меняется):
V0-Kн*u0 = 0
Err = 0.
Точно удовлетворить эти равенства не получится в силу дискретности датчика уровня. Вот здесь и может появиться уже упомянутый "предельный цикл низкого уровня" - это характерное свойство
всех цифровых систем регулирования по ошибке с малой разрядностью датчика. Но приближенно - нужно пытаться. Простейший вариант замкнутого контура регулирования
предложил AlterPferd (Вам нужно было более детально раскрутить его на идеи) - замкнуть контур через усилительное звено с коэффициентом передачи -Kп (!!!знак "минус" - для инвертирования сигнала ошибки!!!), а неизвестную скорость заполнения V0 рассматривать как мешающее воздействие. В этом случае управляющее воздействие на насос:
u = -Кп*Err = -Кп*(Lset-Lout)
u = 0, если u<0
а удержание уровня будет выполнено со статической ошибкой, которая может быть оценена как
Err = tau*V0, где tau = 1/(Кп*Кн).
Выбором Kп достаточно большим можно свести эту ошибку до приемлемой величины для всех возможных скоростей заполнения бака. Если каким-то образом удалось получить V0, то можно вычесть эту ошибку, сформировав управляющее воздействие по правилу:
u = -Кп*Err + V0/Kн
u = 0, если u<0.
Специально нормировать здесь ничего не нужно. Но необходимо согласовать размерность задающего воздействия (Lset), показаний датчика уровня (Lout) и диапазон допустимых входных значений исполнительного звена (насоса).
Включение интегратора с коэффициентом усиления Ки паралельно усилительному звену (это называется "изодромная коррекция" - рекомендую погуглить) теоретически может свести статическую ошибку от мешающего воздействия V0 до нуля. Управляющее воздействие здесь формируется в виде (!!! знак ошибки инвертирован !!!):
Int(i) = Int(i-1) - Err
u(i) = -Кп*Err(i) + Ки*Int(i)
u = 0, если u<0.
Однако, наличие ограничения на управляющее воздействие вида u = 0, если u>0 тянет за собой явление, которое в англицкой литературе называется wind-up (не знаю как по русски, но рекомендую погуглить). Это явление удлинняет переходный процесс за счет появления затухающих колебаний вокруг установившегося значения (этих колебаний не будет, если снять ограничение). Борются с wind-up по разному. Простейший способ - отключение входа интегратора (т.е. принудительная подача на него нулевого значения) в момент выполнения
условия u<0, т.е.:
Int1 = Int(i-1) - Err
u(i) = -Кп*Err(i) + Ки*Int1
если u(i)<0 то u = 0, Int(i) = Int(i-1).
Коэфициенты Ки и Кп лучше выбирать так, чтобы корни s = 0.5*(-Кп +/- sqrt(Кп^2-4*Ки)) характеристического уравнения были отрицательными и действительными - это обеспечит систмеме устойчивость и малую колебательность (колебания, вызванные совместным действием ограничения u = 0, если u<0 - это отдельная песня для нелинейных систем авторегулирования

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