2. signed int erro1;
#pragma udata banco3
float Kp;
signed int correcao;
/*char nada3[255];
#pragma udata banco4
char nada4[255];
#pragma udata banco5
char nada5[55];
#pragma udata
char nada6[118];*/
////////////////////////////////////////////////////////////////////////////
void Wait(unsigned int B);
void lcd_escreve_duas_linhas();
void inicializa_saidas();
void lcd_ini();
void delay_10us(unsigned int numero);
void delay_ds(unsigned int atraso2);
void delay_ms(unsigned int atraso1);
void lcd_envia_nibble( char dado );
void lcd_envia_byte( char endereco, char dado );
void lcd_pos_xy( char x, char y);
void lcd_escreve( char c);
void grava_eeprom(unsigned int dado,unsigned int endereco);
unsigned int le_eeprom(unsigned int endereco);
void inicializa_entradas_analogicas();
unsigned int ADC_Read(unsigned int canal);
void inicializa_pwm_1();
void inicializa_timer_0();
void inicializa_timer_1();
void inicializa_timer_2();
void PWM1_Set_Duty(unsigned int potencia);
void lcd_escreve_uma_linha();
////////////////////////////////////////////////////////////////////////////
#include <p18f452.h>
#include <pinagem.h>
#include <lcd.h>
#include <atraso.h>
#include <bibliotecas.h>
////////////////////////////////////////////////////////////////////////////
1. void main(void)
2. {
3. inicializa_saidas();
4. inicializa_pwm_1();
5. inicializa_entradas_analogicas();
6. delay_ds(1);
7. lcd_ini();
8. delay_ds(1);
9. a=0; //INICIALIZA O LOOP DOS VALORES DE VELOCIDADE
10. loop:
11. if(a==20)Valor_PWM = 0;//VELOCIDADE 0; PWM 0
12. else if(a==40)Valor_PWM = 148;//VELOCIDADE 302; PWM 3,3
13. else if(a==60)Valor_PWM = 135;//VELOCIDADE 276; PWM 3,0
14. else if(a==80)Valor_PWM = 143;//VELOCIDADE 291; PWM 3,1
3. 15. else if(a==100)Valor_PWM = 163;//VELOCIDADE 336; PWM 3,6
16. else if(a==120)Valor_PWM = 189;//VELOCIDADE 395; PWM 4,3
17. else if(a==140)Valor_PWM = 219;//VELOCIDADE 461; PWM 5,0
18. else if(a>=160)a=0;
19. a++;
20. //Valor_PWM = ADC_Read(1); UTILIZADO SOMENTE NA ETAPA INICIAL DO TRABALHO
PARA FIXAR UM VALOR DE PWM
21. Media = 0;//INICIALIZA A MÉDIA DOS VALORES DO TACÔMETRO
22. for(y=0;y<8;y++)Media = Media + ADC_Read(0);
23. Media/=8;
24. erro1 = Valor_PWM-Media; // CALCULA O ERRO EM RPM
25. Kp = ADC_Read(2);// AQUISIÇÃO DO VALOR DO KP
26. Kp/=512;
27. correcao=erro1*Kp;//INICIA A CORREÇÃO DO VALOR DE VELOCIDADE
28. if(((Valor_PWM-correcao)>=0))current_duty_1 = current_duty_1+correcao;
29. else current_duty_1=0;
//INICIA LÓGICA PARA GARANTIR QUE O VALOR DO CURRENTY_DUTY_1 FIQUE EM 255
OU ZERO
30. if((current_duty_1>255)&&(current_duty_1<1000))current_duty_1=255;//0
31. else if((current_duty_1>=1000))current_duty_1=0;//0
32. PWM1_Set_Duty(current_duty_1); //ALTERA O DUTY CYCLE
33. sprintf (stri1,"I:%3.0u O:%3.0u E%3.0d ",Media, Valor_PWM, erro1);
34. sprintf (stri2,"Co:%3.0d Dut:%3.0u ", correcao, current_duty_1);
35. lcd_escreve_duas_linhas();
36. delay_ds(5);
37. goto loop;
38. }
Observação: o programa é de autoria de André Cunha e João Nicolotte. As bibliotecas foram
fornecidas pelo Engenheiro Rodrigo Lacerda Taschetto.