Fonte Microcontrolada | Compensação da tensão de saida

Primeiramente obrigado por ler este tópico e tentar me ajudar! :slight_smile:
Estou simulando um protótipo de uma fonte microcontrolada baseada em Arduíno(328P) para meu uso,já consegui faze-la regular a tensão de saída através de um potenciômetro porém não estou conseguindo implementar a funcionalidade de compensar uma eventual queda de tensão na saída aumentando o duty cicle do PWM. Exemplo:
-Regulei a tensão de saída para 5V.
-A carga consome uma corrente “alta” que causará uma queda de tensão na saída, por exemplo para 4.5V.
-O Arduíno percebe que a tensão de saída difere da tensão regulada(por uma margem por exemplo de 0,5V) e aumenta automaticamente o valor do duty cicle do PWM para corrigir a tensão de saída para o valor regulado.
-Quando a carga for desconectada ou o consumo cair consideravelmente o Arduíno corrige novamente o valor do PWM(agora diminuindo o PWM para baixar a tensão de saída) para ser igual ao valor regulado pelo usuário.

Já tentei coisas como:

if(saida>target){
pwm++;
}
if(saida<target){
pwm--;

Porém a saída oscilava descontrolavelmente e a tensão não se estabilizava.

Esse é o código que tenho até o momento:

/*  Fonte.ino   V1.02
 * 
 */
#include <LiquidCrystal.h> //Biblioteca do LCD
LiquidCrystal lcd(13, 12, 11, 10, 9, 8); //Configra os terminais do display
// Mapa de harware
const byte s1=6; //Terminal de saida da fonte 1
const byte potPin=A0; //Terminal do potenciometro de ajuste tensão
const byte sense=A1; //Terminal do feedback da saida
// Constantes
// Variáveius globais
int pot=0; //Valor ADC do potenciometro de escolha de tensão
float target; //Valor de tensão para a saida
int pwm =0; //Valor do pwm 0-255
float saida = 0; //Valor do feedback da tensão de saida
//int saida = 0; //Valor do feedback
//PID
long erro=0; //Diferença entre a tensão configurada e a saida
//
// Protótipos de função
void atualizaDisplay(void); //Atualiza o display com as informações
void potCheck(void); //Lê o potenciometro e calcula a tensão de saida ajustada
void sRead(void); //Lê a tensão do feedback da saida
void outSet(void); //Determina o PWM e aplica na saida
//-----------------
void setup() {
  lcd.begin(16,2); //Inicia o display
  lcd.print("Iniciando");
  lcd.setCursor(0,1);
  for(int x =0;x<16;x++){
    lcd.print(".");
    delay(50);
  }
  delay(500);
  lcd.clear();
}

void loop() {
  potCheck();
  sRead();
  outSet();
  atualizaDisplay();
  //delay(110);
  delay(50);
}
// Funções
void atualizaDisplay(){
  lcd.clear(); //limpa o display
  lcd.print("Set:");lcd.print(target,1); //mostra no display a tensão de saída escolhida
  /*lcd.setCursor(0,1);*/ lcd.print(" Out:");lcd.print(saida,1); //DEGUB
  lcd.setCursor(0,1); lcd.print("PWM: ");lcd.print(pwm); //DEGUB
  lcd.print(" Er: "); lcd.print(erro); //Debug
}
void potCheck(){
  pot = analogRead(potPin) ; //lê o valor do potenciômetro de tensão
  target = (pot * (5.0/1023.0)) * 2.4;
  //target=map(pot,0,1023,0,12); //transforma o valor do potenciômetro em uma tensão de saída 0-12V
}
void sRead(){
  saida=analogRead(sense);
  saida=(saida * (5.0/1023.0)) * 2.4; //transforma o valor lido para tensão da saida
}
void outSet(){
  pwm=map(pot,0,1023,0,255);
  analogWrite(s1,pwm);
}

O esquemático está na descrição. No esquemático ainda não acrescentei os transistores de potencia na saída, então simulo a carga com um resistor na saída do operacional.