Sto provando ad interfacciare questo encoder con un microcontrollore che non è 5V tolerant (ESP32 e Teensy 4.0) quindi per adattare i livelli ho utilizzato questo adattatore ( qui il datasheet )
Ho collegato in questo modo:
Allego anche il codice anche se è proprio semplice:
#define PIN_A 22
#define PIN_B 23
#define PIN_ENABLE 13
volatile unsigned long tickA = 0;
volatile unsigned long tickB = 0;
unsigned long oldTickA = 0;
unsigned long oldTickB = 0;
unsigned long oldTime = 0;
unsigned long interval=10000;
void setup() {
pinMode(PIN_A, INPUT_PULLUP);
pinMode(PIN_B, INPUT_PULLUP);
pinMode(PIN_ENABLE, OUTPUT);
digitalWrite(PIN_ENABLE, LOW);
Serial.begin(115200);
delay(1000); //Take some time to open up the Serial Monitor
Serial.println("AVVIO");
attachInterrupt(PIN_A, pinA_ISR, FALLING);
attachInterrupt(PIN_B, pinB_ISR, FALLING);
digitalWrite(PIN_ENABLE, HIGH);
}
void loop() {
if(millis()-oldTime>=interval)
{
//Serial.println("Tempo");
oldTime=millis();
}
// put your main code here, to run repeatedly:
if(oldTickA!=tickA)
{
Serial.print("A: ");
Serial.println(tickA);
oldTickA=tickA;
}
if(oldTickB!=tickB)
{
Serial.print("B: ");
Serial.println(tickB);
oldTickB=tickB;
}
}
void pinA_ISR()
{
tickA++;
}
void pinB_ISR()
{
tickB++;
}
Il problema è che con questa configurazione ottengo dei valori assolutamente errati, ad esempio:
A: 1
B: 1
A: 744647
B: 638071
B: 638072
A: 1152198
B: 989362
B: 989363
A: 1713500
B: 1343183
B: 1343184
Cosa che non si verifica se collego l'encoder ad una MCU 5V oppure se rimpiazzo l'adattatore con un partitore di tensione. In queste modalità i valori restituiti sono corretti:
A: 1
B: 1
A: 2
B: 2
...
A: 10
B: 10
Ho provato anche a cambiare pin sia dell'adattatore che del micro senza che il risultato cambi.
Ho anche provato ad inserire un classico debounce hardware lato 5V o lato 3.3V ma anche in questo caso il risultato non cambia.
Dal datasheet non rilevo altra componentistica da inserire per l'utilizzo dell'adattatore (ad eccezione dei due condensatori sulle alimentazioni ) e non avendo a disposizione un oscilloscopio non riesco a capire cosa è che provochi il problema.
Qualcuno ha idea di cosa sto sbagliando?
Mmm ... vedo che lato ESP attivi delle pull_up, quindi ne deduco che servano ...
... guarda che la cosa NON si trasmette attraverso gli adattatori di livello e le pull-up, se richieste, le devi mettere anche lato sensore (o usare quei simpatici adtattatori di livello che si trovano sia su Adafruit che su Aliexpress e che sono fatti per il bus I2C e che hanno le pull-up incorporate da entrambi i lati).
Grazie a entrambe. Provo a controllare sia i sensori utilizzati dall'encoder (difficile sono piccolissimi spero nella lente ) e verificare se funziona a 3.3.
Per il discorso pullup se non leggo male il datasheet
7.3.5 Pull-up or Pull-down Resistors on I/O Lines
The TXS0108E has the smart pull-up resistors dynamically change value based on whether a low or a high is
being passed through the I/O line. Each A-port I/O has a pull-up resistor (RPUA) to VCCA and each B-port I/O
has a pull-up resistor (RPUB) to VCCB. RPUA and RPUB have a value of 40kΩ when the output is driving low. RPUA
and RPUB have a value of 4kΩ when the output is driving high. RPUA and RPUB are disabled when OE = Low.
This feature provides lower static power consumption (when the I/Os are passing a low), and supports lower VOL
values for the same size pass-gate transistor, and helps improve simultaneous switching performance.
dovrebbe averle integrati quindi provo anche a disabilitare quelle del micro o quantomeno metterle anche lato sensore. Avevo trovato un ottimo reference di quel sensore dove venivano indicati anche tutti i dettagli su temporizzazioni e accortezze varie ma mannaggia a me non l'ho salvato e non riesco a trovarlo di nuovo.
Vi tengo aggiornati, grazie di nuovo.
Ho provato a rimuovere la pullup del micro ma continua a non funzionare correttamente, reperisco un paio di resistenze e poi provo a metterle anche lato sensore. @cotestatnt ho provato a leggere e dovrebbe essere 2442 401BB la sigla impressa sui sensori ma si legge male e potrebbe anche essere 40188 40IBB.
Ma non ho trovato nulla di specifico, con il codice parziale trovo informazioni discordati, alcuni lo danno da 4,2V fino a 40V altri da 2,5 a 7,5V.
Appena posso provo a cercare meglio il datasheet originale e comunque a fare una prova alimentandolo a 3.3V
Edit: Ho fatto la prova a 3.3V a mano e pare funzionare come da aspettative, domani lo monto di nuovo sul suo asse e provo meglio. Grazie della dritta
Tanto i convertitore mi serve per andare a pilotare un driver per i motori a 12V che funziona anche quello a 5V e spero che non ci siano problemi con il PWM e l'adattatore di livello
Provato mettendo le pullup in entrambe i lati ma stesso risultato. Non trovo datasheet specifici dei sensori montati quindi credo che non potrò approfondire ulteriormente la motivazione del comportamento anomalo con il traslatore di livello.
Non ho strumentazione e, probabilmente, le conoscenze per approfondire l'argomento quindi adotterò la soluzione proposta e utilizzerò il dispositivo a 3.3V
Purtroppo no non ho l'oscilloscopio è una di quelle cose che inseguo da tempo
Lo userò sicuramente a 3.3V e bon! mi ero complicato la vita perché in tutti i punti dove viene venduto si fa riferimento all'alimentazione a 5V.
Provato sia con che senza le resistenze ma evidentemente è proprio l'adattatore che incasina il tutto, vuoi per le resistenze di pullup/down interne vuoi per altri fattori non sono compatibili.
Io ho imparato a prendere sempre con le pinze le descrizioni che si trovano nei vari siti online (soprattutto quelli cinesi con le traduzioni fantasiose).
Faccio sempre affidamento allo schema elettrico e ai datasheet quando e se vengono forniti.
Nel tuo caso, a giudicare da quello che sei riuscito a leggere, il sensore usato potrebbe essere questo e dovrebbe funzionare nel range di tensione 2.5/24Vdc
SI ma infatti hai super ragione è che non avevo pensato a leggere il componente e quando l'hai suggerito non sono stato in grado di trovare il datasheet con che ricerca ti è saltato fuori il risultato?
Comunque graize di nuovo e marco come soluzione il tuo elemento!