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