#define FREQ_PWM 10000.0f #define FREQ_CONTROLE 1000.0f #define PER_PWM (1.0f/FREQ_PWM) #define PER_CONTROLE (1.0f/FREQ_CONTROLE) #include "mbed.h" DigitalOut operacao(LED_RED); Serial Console(USBTX, USBRX); PwmOut dt_cycle(PTD4); Ticker Controlador; Ticker Monitor; float new_dt_cycle; int slope; int dt; void MonitorOperacao(void) //cria a rampa de subida e descida no PWM { operacao = !operacao; //LED de sinalizacao de atividade do sistema if(slope>=0) //se eu devo subir { dt=dt+1; //aumenta if(dt>=10) slope = -1; //se chegou ao final da subida, manda descer } else //se eu devo descer { dt=dt-1; //diminui if(dt<=0) slope = 1; //se chegou ao final da descida, manda subir } new_dt_cycle = (float)dt*0.1f; //calcula nova taxa de PWM } void FuncaoControle(void) //calcula o controle a atribui a nova decisao de PWM //para a saida PTD4 { dt_cycle = new_dt_cycle; } int main() { dt_cycle.period(PER_PWM); dt_cycle = 1.0f; new_dt_cycle = 0.0f; dt=0; slope=1; Console.printf("Iniciando controlador PWM\r\n"); Console.printf("Programa teste de subida e descida de Duty Cycle\r\n"); Monitor.attach(MonitorOperacao, 5.0f); Controlador.attach(FuncaoControle, PER_CONTROLE); while(1) { Console.printf("PWM = %3.3f [%%]\r\n", new_dt_cycle * 100.0f); wait(0.2f); } }