Pesquisar neste blog

13/05/2023

Motor de passo com frequência - PIC 16F877A

Objetivo: Fazer um programa que rede no PIC 16F877A para girar com determinada velocidade o motor no sentido horário ao pressionar o botão e ao pressionar novamente o botão ele gire no sentido anti - horário. Deverá ser mostrado a frequência em que o motor está girando.

Saída gerada no softwae Proteus
























#include <16F877A.h>
#device adc = 10
#fuses HS, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock = 20MHz)
#define size 8
#define T1 300
#define T2 200

#define LCD_DB4   PIN_D4
#define LCD_DB5   PIN_D5
#define LCD_DB6   PIN_D6
#define LCD_DB7   PIN_D7
#define LCD_E     PIN_D0
#define LCD_RS    PIN_D1

#include <lcd.c>
#byte PIR1 = 0x0C

unsigned int cont = 0, speed;
int1 nuevopulso = 0, cambio;
int16 TFB = 0, TFS, TF = 0;
float AP = 0.0, frequencia;

#INT_EXT
void EXT_isr(void) {
   cont++;
   if(cont >= 4){
      cont = 0;
   }
}

#int_ccp1
void ccp1_int(){
   if (cambio == 0 ){
      TFS = CCP_1;
      setup_ccp1(CCP_CAPTURE_RE);
      cambio = 1;
   }else{
      TFB = CCP_1;
      setup_ccp1(CCP_CAPTURE_RE);
      cambio = 0;
      
      if (nuevopulso == 0){
         nuevopulso = 1;
      }
   }
}


void main(){
   setup_timer_1(T1_INTERNAL);
   setup_ccp1(CCP_CAPTURE_RE);
   cambio = 0;
   enable_interrupts(int_ccp1);
   
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_EXT);
   
   setup_adc(ADC_CLOCK_DIV_32);  // Set ASC conversion time to 32 Tosc
   setup_adc_ports(AN0);         // Configure AN0 as analog
   set_adc_channel(0);
   delay_ms(100);
   
   lcd_init();
   
   while(true){
       printf(lcd_putc,"\f\t\tMOTOR OFF !");
       delay_ms(15);
       
       while(cont == 1){
         speed = read_adc();
         if (speed < 2){
            speed = 2;
         }
         
         output_low(PIN_B7);
         output_low(PIN_B5);
         output_low(PIN_B4);
         output_high(PIN_B6);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */
         delay_ms(speed);
         
         
         output_low(PIN_B7);
         output_low(PIN_B5);
         output_low(PIN_B4);
         output_high(PIN_B6);
         output_high(PIN_B5);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }        
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */   
         delay_ms(speed);
         
         
         output_low(PIN_B7);
         output_low(PIN_B6);
         output_low(PIN_B4);
         output_high(PIN_B5);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */
         delay_ms(speed);
         
         
         output_low(PIN_B7);
         output_low(PIN_B6);
         output_high(PIN_B5);
         output_high(PIN_B4);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */
         delay_ms(speed);
         
         
         output_low(PIN_B7);
         output_low(PIN_B6);
         output_low(PIN_B5);
         output_high(PIN_B4);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }        
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */
         delay_ms(speed);
         
         
         output_low(PIN_B6);
         output_low(PIN_B5);
         output_high(PIN_B4);
         output_high(PIN_B7);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         /*lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia); */
         delay_ms(speed);
         
         
         output_low(PIN_B6);
         output_low(PIN_B5);
         output_low(PIN_B4);
         output_high(PIN_B7);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         delay_ms(speed);
         
         output_low(PIN_B4);
         output_low(PIN_B5);
         output_high(PIN_B6);
         output_high(PIN_B7);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         lcd_gotoxy(1, 1);
         printf(lcd_putc, "\t\tSENTIDO HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia);
         lcd_gotoxy(21, 2);
         printf(lcd_putc, "W = %0.2f rad/s", frequencia * 2 * 3.15);
         delay_ms(speed);
         
       }
       
       while( cont == 3 ){
         speed = read_adc();
         if (speed < 2){
            speed = 2;
         }
                  
         output_low(PIN_B4);
         output_low(PIN_B5);
         output_high(PIN_B6);
         output_high(PIN_B7);
         
         delay_ms(speed);
                     
                         
         output_low(PIN_B4);
         output_low(PIN_B5);
         output_low(PIN_B6);
         output_high(PIN_B7);
         delay_ms(speed);
         
         
         output_low(PIN_B5);
         output_low(PIN_B6);
         output_high(PIN_B4);
         output_high(PIN_B7);
         delay_ms(speed);
         
         
         output_low(PIN_B5);
         output_low(PIN_B6);
         output_low(PIN_B7);
         output_high(PIN_B4);
         delay_ms(speed);
         
         
         output_low(PIN_B6);
         output_low(PIN_B7);
         output_high(PIN_B4);
         output_high(PIN_B5);
         delay_ms(speed);
         
         
         output_low(PIN_B4);
         output_low(PIN_B6);
         output_low(PIN_B7);
         output_high(PIN_B5);
         delay_ms(speed);
         
         
         output_low(PIN_B4);
         output_low(PIN_B7);
         output_high(PIN_B5);
         output_high(PIN_B6);
         delay_ms(speed);
         
         
         output_low(PIN_B4);
         output_low(PIN_B6);
         output_low(PIN_B7);
         output_high(PIN_B6);
         if (nuevoPulso >= 1){
            TF = TFB - TFS ;
            AP = TF * 1.0 / 1000.0;
            frequencia = 1.0 / (AP / 1000.0);
            nuevopulso = 0;
         }
         lcd_gotoxy(1, 1);
         printf(lcd_putc, "SENTIDO ANTI-HORARIO");
         lcd_gotoxy(1, 2);
         printf(lcd_putc, "Pulso = %f ms", AP);
         lcd_gotoxy(21, 1);
         printf(lcd_putc, "Freq = %0.2f Hz", frequencia);
         lcd_gotoxy(21, 2);
         printf(lcd_putc, "W = %0.2f rad/s", frequencia * 2 * 3.15);
         delay_ms(speed);
         
       }
   }
}

Nenhum comentário: