melandr писал(а):ПИД-регулятор выдает сигнал от 0 до 100 %. Имеем три тэна по 3 кВт. Каждый тэн грубо говоря по 33%. Если мы хотим получить мощность 66% мы должны включить два тэна на полный период работы. А допустим мы хотим получить 49,5%. Для этого мы включаем первый тэн на полный период работы 60 сек, а второй тэн должен работать 30 сек. А по Вашей логике второй тэн должен работать 9,9 сек.
Всё, теперь понял, что у Вас там за ступени, ТЭНы, секунды, ... Тогда да, для каждой ступени, 100% - это 33% от общего.
Вот, накидал примерчик :
Код: Выделить всё
/**********************************************************************************/
#define OUT_STEPS 3 // Кол-во ступеней
#define STEP_PERC (100/OUT_STEPS) // Процент полного шага (ступени)
/**********************************************************************************/
unsigned char perc_steps[OUT_STEPS]; // Массив процентов для каждой ступени
/**********************************************************************************/
/**********************************************************************************/
void outs_calc(unsigned char pid_out){ // pid_out - расчитанная мощность регулятора
unsigned char i;
for(i=0; i<OUT_STEPS; i++){
int mod = (int)pid_out - STEP_PERC*i;
if(mod<0) mod=0;
if(mod>STEP_PERC) mod=STEP_PERC;
perc_steps[i]=(mod*100)/STEP_PERC;
}
}
/**********************************************************************************/
Функция
outs_calc расчитывает процент для каждой ступени и заносит их в массив
perc_steps. Принимаемый параметр - мощность на выходе регулятора.
Результаты :
Вход = 30, результат в массиве - 90, 0, 0
Вход = 50, результат в массиве - 100, 51, 0
Вход = 70, результат в массиве - 100, 100, 12
Вход = 100, результат в массиве - 100, 100, 100
Теперь Вам осталось только перевести каждый процент в время включения, относительно полного периода ШИМ.