
Luiz Fischer
Diff: main.cpp
- Revision:
- 0:d4f7edb6eb83
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Jan 05 18:01:00 2018 +0000 @@ -0,0 +1,149 @@ +// Anexo 4: Programa principal com controle do conversor implementado +#include "mbed.h" +#include "FastPWM.h" + +Ticker aciona_interrupcao; + +Serial pc(SERIAL_TX, SERIAL_RX, 1000000); + +AnalogIn tensao_entrada(PC_1); +AnalogIn tensao_saida(PC_0); + +FastPWM fastpwm(PB_4,1); + +DigitalOut carga(PB_5); +DigitalOut L_8V(PB_3); + +static int interrupt = 1, k=0, L = 3000; +float T = 0.001; +float r = 5.0; + +float kp = 50; +float ki = 1; +float kd = 0.1; + +float le_tensao_vin(){ + return tensao_entrada.read()*11.5; + } + +float le_tensao_vout(){ + return tensao_saida.read()*11.5; + } + +void liga_8V(){ + L_8V = 1;wait(T/5); + } + +void liga_12V(){ + L_8V = 0;wait(T/5); + } + +float seta_pwm(int x){ + + if(x<0) x=0; + if(x>5000) x=5000; + fastpwm.pulsewidth_ticks(x); // Ajusta o ciclo de trabalho + return x; +} + +void interrupcao(){ + interrupt = 1; + k=k+1; +} + +void inicio(){ + wait(0.5); + aciona_interrupcao.attach(&interrupcao, T); + + fastpwm.period_ticks (5000); // Ajusta o período do pwm para 20Khz (5000 system ticks) + fastpwm.pulsewidth_ticks(0); // Ajusta o ciclo de trabalho + + pc.printf("%% Inicio do programa"); + pc.printf("\nclear all; clc;"); + pc.printf("\ndados = ["); +} + +void imprime_dados(int u, float vin, float vout, float Rcarga_out){ + pc.printf("\n%d", k); + pc.printf(" "); + + pc.printf("%d", u); + pc.printf(" "); + + pc.printf("%f", vin); + pc.printf(" "); + + pc.printf("%f", vout); + pc.printf(" "); + + pc.printf("%f", Rcarga_out); +} + +void fim(){ + pc.printf("];"); + pc.printf("\nfigure(1)"); + + pc.printf("\nsubplot(4,1,1)"); + pc.printf("\nstairs(dados(:,4),'k')"); + pc.printf("\ngrid on"); + pc.printf("\nylabel('Tensão de saida (V)')"); + pc.printf("\naxis([0 3000 0 10])"); + + pc.printf("\nsubplot(4,1,2)"); + pc.printf("\nstairs(dados(:,3))"); + pc.printf("\ngrid on"); + pc.printf("\nylabel('Tensão de entrada (V)')"); + pc.printf("\naxis([0 3000 0 14])"); + + pc.printf("\nsubplot(4,1,3)"); + pc.printf("\nstairs(dados(:,5))"); + pc.printf("\ngrid on"); + pc.printf("\nylabel('Degrau de carga (OHMS)')"); + pc.printf("\naxis([0 3000 0 30])"); + + pc.printf("\nsubplot(4,1,4)"); + pc.printf("\nstairs(dados(:,2))"); + pc.printf("\ngrid on"); + pc.printf("\nylabel('CONTROLE')"); + pc.printf("\naxis([0 3000 0 5500])"); + pc.printf("\nxlabel('Amostra [k]')"); + + pc.printf("\nsave dados dados\n\n"); + fastpwm.pulsewidth_ticks(0); // Ajusta o ciclo de trabalho + + while(1){ } +} + +int main() { + int i = 0, u = 0; + float vin=0.0,vout=0.0, Rcarga = 22, e = 0, e0 = 0; + + inicio(); + + while(1){ + + if(interrupt) { + vin = le_tensao_vin(); + vout = le_tensao_vout(); + + /****** Implementação PID *********/ + + e = r - vout; + + u = (kp*e) + (u+ki*T*e) + (kd*(e-e0)/T); + + e0 = e; + /**********************************/ + + seta_pwm(u); + + imprime_dados(u,vin,vout,Rcarga); + interrupt = 0; + + if(k==1000)liga_8V(); + if(k==2000){carga = 1; Rcarga = 5.6;} + if(k==L)fim(); + + } +} +} \ No newline at end of file