Selezione dell'indirizzo del bus a 4 bit tramite pin di ingresso analogico: la simulazione Monte Carlo mostra valori di indirizzo sovrapposti


16

Ho progettato un piccolo sensore PCB per la mia tesi di laurea con un microcontrollore ATtiny44 . Ho bisogno di circa 200 di queste schede per la mia applicazione e 16 sono sempre localmente connesse alla scheda controller. L'intera rete si presenta così:

Inserisci qui la descrizione dell'immagine

Per comunicare tra il controller e le schede dei sensori ho scritto il mio bus a 1 pin (basato sul timing). L'unico problema è che la scheda del sensore deve avere un indirizzo per conoscere la sua posizione nella rete, quando invio i suoi dati alla scheda del controller.

Dato che mi era rimasto solo 1 pin sull'ATtiny, ho creato un circuito DAC basato su jumper che dovrebbe generare una tensione analogica basata sull'impostazione di quattro jumper. Poiché la circuiteria del sensore utilizza i valori (47, 470, 1k, 3k, 4k7, 10k, 100k e 220k) e volevo ottimizzare la produzione, ho usato i valori seguenti per il DAC (sostanzialmente 100k, 50k, 20k e 10k ). Il che dovrebbe darmi un buon valore tra 0 V e 760 mV in base all'impostazione del jumper. Esattamente quello che dovevo leggere come tensione analogica con il riferimento interno 1.1 V dell'ATtiny. All'avvio, ATtiny legge questa tensione e dovrebbe conoscere la sua posizione.

schematico

simula questo circuito - Schema creato usando CircuitLab

In teoria funziona bene. Ho anche fatto un'analisi Monte Carlo in LTspice per confermare che non ho aree sovrapposte, considerando la tolleranza dei resistori (tutti sono 1% BTW). Di seguito puoi trovare le immagini di questa analisi.

Inserisci qui la descrizione dell'immagine Inserisci qui la descrizione dell'immagine

Ora ho prodotto diverse (fortunatamente non 200) di queste bacheche e tuttavia alcune non sono riuscite a ottenere letture corrette sul loro indirizzo (specialmente nelle regioni di indirizzo più alte in cui tutte le tolleranze vengono in gioco contemporaneamente). Ho misurato tutte le possibili soluzioni e finalmente ho capito il mio problema. La mia analisi originale non includeva la tolleranza della tensione di alimentazione a 5 V, che è generata localmente da 12 V con un MC7805 su ciascuna scheda controller. Per scheda tecnica, l'MC7805 ha una tensione di uscita compresa tra 4,8 e 5,2 V.

Dopo averlo capito ho modificato l'analisi di Monte Carlo. Ora sembra così:

Inserisci qui la descrizione dell'immagine Inserisci qui la descrizione dell'immagine

Come puoi vedere ci sono belle aree sovrapposte, dove non posso assolutamente dire che questa tensione può significare solo questo indirizzo. Fondamentalmente tutti gli indirizzi che iniziano con n. 8 può ottenere una lettura falsa (con maggiori possibilità di letture false per indirizzi più alti).

Vorrei non come aggiungere diversi valori di resistenza rispetto a quello già utilizzato sulla scheda (come per la tesi che voglio ottimizzare per la produzione).

Io non desidera aggiungere un riferimento di tensione (ad esempio, il diodo Zener) per alimentare la rete di resistenza DAC.

Non riesco più a modificare la scheda controller (e non uso un regolatore di tensione più preciso).

Io posso comunque modificare il progetto del PCB / schematica della scheda del sensore!

Come posso assicurarmi di ottenere sempre letture corrette sull'indirizzo (o per programma o cambiando il circuito)?


3
+1 Bella domanda. Puoi fornire l'ultimo file asc LTspice in un pastebin da qualche parte? Quindi possiamo testare altre combinazioni?
dim

2
Ottima domanda, bel lavoro per capire cosa l'ha effettivamente causato prima di chiedere una guida qui. Ora la domanda e la risposta sono una buona lettura per chiunque passi invece che solo per te :-)
Mast

Risposte:


19

Secondo le tue simulazioni, il tuo schema di indirizzamento funziona bene fintanto che vengono considerate solo le incertezze nei valori dei resistori. È l'incertezza sulla tensione che la fa fallire.

Il mio consiglio è di cancellare le fluttuazioni del VCC utilizzandolo come riferimento all'ADC. Puoi farlo programmando i REFSbit nel ADMUXregistro, come spiegato nel foglio dati :

inserisci qui la descrizione dell'immagine

Quando si passa a VCC come tensione di riferimento per ADC, non si misurerà più la tensione, ma un rapporto tra i valori della resistenza e quelli precisi all'1%. Non sono necessarie modifiche allo schema (anche se potresti voler aumentare il valore di R7 per ottenere le tue misure al centro dell'intervallo di conversione di ADC), solo il firmware di Attiny deve essere aggiornato.

Se sei ancora disposto a rielaborare la scheda del sensore, puoi sostituire lo schema con una scala R-2R come suggerito da Cano64:

schematico

simula questo circuito - Schema creato usando CircuitLab

Ciò ottimizzerà la risoluzione rendendo uguali tutti i passaggi della scala. I resistori all'1% sono abbastanza precisi da costruire scale monotoniche fino a 5 bit.


Doh! Non ho visto la foresta per gli alberi. Ero così fissato su quel 1.1V ... Grazie mille! Ci proverò.
KarlKarlsom,

1
Testato e funziona. Grande!
KarlKarlsom,

L'ho provato con VCC come AREF e un resistore da 220k per R7. In seguito potrei provare a simulare la scala 100k, 220k R-2R e vedere se mi dà risultati ancora migliori. Grazie ancora!
KarlKarlsom,

3

Ho dovuto risolvere un problema simile una volta. Avevo bisogno di collegare 4 pulsanti a un pin analogico su Arduino, tuttavia avevo bisogno di riconoscere le pressioni simultanee (tutte le combinazioni). Ho creato lo stesso circuito come te, poi ho scritto un programma per cercare tutte le possibili combinazioni di valori della resistenza in modo che i valori finali quando si premono i pulsanti, siano il più possibile separati. Indovina un po? Siamo fregati, non si può fare. Tutto qui, buona giornata.

Ho imparato che i valori di resistenza ottimali per gli interruttori sono vicini a R, 2R, 4R, 8R e la parte inferiore del divisore ha un valore di R. Il tuo circuito è già vicino a quello ottimale, devi solo sostituire R7 con 10k resistore.

Ma c'è una buona notizia per te. Dato che devi solo impostare un indirizzo (non azionerai lo switch mentre il dispositivo è in esecuzione) ti consiglio di utilizzare invece gli switch SPDT e la scala R2R .


Perché non è stato possibile farlo? Cosa è successo quando hai collegato i tuoi interruttori ai resistori (R, 2R, 4R, 8R)? Quali combinazioni non hanno funzionato?
Dmitry Grigoryev il

A proposito, la scala R-2R è un suggerimento eccellente!
Dmitry Grigoryev il

+ Dmitry Volevo dire che le stesse tensioni di uscita sono troppo vicine per distinguerle in modo affidabile.
Cano64,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.