Ir ao conteúdo
  • Cadastre-se
gbarrosp7

Controle motor CC por PWM e encoder

Recommended Posts

Estou fazendo um projeto para controlar um motor cc por pwm, que será programado em um MC HCS08, e para medir a rotação usarei um encoder.

A velocidade desejada será setada através de potenciômetro e um botão.

Estou tendo dificuldades para trabalhar com o encoder, segue o código que fiz: 

 

#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */


char FlagIrq=1;
int voltas=0;
int passo =0;
int rpm=0;

void interrupt isr_irq(void);
void Delay(long); 

void main(void)

{
 PTAPE = 0xFF; // Liga resistores Pull ups da porta A
 PTBPE = 0xFF; // Liga resistores Pull ups da porta B
 SOPT1_COPE=0; // Desabilita módulo COP (WDT)
 IRQSC_IRQPE=1; //Liga o pino PTA5 como interrupção
 IRQSC_IRQPDD=0; //Mantém o resistor Pull up no pino IRQ
 IRQSC_IRQMOD=0; //Seleciona IRQ por borda de descida
 IRQSC_IRQIE=1; //Habilita parcialmente a interrupção IRQ
 _asm CLI; //Habilita globalmente as interrupções
 
 PTBDD_PTBDD6 = 1; // Configura PTB6 como saída (LED1)
 PTBDD_PTBDD7 = 1; // Configura PTB7 como saída (LED2)

 for(;;) // Início do loop eterno
 {
 if(!FlagIrq)
 {
 passo ++;
 }
 
 voltas = passo/20;
 Delay(10000); // atraso aproximado 1 segundo
 rpm = voltas/60;


 if (rpm >=300) 
 {
 PTBD_PTBD6 = 1; // Desliga o LED1
 PTBD_PTBD7 = 0; // Liga o LED2
 }
 else
 {
 PTBD_PTBD6 = 0; // Liga o LED1
 PTBD_PTBD7 = 1; // Desliga o LED 
 }
 
 
 } // Fim do loop eterno
}

void Delay(long t)
{
 while (t--)
 continue;
}
 

void interrupt isr_irq(void)
{
 IRQSC_IRQACK=1; // Limpa flag do IRQ
 FlagIrq = !FlagIrq;
} 

A ideia é : o disco do encoder tem 20 furos, então a cada 20 pulsos será contada uma volta, após 1s quando dividir o numero de voltas por 60 eu teria o valor em rpm, mas não está funcionando.

 

 

Componentes usados : https://www.eletrogate.com/sensor-de-velocidade-encoder

                                          https://produto.mercadolivre.com.br/MLB-960364033-roda-pneu-motor-dc-3-a-6v-com-reducao-robotica-arduino-_JM

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sabe o que o processador faz durante um delay? Simplesmente espera o tempo passar, mais nada. Se necessita montar um cronômetro para ter base de tempo, use o timer. Ajuste-o para ter sua base de tempo e use a flag de saída como interrupção. Sem estar com os braços cruzados pelo efeito da função delay o processador conseguirá contar os pulsos. Por ocasião do disparo da flag aí então se faz as continhas para ver quanto deu de RPM.

  • 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

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





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

×