mercredi 24 février 2016

megaprocessor, un projet incroyable.

Je veux seulement mentionner ici un projet qui m'impressionne par sa qualité et surtout l'incroyable quantité de travail que son auteur y a consacré. the mega processor comme son auteur l'a baptisé est un ordinateur fabriqué entièrement avec des transistors 2N7000. L'objectif de l'auteur, James Newman, est de rendre visible le fonctionnement interne du processeur. Ainsi tous les bits des différents registres sont connectés à une LED de sorte qu'on voit leur état 0/1. Il a même construit une mémoire de 32 mots de 8 bits avec une LED connecté à chacun de ces bits, Cette mémoire occupe un cadre d'aluminium complet à elle seule. Le processeur est composé de plusieurs cadre d'aluminium, 1 pour chaque unité logique: ALU, RAM, I/O, etc. Il faut voir les photos et vidéos sur son site WEB.

Impressionnant, un travail titanesque.

dimanche 27 décembre 2015

convertisseur numérique/analogique

La majorité des microcontrôleurs possèdent au moins un périphérique de conversion analogique/numérique. Par contre les convertisseurs numérique/analogiques sont moins répandus. Dans cette article je fais une présentation des différentes méthodes utilisées pour convertir un signal numérique en signal analogique.

PWM

Comme presque tous les MCU possèdent au moins 1 périphérique PWM l'utilisation de celui pour convertir un signal numérique en analogique est très répandu. Son principe de fonctionnement est basé sur l'intégration du signal ou si vous préférez la moyenne. Voici une illustration.

On a donc un signal numérique qui varie entre Vcc et 0 volt à la sortie d'une broche du MCU. Cependant le rapport cyclique de ce signal varie selon l'amplitude du signal analogique qu'on veut reproduire. Le filtre passe-bas composé d'une résistance R et d'un condensateur C sert d'intégrateur. L'onde rectangulaire du PWM est envoyée à l'entrée du filtre et à la sortie on retrouve un voltage dont la valeur et directement proportionnelle au rapport cyclique. En effet lorsque le signal est à Vcc le condensateur se charge à travers la résistance et lorsque le signal et à 0 volt le condensateur se décharge à travers la résistance. Lorsque le rapport cyclique est de 50% le voltage moyen est de Vcc/2. En fait le voltage moyen à la sortie est


Vout=Vcc/Rcy*100
où Rcy est le rapport cyclique exprimé en pourcentage du cycle. Pour que ce convertisseur fonctionne bien il faut que la fréquence de coupure Fc calculée par la formule:

  Fc=1/2*PI*R*C
soit beaucoup plus basse que la fréquence du PWM. Avec un filtre simple pôle comme celui illustré ici Fc doit-être au moins un dixième la fréquence PWM. Par exemple si on veut convertir un signal audio avec une fréquence maximale de 10Khz la fréquence PWM doit-être au minimun 20Khz et le filtre devrait avoir une valeur Fc de 2Khz ou plus bas. En remplaçant ce filtre simple par un filtre actif multipôles la fréquence de coupure du filtre peut-être au maximum la moitié de la fréquence PWM. Par exemple un filtre 8 pôles avec une fréquence de coupure 10Khz atténue la fréquence PWM de 48db. Alors que le filtre passif 1 pôle ne l'atténue que de 6db.

Cette méthode de conversion est simple et économique. On peut obtenir un résultat satisfaisant avec un filtre passif à 2 pôles. C'est à dire 2 filtres bout à bout. Mais dans ce cas On calcul Fc du premier filtre au double de la valeur de 2ième filtre en tenant compte de la charge du second filtre. Une façon simple de procéder est d'utiliser la même valeur pour R mais d'utiliser 2*C pour le deuxième filtre. L'impédance de sortie doit-être d'au moins 10 fois l'impédance de sortie du filtre pour ne pas le charger. exemple:


  Fpwm=20khz
  Fc=10Khz  et 1Kohm
  C=1/2*PI*R*FC ->> C= 1/2*PI*1000*10000=159nF 
la valeur standard la plus proche est de 150nF

Avec ce filtre il faut utiliser une fréquence PWM d'au moins 20Khz pour de l'audio jusqu'à 10Khz.

Conversion delta-sigma

Le convertisseur delta-sigma fonctionne sur le même principe d'intégration d'une onde rectangulaire sauf qu'il ne n'agit pas d'une fréquence constante dont le rapport cyclique varie selon l'amplitude du signal analogique. Les échantillons numériques n'ont qu'un seul bit. Pour représenter un voltage plus élevé on fait suivre plusieurs bit à 1 et pour représenter un signal de faible amplitude on fait suivre plusieurs bit à zéro. Les bits se succèdent à une fréquence beaucoup plus rapide que pour le PWM. On peut utiliser un périphérique SPI pour sortir les bits.

Plus il y a de 1 qui se succèdent plus le voltage monte à la sortie du filtre. Plus il y a de zéro qui se succèdent plus le voltage descend vers zéro. Pour que ça fonctionne il faut que les échantillons représentent une densité d'impulsion plutôt qu'une amplitude.

Conversion par diviseur de tension

Il y a 2 méthodes.

Première méthode: utilisation de résistances croissantes.

Ce convertisseur à 4 bits et chaque bit doit donner en tension en sortie qui est le double de celle du bit de poids précédent. Lorsque tous les bits en sortie sont à 1 on doit avoir une tension en sortie de:

  Vout=15*Vin/16
Supposons que la valeur de la résistance Ro est de 1Kohm. On doit avoir en sortie

Vout=1*Vin/16=Rb0*Vin/(Rb0+Ro) 
Rb0 doit-être de 15Kohm.
Rb1 doit-être de 15Kohm/2=7,5Kohm
Rb2 doit-être de 15Kohm/4=3,75Kohm
Rb3 doit-être de 1Kohm/8=1,875Kohm
Ces valeurs ne sont valides que si on met les bits qui ne sont pas à 1 en haute impédance et non à zéro volt. Car si on met c'est bits à zéro volt ça modifie la valeur de la branche basse du diviseur de tension. exemple si b0-b2 sont à zéro alors que b3 est à Vcc la valeur équivalente de Ro1 est de:

Ro = 1/(1/Ro+1/Rb0+1/Rb1+1/Rb2)= 682 ohm
donc la tension en sortie serait de

Vout = 1,875*Vin/(1,875+0,682)
au lieu de

Vout=1,875*Vin/(1,875+1)

Cette méthode n'est pas pratique car elle donne des valeurs de résistances non standard et oblige à mettre les bits qui ne sont pas à Vcc en haute impédance.

méthode R/2R

Heureusement il y a une méthode beaucoup plus simple. Le diviseur de tension R/2R n'utilise que 2 valeurs de résistances dont l'une est le double de l'autre d'où son nom.

Cette arrangement de résistances fait en sorte que quel que soit la valeur des bits en sortie la branche basse du diviseur de tension vue par les bits de poids plus faible garde une valeur constante de R. De plus on peut choisir 2 valeurs standards ou une seule valeur standard en utilisant 2 résistances en série pour les 2R. Le seul inconvénient c'est que ça demande plus de résistances.


  1. La valeur équivalente de résistances en parallèle est l'inverse de la somme de leur conductance.

lundi 14 septembre 2015

interface I2C

Dans cet article je présente le protocole i2C. qui est un bus de communication entre circuits intégrés. Ce type d'interface sérielle est utilisés avec de nombreux capteurs et aussi par certaines mémoires sérielles.

Inter-Integrated Circuit

I2C est l'abréviation pour Inter-Integrated Circuit. Il s'agit d'un protocole de communication sériel et synchrone utilisé pour la communication entre des circuits intégrés. Comme le SPI il s'agit d'un protocole bus, c'est à dire que plusieurs dispositifs peuvent-être connectés sur les même lignes de communication. Contrairement au protocole SPI il peut y avoir plusieurs maître sur le bus, c'est un bus Multi-maîtres, multi-esclaves. Il n'utilise que 2 fils pour la communication SDA et SCL par contre le débit est plus lent que pour un bus SPI. De plus la communication est semi-duplex, c'est à dire que la transmission et la réception se font en alternance.

Puisque les lignes de communication SDA et SCL peuvent-être contrôlées par plus d'un dispositifs il faut qu'elles soient configurées en drain ouvert. Il y a donc une résistance pull-up sur chaque ligne.

Seul un dispositif maître peut initier une communication. Mais puisqu'il peut y avoir plusieurs maître sur le bus, avant de débuter une transaction un maître doit vérifier l'état du bus. Évidemment s'il n'y a qu'un seul maître cette vérification peut être omise.

Dans cet introduction on ne verra que l'utilisation la plus simple soit un MCU utilisant une mémoire EEPROM et deux sondes de température branchés sur le même bus I2C.

Disons que ce dispositif sert à lire deux températures et à enregistrer les données dans la mémoire EEPROM. Les lignes A0-A2 sont branchées soit à Vdd ou Vss pour sélectionner l'adresse du périphérique. Ainsi l'EEPROM est à l'adresse 0 (b000), la sonde 1 à l'adresse 2 (b010) et la sonde 2 à l'adresse 4 (b100). Il s'agit des 3 bits les moins significatifs de l'adresse car en fait l'adresse est de 7 bits. Cette adresse constitue les 7 bits les plus significatifs du premier octet envoyé par le mettre sur le bus. Le bit le moins significatif (b0) indique si le maître veut transmettre (0) ou recevoir (1). Par exemple pour une mémoire EEPROM Microchip 24LC512 il y a 3 broches de sélections pour les 3 bits les moins significatifs de l'adresse pour une plage hexadécimal qui va de 0x50..0x57. Cette adresse étant décalée vers la gauche de 1 bit on a en fait 0xA0,0xA2,0xA4,0xA6,0xA8,0xAA,0xAC,0xAE.

Adressage

Puisqu'il y a plusieurs dispositifs sur le même bus et qu'il n'y a pas de ligne Slave Select il faut une autre méthode pour distinguer les différents périphériques. Le protocole I2C utilise un adressage via le canal de données. Le maître procède de la manière suivante pour communiquer avec un périphérique esclave.

  1. Envoie du START bit.
  2. Envoie de l'octet d'adresse avec le bit 0
  3. Le bit 0 est à écriture(0)/lecture(1)
  4. Si un dispositif sur le bus reconnait l'adresse il répond par un ACK bit.
  5. Si le maître reçoit un ACK bit il peut continuer à transmettre ou recevoir en utilisant la ligne SCL pour cadencer les bits.
  6. Une transmission se termine par un STOP bit.

Lorsque le bus est inactif les 2 lignes sont à 1. Pour signaler un START le maître garde la ligne SCL à 1 et fait passer la ligne SDA de 1 à 0. Pour un STOP c'est l'opposé, la ligne SCL toujours à 1 et la ligne SDA passe de 0 à 1. Toutes les autres transitions de la ligne SDA se font lorsque la ligne SCL est à 0.

Le maître contrôle la ligne SCL et après l'envoie de chaque octet il doit envoyer un cycle supplémentaire sur la ligne SCL pour lire le bit ACK envoyé par l'esclave. Notez que ce bit ACK n'est envoyer pendant la phase d'adressage qu'après le bit WRITE/READ. Le maître doit lire le bit ACK pour s'assurer que l'octet a bien été reçu. On a donc 9 périodes du signal clock par octet envoyé. Lorsque le maître est en mode réception c'est lui qui doit envoyer un bit ACK pour chaque octet reçu. Cependant il ne doit pas envoyer de ACK pour le dernier octet reçu. Dans ce cas l'esclave cesse la transmission et attend le stop bit. Les octets sont transmis en commençant par le bit le plus significatif.

extrait du feuillet de spécification du 24LC512

Dans le cas des dispositifs Microchip utilisés dans le montage ci-haut l'octet d'adressage se compose de 4 bits fixes et de 3 bits programmables par les broches.

extrait du feuillet de spécifications du 24LC512

Pour connaître l'adresse I2C de chaque dispositif il faut consulter le feuille de spécification. Ce n'est pas tous les dispositifs qui offre une plage de 8 adresses. Par exemple certains petits affichages OLED graphique utilisant un controlleur SSD1306 ne permettent que 2 adresses 0x3C ou 0x3D (0x78,0x7A décalée vers la gauche).

Puisqu'un ACK doit-être envoyé à chaque octet transmis le MCU doit reconfiguré la ligne SDA en conséquence. Par exemple lorsqu'il transmet il doit configuré la broche qui sert de SDA en mode entrée pour recevoir le ACK et la remettre en mode sortie autrement. Lorsqu'il reçoit c'est le contraire il doit garder cette broche configurée en entrée et la mettre en sortie pour transmette le ACK.

Mette en application une interface I2C en logiciel es plus complexe que pour une interface SPI à cause du changement continuel de direction de la ligne SDA. Pour un exemple concret d'utilisation vous pouvez consulter le projet sonnette d'entrée sur ce blog.

Conclusion

Le seul avantage de l'interface I2C par rapport au SPI est le nombre réduit de broches requises sur le MCU. Autrement la vitesse de communication est plus lente et la mise en oeuvre plus complexe au niveau logiciel s'il n'y a pas de périphérique I2C intégré au MCU. Les périphériques I2C intégrés au MCU sont plus rares que les périphériques SPI. Donc plus souvent qu'autrement on doit le faire en bit bang.