Gostaria de solicitar a ajuda de vocês com um codigo estou utilizando o mikroC e simulando no protheus. Qual seria minha ideia estou com um codigo para o controle de rotação PWM e RPM mais hoje para aumentar o a rotação eo Duty Cycle preciso de um potenciométrico queria a ajuda de voce para melhorar esse codigo para determinar uma rotação o PIC executar esse controle caso alguma coisa trave o motor automaticamente o PIC aumenta o Duty Cycle .. E o PIC que estou usando é 18F4520..
Sengue o Codigo:
// VARIAVEIS GLOBAIS
unsigned char ucTexto[10]; // Matriz para armazenamento de texto.
unsigned char ucPorcentagem; // Armazena a porcentagem do PWM.
unsigned int iLeituraAD = 0; // Define variável para armazenamento da leitura AD.
unsigned int iReg_timer1; // Armazena o RPM.
unsigned int pulsos = 0;
unsigned int setpoint();
int y = 0; // Declaração de variável global
// CONFIGURAÇÃO DOS PINOS DO LCD.
sbit LCD_RS at RE2_bit;
sbit LCD_EN at RE1_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;
// DIREÇÃO DOS PINOS.
sbit LCD_RS_Direction at TRISE2_bit;
sbit LCD_EN_Direction at TRISE1_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;
void interrupt(){
if (INTCON.TMR0IF == 1){ // Se o flag de estouro do TIMER0 for igual a 1, então
PORTB.RB0 = ~PORTB.RB0; // Inverte o estado do PORTB.RB0.
TMR0L = 0XDC; // Carrega valores de contagem
TMR0H = 0XB; // Carrega valores de contagem
INTCON.TMR0IF = 0; // Seta T0IE, apaga flag de entouro do TIMER0
iReg_timer1 = (TMR1L*600/8); // Pega valor lido do timer1 e multiplica por 600 para saber rotação por minuto.
// e divide por 7 pois a ventoinha para dar uma volta completa realiza 7 pulsos.
TMR1L = 0; // Limpa contador.
}
}
void Erro(){
}
void main(){
TRISB = 0;
TRISD = 0;
TRISC.RC0 = 1;
TRISC.RC2 = 0;
TRISE = 0;
PORTB = 0;
// Configuração das interrupções
INTCON.GIEH = 1; // Habilita as interrupções e a interrupção de alta prioridade.
INTCON.GIEL = 1; // Habilita as interrupções e a interrupção de baixa prioridade
RCON.IPEN = 1; // Configura 2 niveis de interrupção.
// Timer 0
INTCON.TMR0IF = 0;
INTCON2.TMR0IP = 1;
INTCON.TMR0IE = 1;
//temporização de 100 milisegundos
T0CON = 0B10000101;
TMR0L = 0XDC;
TMR0H = 0XB;
INTCON.TMR0IF = 0;
// Timer 1 para modo contador de pulsos externos
T1CON = 0B10000011;
TMR1L = 0;
TMR1H = 0;
PIR1.TMR1IF = 0;
ADCON0 = 0b00000001; .
ADCON1 = 0b00001110;
ADCON2 = 0b10111110;
// Config. LCD no modo 4 bits
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, "Duty Cycle: %"); .
PWM1_Init(5000);
PWM1_Set_Duty(255);
PWM1_Start();
// if (setpoint < 1000);
while(1){ // Aqui Definimos Uma Condição Sempre Verdadeira Como Parametro, Portanto Todo O Bloco Será Repetido Indefinidamente.
iLeituraAD= ADC_Read(0);
iLeituraAD=(iLeituraAD*0.24); ]
PWM1_Set_Duty(iLeituraAD);
iLeituraAD=(iLeituraAD*0.41);
WordToStr(iLeituraAD, ucTexto);
Lcd_Out(1,11,ucTexto);
WordToStr(iReg_timer1, ucTexto);
Lcd_Out(2,1,ucTexto);
Lcd_Out_CP(" RPM");
Delay_10us;
}
}