Outils pour utilisateurs

Outils du site


issue129:great_cow_basic

Correction: In the previous article I compared the compiled file sizes, the given sizes are in Byte, not in KByte. My apologies for this inaccuracy.

Correction : Dans l'article précédent, j'ai comparé les tailles des fichiers compilés ; les tailles sont en octets, et non en Koctets. Mes excuses pour cette imprécision.

In the last issue I introduced you to the software and hardware pulse width modulation (PWM) to dim a LED. And in the first examples we needed not much hardware than the microcontroller, a resistor and a LED. And, in these first few examples the only hardware/components we need are a microcontroller, a resistor and an LED. This time I will show you how you can set the brightness of the LED or the speed of the PWM by controlling it with a potentiometer. For a good explanation of a potentiometer see: https://en.wikipedia.org/wiki/Potentiometer In the previous example we learned that a microcontroller can understand if a switch (or any other device) is ‘ON’ (operating at between 3/5V) or ‘OFF’ (operating at 0V) because of its digital nature, but how will the microcontroller know that a voltage is somehow in between (e.g. at 2.3 Volts)? We can use the inbuilt analog to digital conversion of the attiny13a. Besides controlling the microcontroller within the source code, this will be the first time the microcontroller can be controlled from the outside world.

Dans le dernier numéro, je vous ai présenté les modulations de largeur d'impulsion logicielle et matérielle (PWM - Pulse Width Modulation) pour faire varier l'éclairage d'une LED. Et, dans les premiers exemples, nous n'avions pas besoin d'autre matériel qu'un microcontrôleur, une résistance et une LED. d52fr aux relecteurs : suppression d'une phrase redondante !

Cette fois, je vous montrerai comment vous pouvez régler la luminosité de la LED ou la vitesse du PWM en la contrôlant avec un potentiomètre. Pour une bonne explication en français sur le potentiomètre, voir : https://fr.wikipedia.org/wiki/Potentiom%C3%A8tre.

Dans l'exemple précédent, nous avons appris que le microcontrôleur peut comprendre si un interrupteur (ou n'importe quel autre dispositif) est allumé (se trouvant entre 3 et 5 V) ou éteint (se trouvant à O V) du fait de sa nature digitale ; mais, comment le microcontrôleur peut-il savoir qu'une tension est quelque part entre les deux (par ex., à 2,3 V) ? Nous pouvons utiliser la conversion analogique/digitale intégrée du attiny13a. Hormis le pilotage du microcontrôleur dans le code source, ce sera la première fois que le microcontrôleur pourra être piloté depuis le monde extérieur.

Analog to digital conversion The attiny13a features a 10-bit successive approximation analog to digital conversion (ADC), which means, that the input voltage is repeatedly compared to a reference voltage until the input and the reference voltage are nearly equal. The attiny13a has 4 multiplexed ADC channel (PIN PB2-5), each one can be used independently to measure voltages. For the moment we leave out some special functions such as free running mode, start ADC on interrupt or trigger an interrupt after conversion. The datasheet of the attiny13a has detailed information about this topic, but Great Cow BASIC has got you covered, so that using the ADC can be done quite easily. For the actual purpose I will use the single conversion mode of the ADC at the 8-bit resolution. This is precise enough, because the duty cycle of the PWM has the same resolution of 8-bit (values range from 0 - 255) so I do not need to map a higher to a lower resolution. Second I will use a medium frequency to measure the voltage; the higher the frequency the measurement takes place the more inaccurate the readings are. In 8-bit resolution every ADC value corresponds to a voltage level (ADC value = Volt255). If the microcontroller is powered at 5 V the measurement would read around 0.0196 mV per step. Powering it at 3 V the readings for each step would be around 0.0117 mV. See the table below for some arbitrary values.

La conversion analogique/digitale

Le attiny13a dispose d'une conversion analogique/digitale (ADC - analog/digital conversion) sur 10-bit par approximations successives, ce qui signifie que la tension d'entrée est en permanence comparée à une tension de référence jusqu'à ce que les tensions d'entrée et de référence soient à peu près égales. Le attiny13a dispose de 4 canaux ADC multiplexés (bornes PB2-5) ; chacune d'elles peut être utilisée indépendamment pour mesurer des tensions. Pour l'instant, nous laissons de côté certaines fonctions telles que le mode de fonctionnement libre, le démarrage de l'ADC sur interruption ou le déclenchement d'une interruption après conversion. La notice du attiny13a a des informations détaillées sur ce sujet, mais Great Cow BASIC saura vous satisfaire, ce qui fait que l'ADC peut être utilisée facilement.

Pour le besoin présent, j'utiliserai le mode de conversion simple de l'ADC avec une résolution de 8-bit. C'est suffisamment précis, car le rapport cyclique du PWM a la même résolution de 8-bit (gamme de valeurs de 0 à 255) ; aussi, je n'ai pas besoin d'une haute résolution pour ensuite passer à une basse. Deuxièmement, j'utiliserai une fréquence moyenne pour mesurer la tension ; plus la fréquence de mesure est haute, plus les lectures sont imprécises. Avec une résolution sur 8-bit, chaque valeur de l'ADC correspond à un niveau de tension (ADCvalue = Volt255). Si le microcontrôleur est alimenté sous 5 V, la mesure lira environ 0,0196 mV par pas. Alimenté sous 3 V, chaque pas de lecture vaudra environ 0,0117 mV. Voyez le tableau ci-dessous pour quelques valeurs arbitraires.

Controlling the LED To control the LED with the potentiometer I will expand the software PWM code to read the analog value of the potentiometer and set the brightness accordingly. This works of course with the hardware PWM variants of the previous article, I have not included the PWM variants out to streamline this article.

Le pilotage de la LED

Pour piloter la LED avec le potentiomètre, j'étendrai le code du PWM logiciel pour qu'il lise la valeur analogique du potentiomètre et règle la luminosité en conséquence.

Ceci fonctionne, bien sûr, avec les variantes du PWM matériel de l'article précédent ; pour simplifier cet article, je n'ai pas inclus les variantes du PWM.

Breadboard circuitry I assume that you flashed the program to the microcontroller with your preferred programmer or an Arduino as ISP. To try out the program now place the attiny13a somewhere in the middle of a breadboard so that the upper and the lower side are placed above and under the middle line of the breadboard. I prefer to have PIN 8 (VCC) on the upper left hand corner of the breadboard. The potentiometer should have three terminals, place the potentiometer: the terminals are in front of you and begin to connect from left to right: first terminal should go to ground, second to PIN 3 (PB4) of the microcontroller and third terminal should go to positive supply voltage (VCC). If the terminals are not properly connecting to the breadboard solder some wires to the terminals or stick a male / female jumper wire to them and connect the wires to the breadboard (if you have another form of potentiometer please refer to the appropriate datasheet). Then connect the anode (long lead) of the LED through a 220 Ohm resistor with PIN 6 (PB1) and the cathode (short lead) of the LED to Ground. After this connect the power supply and see how the brightness of the LED changes by turning the potentiometer left or right.

Le circuit sur la plaque d'essai

Je présume que vous avez flashé le programme sur le microcontrôleur avec votre programmateur préféré ou un Arduino comme ISP. Maintenant, pour tester le programme, placez le attiny13a n'importe où au milieu de la plaque d'essai, de sorte que les côtés haut et bas soient placés au-dessus et en dessous de la ligne médiane de la plaque.

Je préfère avoir la borne 8 (VCC) tout en haut à gauche de la plaque. Le potentiomètre devrait avoir trois bornes. Posez le potentiomètre avec les connexions vers vous. Commencez les connexions de la gauche vers la droite ; la première va à la masse, la seconde à la borne 3 (PB4) du microcontrôleur et la troisième va sur la tension positive de l'alimentation (VCC). Si les bornes ne se connectent pas directement à la plaque d'essai, soudez des fils sur ces bornes ou branchez-leur un cavalier mâle/femelle et connectez les fils sur la plaque (si vous avez une autre forme de potentiomètre, référez-vous, s'il vous plaît, à la notice appropriée). Ensuite, connectez l'anode (la longue patte) de la LED, via une résistance de 220 ohms, à la borne 6 (PB1) et la cathode (patte courte) de la LED à la masse. Après cela, branchez l'alimentation et voyez comment la luminosité de la LED varie en tournant le potentiomètre à droite ou à gauche.

Conclusion Reading analog values is a very useful function of the microcontroller and there are many possible uses for it. Besides reading a potentiometer you could e. g. measure the systems battery status and implement a draining protection for your systems battery. As an exercise you could expand the code to not only control the brightness of the LED but also the length of the pauses. In the next article we will experiment further with the analog digital conversion and see if we can print out the measured values to the serial console.

Conclusion

La lecture de valeurs analogiques est une fonction très utile d'un microcontrôleur et il y a de nombreuses utilisations de celle-ci. Outre la lecture d'un potentiomètre, vous pouvez, par exemple, mesurer l'état des batteries d'un système informatique et installer une protection de la consommation des batteries du système. Comme exercice, vous pouvez étendre le code pour non seulement piloter la luminosité de la LED, mais aussi la longueur des pauses. Dans le prochain article, nous poursuivrons nos essais de conversion analogique/digitale pour voir si nous pouvons visualiser les valeurs mesurées sur un afficheur série.

References In depth explanation of the ADC http://maxembedded.com/2011/06/the-adc-of-the-avr/ ADC code optimisation http://gcbasic.sourceforge.net/help/_analog_digital_conversion_code_optimisation.html

Références

Explication approfondie de l'ADC : http://maxembedded.com/2011/06/the-adc-of-the-avr/

Optimisation du code de l'ADC : http://gcbasic.sourceforge.net/help/_analog_digital_conversion_code_optimisation.html

Acknowledgement I wish to thank Evan Venn (Anobium) from the Great Cow BASIC Team for his insights and valuable hints. Also thanks to Bernd Dau for the hint with wrong file sizes.

Remerciements

Je souhaite remercier Evan Venn (Anobium) de l'équipe Great Cow BASIC pour ses précieux renseignements et ses conseils pratiques.

Merci aussi à Bernd Dau pour sa remarque sur les tailles de fichiers erronés.

issue129/great_cow_basic.txt · Dernière modification : 2018/02/05 09:53 de auntiee