Sélection d'adresse de bus 4 bits via une broche d'entrée analogique: la simulation Monte Carlo montre des valeurs d'adresse qui se chevauchent

16

J'ai conçu un petit PCB de capteur pour ma thèse de maîtrise avec un microcontrôleur ATtiny44 . J'ai besoin d'environ 200 de ces cartes pour mon application et 16 sont toujours connectées localement à la carte contrôleur. L'ensemble du réseau ressemble à ceci:

Entrez la description de l'image ici

Pour communiquer entre le contrôleur et les cartes de capteurs, j'ai écrit mon propre bus à 1 broche (basé sur le timing). Le seul problème est que la carte capteur doit avoir une adresse pour connaître son emplacement dans le réseau, lorsque j'envoie ses données à la carte contrôleur.

Comme il ne me restait qu'une seule broche sur l'ATtiny, j'ai trouvé un circuit DAC basé sur des cavaliers qui devrait générer une tension analogique basée sur le réglage de quatre cavaliers. Comme le circuit du capteur utilise les valeurs (47, 470, 1k, 3k, 4k7, 10k, 100k et 220k) et que je voulais optimiser pour la production, j'ai utilisé les valeurs ci-dessous pour le DAC (essentiellement 100k, 50k, 20k et 10k ). Ce qui devrait me donner une belle valeur entre 0 V et 760 mV en fonction du réglage du cavalier. Exactement ce que j'avais besoin de lire comme une tension analogique avec la référence interne 1,1 V de l'ATtiny. Au démarrage, l'ATtiny lit cette tension et doit connaître sa position.

schématique

simuler ce circuit - Schéma créé à l'aide de CircuitLab

En théorie, cela fonctionne bien. J'ai même fait une analyse de Monte Carlo dans LTspice pour confirmer que je n'ai pas de zones de chevauchement, en considérant la tolérance des résistances (toutes sont de 1% BTW). Vous trouverez ci-dessous les photos de cette analyse.

Entrez la description de l'image ici Entrez la description de l'image ici

Maintenant, j'ai produit plusieurs (heureusement pas 200) de ces cartes et pourtant certaines n'ont pas réussi à obtenir des lectures correctes sur leur adresse (en particulier dans les régions à adresse supérieure où toutes les tolérances viennent jouer en même temps). J'ai mesuré toutes les solutions possibles et finalement trouvé mon problème. Mon analyse d'origine ne comprenait pas la tolérance de la tension d'alimentation de 5 V, qui est générée localement à partir de 12 V avec un MC7805 sur chaque carte contrôleur. Par fiche technique, le MC7805 a une tension de sortie comprise entre 4,8 et 5,2 V.

Après avoir compris cela, j'ai modifié l'analyse de Monte Carlo. Cela ressemble maintenant à ceci:

Entrez la description de l'image ici Entrez la description de l'image ici

Comme vous pouvez le voir, il y a de belles zones qui se chevauchent, où je ne peux pas dire avec certitude que cette tension ne peut signifier que cette adresse. Fondamentalement, toutes les adresses commençant par no. 8 peut obtenir une fausse lecture (avec des possibilités plus élevées de fausses lectures pour des adresses plus élevées).

Je ne voudrais pas ajouter des valeurs de résistance différentes de celle déjà utilisée sur la carte (comme pour la thèse que je souhaite optimiser pour la production).

Je ne voudrais pas ajouter une référence de tension (par exemple, la diode Zener) pour alimenter le réseau de résistances DAC.

Je ne peux plus modifier la carte contrôleur (et y utiliser un régulateur de tension plus précis).

Je peux toujours modifier la conception / le schéma PCB de la carte du capteur!

Comment puis-je m'assurer d'obtenir des lectures toujours correctes sur l'adresse (soit par programme, soit en changeant de circuit)?

KarlKarlsom
la source
3
+1 Belle question. Pouvez-vous fournir le dernier fichier asc LTspice dans une boîte à pâte quelque part? Nous pouvons donc tester d'autres combinaisons?
dim
2
Grande question, beau travail pour déterminer ce qui l'a réellement causé avant de demander des conseils ici. Maintenant, la question et la réponse sont une bonne lecture pour tous ceux qui passent au lieu de juste vous :-)
Mast

Réponses:

19

Selon vos simulations, votre schéma d'adressage fonctionne correctement tant que seules les incertitudes sur les valeurs des résistances sont prises en compte. C'est l'incertitude sur la tension qui la fait échouer.

Mon conseil est d'annuler les fluctuations sur VCC en l'utilisant comme référence à l'ADC. Vous pouvez le faire en programmant les REFSbits dans le ADMUXregistre, comme expliqué dans la fiche technique :

entrez la description de l'image ici

Une fois que vous passez au VCC en tant que tension de référence pour l'ADC, vous ne mesurerez plus la tension, mais un rapport entre les valeurs des résistances et celles-ci sont précises à 1%. Aucune modification n'est requise dans le schéma (bien que vous souhaitiez peut-être augmenter la valeur de R7 pour obtenir vos mesures au milieu de la plage de conversion d'ADC), seul le firmware d'Attiny doit être mis à jour.

Si vous êtes toujours prêt à retravailler la carte du capteur, vous pouvez remplacer votre schéma par une échelle R-2R comme l'a suggéré Cano64:

schématique

simuler ce circuit - Schéma créé à l'aide de CircuitLab

Cela optimisera la résolution en rendant toutes les étapes de l'échelle égales. Les résistances de 1% sont suffisamment précises pour construire des échelles monotones jusqu'à 5 bits.

Dmitry Grigoryev
la source
Ah! Je n'ai pas vu la forêt pour les arbres. J'étais tellement obsédé par ce 1.1V ... Merci beaucoup! Je vais essayer ça.
KarlKarlsom
1
Testé et ça marche. Génial!
KarlKarlsom
Je l'ai testé avec VCC comme AREF et une résistance 220k pour R7. Je pourrais plus tard essayer de simuler une échelle R-2R de 100k, 220k et voir si cela me donne des résultats encore meilleurs. Merci encore!
KarlKarlsom
3

J'ai dû résoudre un problème similaire une fois. J'avais besoin de connecter 4 boutons à une broche analogique sur Arduino, mais j'avais besoin de reconnaître les pressions simultanées (toutes les combinaisons). Je suis arrivé avec le même circuit que vous, puis j'ai écrit un programme pour rechercher toutes les combinaisons de valeurs de résistance possibles afin que les valeurs finales lorsque vous appuyez sur les boutons, soient aussi éloignées que possible. Devine quoi? Nous sommes foutus, cela ne peut pas être fait. Voilà, bonne journée.

J'ai appris que les valeurs de résistance optimales pour les commutateurs sont proches de R, 2R, 4R, 8R et la partie inférieure du diviseur a une valeur de R. Votre circuit est déjà proche de l'optimal, il vous suffit de remplacer R7 par 10k résistance.

Mais il y a une bonne nouvelle pour vous. Puisque vous avez juste besoin de définir une adresse (vous n'actionnerez pas le commutateur pendant que l'appareil fonctionne), je recommande d'utiliser à la place des commutateurs SPDT et une échelle R2R .

Cano64
la source
Pourquoi cela ne pouvait-il pas être fait? Que s'est-il passé lorsque vous avez connecté vos commutateurs à des résistances (R, 2R, 4R, 8R)? Quelles combinaisons n'ont pas fonctionné?
Dmitry Grigoryev
L'échelle R-2R est une excellente suggestion d'ailleurs!
Dmitry Grigoryev
+ Dmitry Je voulais dire la même des tensions de sortie sont trop proches pour les distinguer de manière fiable.
Cano64