Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
RafaelaMilano

C Interrupção por timer - PIC18F4550

Recommended Posts

Olá, sou estudante do curso Técnico em Mecatrônica. Meu professor passou um projeto para mostrarmos a velocidade de um motor CC com redução, em RPM, no Hyper Terminal. Ele falou que precisamos usar a interrupção por timer, porém, não entendi como se usa a interrupção por timer no PIC18F4550. Ele nos passou o programa base para só modificarmos para mostrar a velocidade. Se alguém puder me ajudar, eu agradeceria muito. 

 

Segue o programa base:

 

/*
Exemplo para controle de Motor de Corrente Contínua
*/
#include <18F4550.h>
#use delay(clock = 20MHz)
#fuses HS, NOWDT, PUT, NOBROWNOUT, NOLVP
#use rs232(baud = 9600, parity = N, xmit = pin_c6, rcv = pin_c7, bits = 8)

#include <stdlib.h>                  // biblioteca de conversão de valores

#define led       pin_e2

// Definição de nomes para os canais do encoder. Para determinação do sentido de giro,
// ao menos um dos canais deve ser conectado à algum pino de interrupção externa
#define CanalB    pin_b1

// Definição de nomes para a seleção de sentido de acionamento da Ponte H
#define PonteH_1  pin_d0
#define PonteH_2  pin_d1


// Definição de variável(is) global(is)
int1 i1_Sentido;
int16 i16_iPWM = 0, i16_pPWM = 0;
float f_Resolucao = 0, f_Angulo = 0, f_Posicao = 0;
char s_Resolucao[4], s_Posicao[10], s_pPWM[4];
signed int16 Contador = 0;


// Declaração de funções utilizadas no programa
void PiscaLed(void)
{
   // Pisca-pisca para led
   output_high(led);
   delay_ms(250);
   output_low(led);
   delay_ms(250);
   return;
}

void Inicializacao(void)
{
   // Inicialização para controle do motor cc
   printf("Resolucao do Encoder [ppv = pulsos por volta] = ");
   gets(s_Resolucao);               // após <enter>, lê o valor do tipo string digitado
   printf("\n\r");
   f_Resolucao = atof(s_Resolucao);   // converte string em número do tipo float
   f_Resolucao = 360/f_Resolucao;
   delay_ms(250);
   return;
}


// Declaração das interrupções e suas respectivas funções
#int_EXT
void  EXT_isr(void) 
{
   // Este pedaço de código será executado se a interrupção for acionada, ou seja, o Canal A do encoder
   // passar de nível Alto para Baixo [H_TO_L], conforme configuração no programa principal [void main()]
   if ( !input(CanalB) )            // Se o Canal B estiver em nível Baixo -> Sentido Horário
   {
      Contador--;
   }
   if ( input(CanalB) )            // Se o Canal B estiver em nível Alto -> Sentido Anti-Horário
   {
      Contador++;
   }
   return;
}


// Função principal
void main()
{
   PiscaLed();
   
   // Configuração da(s) Interrupção(ões) Externa(s)
   disable_interrupts(GLOBAL);         // Desabilita todas as interrupções se estiverem habilitadas
   enable_interrupts(INT_EXT);         // Habilita a interrupção externa 0
   ext_int_edge(0, H_TO_L);         // Configuração da interrupção externa para borda de descida :: High TO Low [H_TO_L]
                              // Se fosse borda de subida :: Low TO High [L_TO_H]
   enable_interrupts(GLOBAL);         // Habilita todas as interrupções
   
   // Configuração do sinal PWM
   setup_ccp1(CCP_PWM);            // Configura CCP1 como um PWM
   //   O tempo de ciclo (período, T) será dado pela seguinte expressão:
   //      T = (1/clock)*4*t2div*(período+1)
   //   onde:
   //      T = período (será dado em segundos)
   //      clock = clock configurado em <#use delay(clock = #)>
   //      t2div = número de vezes de oscilação do cristal por instrução (pode ser: T2_DIV_BY_1 ou T2_DIV_BY_4 ou T2_DIV_BY_16)
   //      período = valor que determina quando o valor de clock será resetado (pode ser um inteiro de 0 a 255)
   //   Neste programa o clock é de 20MHz = 20000000Hz, t2div será por 16 (T2_DIV_BY_16) e o período selecionado será de 249. Assim,
   //      T = (1/20000000)*4*16*(249+1) = 0.0008s = 800us :: f = 1/T = 1/0.0008 = 1250Hz (aprox. 1,25kHz)
   setup_timer_2(T2_DIV_BY_16, 249, 1);// Configura o período T do sinal PWM
   
   // Inicialização de escrita na porta serial
   printf("\n\n\n\r");
   printf("::...[ Curso Tecnico em Mecatronica ]...::\n\r");
   delay_ms(250);
   printf("::         Controle de Motor CC         ::\n\r");
   printf("\n\r");
   delay_ms(250);
   
   Inicializacao();               // Chama função de inicialização do motor
   
   while ( True )
   {
      printf("\n\rDigite a posicao angular desejada: ");
      gets(s_Posicao);
      printf("\n\r");
      f_Posicao = atof(s_Posicao);
      delay_ms(250);
      
      printf("Digite o percentual de sinal PWM desejado [0 - 100]: ");
      gets(s_pPWM);
      printf("\n\n\r");
      i16_pPWM = atoi(s_pPWM);
      delay_ms(250);
      // Conversão do valor percentual de 0 a 100 para inteiro de 10bits
      i16_iPWM = i16_pPWM*10;         // 100% = 1000 :: 1000/100 = 10
      
      // Exemplo para uso do canal PWM: definição do tempo de ciclo ativo
      set_pwm1_duty(i16_iPWM);
      
      printf("PWM selecionado:  %5ld\n\r", i16_iPWM);
      printf("Posicao atual:    %5.1f\n\r", f_Angulo);
      printf("Posicao desejada: %5.1f\n\r", f_Posicao);
      if ( f_Posicao <= f_Angulo )
      {
         i1_Sentido = 0;
         printf("Sentido de giro:      Horario\n\r");
      }
      else
      {
         i1_Sentido = 1;
         printf("Sentido de giro: Anti-Horario\n\r");
      }
      
      if ( i1_Sentido == 0 )         // sentido horário
      {
         while ( f_Angulo > f_Posicao )
         {
            // Escrita/Acionamento do Motor CC
            output_high(PonteH_1);
            output_low(PonteH_2);
            f_Angulo = Contador*f_Resolucao;
            printf("Contador: %5ld :: Angulo: %5.1f\n\r", Contador, f_Angulo);
         }
         output_high(PonteH_1);
         output_high(PonteH_2);
      }
      
      if ( i1_Sentido == 1 )         // sentido anti-horário
      {
         while ( f_Angulo < f_Posicao )
         {
            // Escrita/Acionamento do Motor CC
            output_high(PonteH_2);
            output_low(PonteH_1);
            f_Angulo = Contador*f_Resolucao;
            printf("Contador: %5ld :: Angulo: %5.1f\n\r", Contador, f_Angulo);
         }
         output_high(PonteH_1);
         output_high(PonteH_2);
      }
   }
   disable_interrupts(GLOBAL);         // Desabilita todas a interrupcoes externas se estiverem habilitadas
}


 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×