Ciao tecno, per intanto posto il mio codice, in cui ho anche trovato un piccolo errore (dichiaravo l'interrupt due volte per lo stesso pin (copia ed incolla andato a male) >:( , ora effettivamente il valore letto in un giro per l'encoder è di circa 4000 valori come ipotizzavi tu.
#include <Arduino.h>
#define pulsePin PA10
#define dirPin PA9
#define enaPin PA8
#define EAP PA15 //EA+
#define EBP PB3 //EB+
#define EAM PB6 //EA-
#define EBM PB4 //EB-
volatile int value = 0;
int i = 0;
unsigned long actime = millis(), acttimer2 = micros();
boolean left = LOW, right = HIGH;
void motor_enable() {
digitalWrite(enaPin, LOW);
}
void motor_disable() {
digitalWrite(enaPin, HIGH);
}
void motor_left() {
digitalWrite(dirPin, HIGH);
}
void motor_right() {
digitalWrite(dirPin, LOW);
}
void set_direction(bool dir) {
if(dir)
motor_right();
else
motor_left();
}
void ISRA() {
bool eap = digitalRead(EAP), eam = digitalRead(EAM);
bool ebp = digitalRead(EBP), ebm = digitalRead(EBM);
if(eap == HIGH && eam == LOW) {
if(ebp == LOW && ebm == HIGH) {
value++;
}
else if(ebp == HIGH && ebm == LOW) {
value--;
}
}
else if(eap == LOW && eam == HIGH){
if(ebp == HIGH && ebm == LOW) {
value++;
}
else if(ebp == LOW && ebm == HIGH){
value--;
}
}
}
void ISRB() {
bool eap = digitalRead(EAP), eam = digitalRead(EAM);
bool ebp = digitalRead(EBP), ebm = digitalRead(EBM);
if(ebp == HIGH && ebm == LOW) {
if(eap == HIGH && eam == LOW) {
value++;
}
else if(eap == LOW && eam == HIGH){
value--;
}
}
else if(ebp == LOW && ebm == HIGH){
if(eap == LOW && eam == HIGH) {
value++;
}
else if(eap == HIGH && eam == LOW){
value--;
}
}
}
void setup() {
Serial.begin(115200);
pinMode(pulsePin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(enaPin, OUTPUT);
pinMode(EAP, INPUT_PULLUP);
pinMode(EBP, INPUT_PULLUP);
pinMode(EAM, INPUT_PULLUP);
pinMode(EBM, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(EAP), ISRA, CHANGE);
attachInterrupt(digitalPinToInterrupt(EBP), ISRB, CHANGE);
motor_disable();
i = 0;
}
void mov(int gradi, bool direction) {
set_direction(direction);
int pulses = (int)(((float)(850*gradi))/360);
motor_enable();
for(int k = 0; k < pulses; k++) {
digitalWrite(pulsePin, HIGH);
acttimer2 = micros();
while(micros() - acttimer2 < 1500) {}
digitalWrite(pulsePin, LOW);
acttimer2 = micros();
while(micros() - acttimer2 < 1500) {}
}
motor_disable();
}
void test_movement() {
if(millis() % 6500 == 0) {
if(i) {
mov(360, left);
i = 0;
}
else {
mov(360, right);
i = 1;
}
}
}
void loop() {
test_movement();
if(millis() % 256 == 0) {
Serial.println(value);
}
}
Il risultato però non è cambiato, ho i miei 4k valori mentre ruoto l'asse in entrambi i versi a motore spento, mentre a motore acceso ricevo pochi impulsi quando il motore gira a sinistra in particolare.
Per quanto riguarda l'HW avendo a casa anche una bluepill (STM32F103 col bootloader arduino) ho provato anche con quella ma con gli stessi risultati. Il collegamento è i 2 canali con tutti e 4 le uscite ai pin arduino, GND arduino ed encoder (USCITA GND HBS) collegati insieme.
Riguardo gli impulsi in più, si io sto pilotando a frequenza fissa, per come puoi vedere dal codice penso che tu intenda questo.