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:
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.
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.
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:
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)?
la source
Réponses:
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
REFS
bits dans leADMUX
registre, comme expliqué dans la fiche technique :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:
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.
la source
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 .
la source