Luiz Fischer

Dependencies:   FastPWM mbed

Committer:
nlfischer
Date:
Fri Jan 05 18:01:00 2018 +0000
Revision:
0:d4f7edb6eb83
Luiz Fischer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nlfischer 0:d4f7edb6eb83 1 // Anexo 4: Programa principal com controle do conversor implementado
nlfischer 0:d4f7edb6eb83 2 #include "mbed.h"
nlfischer 0:d4f7edb6eb83 3 #include "FastPWM.h"
nlfischer 0:d4f7edb6eb83 4
nlfischer 0:d4f7edb6eb83 5 Ticker aciona_interrupcao;
nlfischer 0:d4f7edb6eb83 6
nlfischer 0:d4f7edb6eb83 7 Serial pc(SERIAL_TX, SERIAL_RX, 1000000);
nlfischer 0:d4f7edb6eb83 8
nlfischer 0:d4f7edb6eb83 9 AnalogIn tensao_entrada(PC_1);
nlfischer 0:d4f7edb6eb83 10 AnalogIn tensao_saida(PC_0);
nlfischer 0:d4f7edb6eb83 11
nlfischer 0:d4f7edb6eb83 12 FastPWM fastpwm(PB_4,1);
nlfischer 0:d4f7edb6eb83 13
nlfischer 0:d4f7edb6eb83 14 DigitalOut carga(PB_5);
nlfischer 0:d4f7edb6eb83 15 DigitalOut L_8V(PB_3);
nlfischer 0:d4f7edb6eb83 16
nlfischer 0:d4f7edb6eb83 17 static int interrupt = 1, k=0, L = 3000;
nlfischer 0:d4f7edb6eb83 18 float T = 0.001;
nlfischer 0:d4f7edb6eb83 19 float r = 5.0;
nlfischer 0:d4f7edb6eb83 20
nlfischer 0:d4f7edb6eb83 21 float kp = 50;
nlfischer 0:d4f7edb6eb83 22 float ki = 1;
nlfischer 0:d4f7edb6eb83 23 float kd = 0.1;
nlfischer 0:d4f7edb6eb83 24
nlfischer 0:d4f7edb6eb83 25 float le_tensao_vin(){
nlfischer 0:d4f7edb6eb83 26 return tensao_entrada.read()*11.5;
nlfischer 0:d4f7edb6eb83 27 }
nlfischer 0:d4f7edb6eb83 28
nlfischer 0:d4f7edb6eb83 29 float le_tensao_vout(){
nlfischer 0:d4f7edb6eb83 30 return tensao_saida.read()*11.5;
nlfischer 0:d4f7edb6eb83 31 }
nlfischer 0:d4f7edb6eb83 32
nlfischer 0:d4f7edb6eb83 33 void liga_8V(){
nlfischer 0:d4f7edb6eb83 34 L_8V = 1;wait(T/5);
nlfischer 0:d4f7edb6eb83 35 }
nlfischer 0:d4f7edb6eb83 36
nlfischer 0:d4f7edb6eb83 37 void liga_12V(){
nlfischer 0:d4f7edb6eb83 38 L_8V = 0;wait(T/5);
nlfischer 0:d4f7edb6eb83 39 }
nlfischer 0:d4f7edb6eb83 40
nlfischer 0:d4f7edb6eb83 41 float seta_pwm(int x){
nlfischer 0:d4f7edb6eb83 42
nlfischer 0:d4f7edb6eb83 43 if(x<0) x=0;
nlfischer 0:d4f7edb6eb83 44 if(x>5000) x=5000;
nlfischer 0:d4f7edb6eb83 45 fastpwm.pulsewidth_ticks(x); // Ajusta o ciclo de trabalho
nlfischer 0:d4f7edb6eb83 46 return x;
nlfischer 0:d4f7edb6eb83 47 }
nlfischer 0:d4f7edb6eb83 48
nlfischer 0:d4f7edb6eb83 49 void interrupcao(){
nlfischer 0:d4f7edb6eb83 50 interrupt = 1;
nlfischer 0:d4f7edb6eb83 51 k=k+1;
nlfischer 0:d4f7edb6eb83 52 }
nlfischer 0:d4f7edb6eb83 53
nlfischer 0:d4f7edb6eb83 54 void inicio(){
nlfischer 0:d4f7edb6eb83 55 wait(0.5);
nlfischer 0:d4f7edb6eb83 56 aciona_interrupcao.attach(&interrupcao, T);
nlfischer 0:d4f7edb6eb83 57
nlfischer 0:d4f7edb6eb83 58 fastpwm.period_ticks (5000); // Ajusta o período do pwm para 20Khz (5000 system ticks)
nlfischer 0:d4f7edb6eb83 59 fastpwm.pulsewidth_ticks(0); // Ajusta o ciclo de trabalho
nlfischer 0:d4f7edb6eb83 60
nlfischer 0:d4f7edb6eb83 61 pc.printf("%% Inicio do programa");
nlfischer 0:d4f7edb6eb83 62 pc.printf("\nclear all; clc;");
nlfischer 0:d4f7edb6eb83 63 pc.printf("\ndados = [");
nlfischer 0:d4f7edb6eb83 64 }
nlfischer 0:d4f7edb6eb83 65
nlfischer 0:d4f7edb6eb83 66 void imprime_dados(int u, float vin, float vout, float Rcarga_out){
nlfischer 0:d4f7edb6eb83 67 pc.printf("\n%d", k);
nlfischer 0:d4f7edb6eb83 68 pc.printf(" ");
nlfischer 0:d4f7edb6eb83 69
nlfischer 0:d4f7edb6eb83 70 pc.printf("%d", u);
nlfischer 0:d4f7edb6eb83 71 pc.printf(" ");
nlfischer 0:d4f7edb6eb83 72
nlfischer 0:d4f7edb6eb83 73 pc.printf("%f", vin);
nlfischer 0:d4f7edb6eb83 74 pc.printf(" ");
nlfischer 0:d4f7edb6eb83 75
nlfischer 0:d4f7edb6eb83 76 pc.printf("%f", vout);
nlfischer 0:d4f7edb6eb83 77 pc.printf(" ");
nlfischer 0:d4f7edb6eb83 78
nlfischer 0:d4f7edb6eb83 79 pc.printf("%f", Rcarga_out);
nlfischer 0:d4f7edb6eb83 80 }
nlfischer 0:d4f7edb6eb83 81
nlfischer 0:d4f7edb6eb83 82 void fim(){
nlfischer 0:d4f7edb6eb83 83 pc.printf("];");
nlfischer 0:d4f7edb6eb83 84 pc.printf("\nfigure(1)");
nlfischer 0:d4f7edb6eb83 85
nlfischer 0:d4f7edb6eb83 86 pc.printf("\nsubplot(4,1,1)");
nlfischer 0:d4f7edb6eb83 87 pc.printf("\nstairs(dados(:,4),'k')");
nlfischer 0:d4f7edb6eb83 88 pc.printf("\ngrid on");
nlfischer 0:d4f7edb6eb83 89 pc.printf("\nylabel('Tensão de saida (V)')");
nlfischer 0:d4f7edb6eb83 90 pc.printf("\naxis([0 3000 0 10])");
nlfischer 0:d4f7edb6eb83 91
nlfischer 0:d4f7edb6eb83 92 pc.printf("\nsubplot(4,1,2)");
nlfischer 0:d4f7edb6eb83 93 pc.printf("\nstairs(dados(:,3))");
nlfischer 0:d4f7edb6eb83 94 pc.printf("\ngrid on");
nlfischer 0:d4f7edb6eb83 95 pc.printf("\nylabel('Tensão de entrada (V)')");
nlfischer 0:d4f7edb6eb83 96 pc.printf("\naxis([0 3000 0 14])");
nlfischer 0:d4f7edb6eb83 97
nlfischer 0:d4f7edb6eb83 98 pc.printf("\nsubplot(4,1,3)");
nlfischer 0:d4f7edb6eb83 99 pc.printf("\nstairs(dados(:,5))");
nlfischer 0:d4f7edb6eb83 100 pc.printf("\ngrid on");
nlfischer 0:d4f7edb6eb83 101 pc.printf("\nylabel('Degrau de carga (OHMS)')");
nlfischer 0:d4f7edb6eb83 102 pc.printf("\naxis([0 3000 0 30])");
nlfischer 0:d4f7edb6eb83 103
nlfischer 0:d4f7edb6eb83 104 pc.printf("\nsubplot(4,1,4)");
nlfischer 0:d4f7edb6eb83 105 pc.printf("\nstairs(dados(:,2))");
nlfischer 0:d4f7edb6eb83 106 pc.printf("\ngrid on");
nlfischer 0:d4f7edb6eb83 107 pc.printf("\nylabel('CONTROLE')");
nlfischer 0:d4f7edb6eb83 108 pc.printf("\naxis([0 3000 0 5500])");
nlfischer 0:d4f7edb6eb83 109 pc.printf("\nxlabel('Amostra [k]')");
nlfischer 0:d4f7edb6eb83 110
nlfischer 0:d4f7edb6eb83 111 pc.printf("\nsave dados dados\n\n");
nlfischer 0:d4f7edb6eb83 112 fastpwm.pulsewidth_ticks(0); // Ajusta o ciclo de trabalho
nlfischer 0:d4f7edb6eb83 113
nlfischer 0:d4f7edb6eb83 114 while(1){ }
nlfischer 0:d4f7edb6eb83 115 }
nlfischer 0:d4f7edb6eb83 116
nlfischer 0:d4f7edb6eb83 117 int main() {
nlfischer 0:d4f7edb6eb83 118 int i = 0, u = 0;
nlfischer 0:d4f7edb6eb83 119 float vin=0.0,vout=0.0, Rcarga = 22, e = 0, e0 = 0;
nlfischer 0:d4f7edb6eb83 120
nlfischer 0:d4f7edb6eb83 121 inicio();
nlfischer 0:d4f7edb6eb83 122
nlfischer 0:d4f7edb6eb83 123 while(1){
nlfischer 0:d4f7edb6eb83 124
nlfischer 0:d4f7edb6eb83 125 if(interrupt) {
nlfischer 0:d4f7edb6eb83 126 vin = le_tensao_vin();
nlfischer 0:d4f7edb6eb83 127 vout = le_tensao_vout();
nlfischer 0:d4f7edb6eb83 128
nlfischer 0:d4f7edb6eb83 129 /****** Implementação PID *********/
nlfischer 0:d4f7edb6eb83 130
nlfischer 0:d4f7edb6eb83 131 e = r - vout;
nlfischer 0:d4f7edb6eb83 132
nlfischer 0:d4f7edb6eb83 133 u = (kp*e) + (u+ki*T*e) + (kd*(e-e0)/T);
nlfischer 0:d4f7edb6eb83 134
nlfischer 0:d4f7edb6eb83 135 e0 = e;
nlfischer 0:d4f7edb6eb83 136 /**********************************/
nlfischer 0:d4f7edb6eb83 137
nlfischer 0:d4f7edb6eb83 138 seta_pwm(u);
nlfischer 0:d4f7edb6eb83 139
nlfischer 0:d4f7edb6eb83 140 imprime_dados(u,vin,vout,Rcarga);
nlfischer 0:d4f7edb6eb83 141 interrupt = 0;
nlfischer 0:d4f7edb6eb83 142
nlfischer 0:d4f7edb6eb83 143 if(k==1000)liga_8V();
nlfischer 0:d4f7edb6eb83 144 if(k==2000){carga = 1; Rcarga = 5.6;}
nlfischer 0:d4f7edb6eb83 145 if(k==L)fim();
nlfischer 0:d4f7edb6eb83 146
nlfischer 0:d4f7edb6eb83 147 }
nlfischer 0:d4f7edb6eb83 148 }
nlfischer 0:d4f7edb6eb83 149 }