#include "FastInterruptEncoder.h"
//Encoder enc(PA0, PA1, SINGLE /* or HALFQUAD or FULLQUAD */, 250 /* Noise and Debounce Filter (default 0) */); // - Example for STM32, check datasheet for possible Timers for Encoder mode. TIM_CHANNEL_1 and TIM_CHANNEL_2 only
Encoder enc(25, 26, FULLQUAD, 250);
unsigned long enc_timer = 0;
int ena1 = 13; //Señal de enable para motor A
int ini1 = 2; //Pin ini1 para motor A
volatile int pulses = 0;
volatile float rpm = 0;
hw_timer_t * timer = NULL; //timer activado por hardware
void IRAM_ATTR activarEncoder()
{
enc.loop();
}
void setup() {
Serial.begin(115200);
digitalWrite(ini1, HIGH);
analogWrite(ena1, 50);
if (enc.init()) {
Serial.println("Encoder OK");
} else {
Serial.println("Encoder No Inicia");
while(1);
}
timer = timerBegin(0, 80, true); //Encoder cada 80Hz.
timerAttachInterrupt(timer, &activarEncoder, true);
timerAlarmWrite(timer, 1000, true); //Alarma cada 1000Hz
timerAlarmEnable(timer);
}
void loop() {
if ((millis() > (enc_timer + 100)) || (millis() < enc_timer)) {
pulses = enc.getTicks();
Serial.println(pulses);
if(pulses >= 112){
enc.resetTicks();
}else{
rpm = (pulses * 60) / 112;
Serial.printf("RPM: %.2f\n", rpm);
}
enc_timer = millis();
enc.resetTicks();
}
}