SlideShare une entreprise Scribd logo
1  sur  3
Télécharger pour lire hors ligne
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <delays.h>
#include <p18f452.h>
#pragma config OSC=HS
#pragma config OSCS=OFF
#pragma config WDT=OFF
#pragma config WDTPS=128
#pragma config LVP=OFF
#pragma config BOR=OFF//abaixo da tensão prog BORV reseta pic
#pragma config BORV=42 // 27 42 45 somente 27, reset inesperado pode curto circuitar
grupo(nunca aconteceu)
#pragma config PWRT=ON//power on reset delay
#pragma config CP0=ON
#pragma config CP1=ON
#pragma config CP2=ON
#pragma config CP3=ON
#pragma config CPB=ON
#pragma config CPD=ON
#pragma config WRT0=OFF
#pragma config WRT1=OFF
#pragma config WRT2=OFF
#pragma config WRT3=OFF
#pragma config WRTC=OFF
#pragma config WRTB=OFF
#pragma config WRTD=OFF
#pragma config EBTR0=OFF
#pragma config EBTR1=OFF
#pragma config EBTR2=OFF
#pragma config EBTR3=OFF
#pragma config EBTRB=OFF
#pragma config CCP2MUX=OFF
#pragma config STVR=OFF
////////////////////////////////////////////////////////////////////////////
#pragma udata banco1
//char nada1[96];
char stri1[30];//16
char stri2[30];//16
#pragma udata banco2
//char nada2[103];
unsigned char a;
unsigned int Valor_PWM;
unsigned int current_duty_1 = 0; // initial value for current_duty_1
unsigned int Media;
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
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. }

Contenu connexe

Plus de Simuladorgeradoreolico (20)

Biblioteca LCD
Biblioteca LCDBiblioteca LCD
Biblioteca LCD
 
Bibliotecas Complementares
Bibliotecas ComplementaresBibliotecas Complementares
Bibliotecas Complementares
 
Biblioteca Atraso
Biblioteca AtrasoBiblioteca Atraso
Biblioteca Atraso
 
Grupo 1 - Velocidades
Grupo 1 - VelocidadesGrupo 1 - Velocidades
Grupo 1 - Velocidades
 
Grupo 2 - Velocidades
Grupo 2 - VelocidadesGrupo 2 - Velocidades
Grupo 2 - Velocidades
 
Grupo 3 - Velocidades
Grupo 3 - VelocidadesGrupo 3 - Velocidades
Grupo 3 - Velocidades
 
Grupo 4 - Velocidades
Grupo 4 - VelocidadesGrupo 4 - Velocidades
Grupo 4 - Velocidades
 
Bibliotecas complementares
Bibliotecas complementaresBibliotecas complementares
Bibliotecas complementares
 
PIC18F452
PIC18F452PIC18F452
PIC18F452
 
LCD
LCDLCD
LCD
 
Pinagem
PinagemPinagem
Pinagem
 
Atraso
AtrasoAtraso
Atraso
 
ANEXO A - Grupo 4
ANEXO A - Grupo 4ANEXO A - Grupo 4
ANEXO A - Grupo 4
 
ANEXO A - Grupo 3
ANEXO A - Grupo 3ANEXO A - Grupo 3
ANEXO A - Grupo 3
 
ANEXO A - Grupo 1
ANEXO A - Grupo 1ANEXO A - Grupo 1
ANEXO A - Grupo 1
 
ANEXO A - Grupo 2
ANEXO A - Grupo 2ANEXO A - Grupo 2
ANEXO A - Grupo 2
 
ANEXO A - Grupo 4
ANEXO A - Grupo 4ANEXO A - Grupo 4
ANEXO A - Grupo 4
 
ANEXO A - Grupo 3
ANEXO A - Grupo 3ANEXO A - Grupo 3
ANEXO A - Grupo 3
 
ANEXO A - Grupo 1
ANEXO A - Grupo 1ANEXO A - Grupo 1
ANEXO A - Grupo 1
 
ANEXO A - Grupo 2
ANEXO A - Grupo 2ANEXO A - Grupo 2
ANEXO A - Grupo 2
 

Programa simulador de gerador eólico

  • 1. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <delays.h> #include <p18f452.h> #pragma config OSC=HS #pragma config OSCS=OFF #pragma config WDT=OFF #pragma config WDTPS=128 #pragma config LVP=OFF #pragma config BOR=OFF//abaixo da tensão prog BORV reseta pic #pragma config BORV=42 // 27 42 45 somente 27, reset inesperado pode curto circuitar grupo(nunca aconteceu) #pragma config PWRT=ON//power on reset delay #pragma config CP0=ON #pragma config CP1=ON #pragma config CP2=ON #pragma config CP3=ON #pragma config CPB=ON #pragma config CPD=ON #pragma config WRT0=OFF #pragma config WRT1=OFF #pragma config WRT2=OFF #pragma config WRT3=OFF #pragma config WRTC=OFF #pragma config WRTB=OFF #pragma config WRTD=OFF #pragma config EBTR0=OFF #pragma config EBTR1=OFF #pragma config EBTR2=OFF #pragma config EBTR3=OFF #pragma config EBTRB=OFF #pragma config CCP2MUX=OFF #pragma config STVR=OFF //////////////////////////////////////////////////////////////////////////// #pragma udata banco1 //char nada1[96]; char stri1[30];//16 char stri2[30];//16 #pragma udata banco2 //char nada2[103]; unsigned char a; unsigned int Valor_PWM; unsigned int current_duty_1 = 0; // initial value for current_duty_1 unsigned int Media;
  • 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. }