This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| fr:examples:sensor:potentiometer [2010/03/09 15:16] – sdeniaud | fr:examples:sensor:potentiometer [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Potentiomètre ====== | ||
| + | //Necessary knowledge : [HW] [[en: | ||
| + | |||
| + | // | ||
| + | |||
| + | ===== Théorie ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Le potentiomètre est une résistance à trois bornes, qui règle la résistivité entre ses deux contacts sur les bords et le contact central, tel une résistance variable. Le potentiomètre est un atténuateur (diviseur de tension), où la résistance est formée entre les contacts des bords et le contact central. | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Un potentiomètre classique consiste en une résistance avec des surfaces conductrices d’électricité et d'un contact glissant appelé curseur. Plus le curseur est proche du bord de la résistance, | ||
| + | |||
| + | ===== Pratique ===== | ||
| + | |||
| + | Dans le module du //HomeLab// il y a un potentiomètre rotatif de 4.7 kΩ. Ce potentiomètre est connecté entre la terre et un potentiel de +5V puis le curseur est connecté à la voie 3 du convertisseur analogique-numérique. Connecté tel quel, la tension de sortie du potentiomètre peut varier entre 0 et 5V La valeur numérique de la tension de sortie du potentiomètre peut être mesuré dans sa plage entière si la tension de comparaison du convertisseur analogique-numérique est pris depuis la broche AVCC. Dans la librairie du //HomeLab// on retrouve les fonctions suivantes pour utiliser l’AVR ADC : | ||
| + | |||
| + | ~~CL~~ | ||
| + | |||
| + | <code c> | ||
| + | // | ||
| + | // Data types for adjustment | ||
| + | // | ||
| + | typedef enum | ||
| + | { | ||
| + | ADC_REF_AREF = 0x00, | ||
| + | ADC_REF_AVCC = 0x01, | ||
| + | ADC_REF_2V56 = 0x03 | ||
| + | } | ||
| + | adc_reference; | ||
| + | |||
| + | typedef enum | ||
| + | { | ||
| + | ADC_PRESCALE_2 | ||
| + | ADC_PRESCALE_4 | ||
| + | ADC_PRESCALE_8 | ||
| + | ADC_PRESCALE_16 | ||
| + | ADC_PRESCALE_32 | ||
| + | ADC_PRESCALE_64 | ||
| + | ADC_PRESCALE_128 = 0x07 | ||
| + | } | ||
| + | adc_prescale; | ||
| + | |||
| + | // | ||
| + | // Starting the ADC | ||
| + | // | ||
| + | void adc_init(adc_reference reference, adc_prescale prescale) | ||
| + | { | ||
| + | // Allowing ADC to operate, selecting the frequency divider | ||
| + | ADCSRA = bit_mask(ADEN) | (prescale & 0x07); | ||
| + | |||
| + | // Selecting comparison voltage | ||
| + | ADMUX = (reference & 0x03) << REFS0; | ||
| + | } | ||
| + | |||
| + | // | ||
| + | // Converting the values of selected channel | ||
| + | // | ||
| + | unsigned short adc_get_value(unsigned char channel) | ||
| + | { | ||
| + | // Setting the channel | ||
| + | ADMUX = (ADMUX & 0xF0) | (channel & 0x0F); | ||
| + | |||
| + | // Starting the conversion | ||
| + | bit_set(ADCSRA, | ||
| + | |||
| + | // Waiting the end of the conversion | ||
| + | while (bit_is_set(ADCSRA, | ||
| + | { | ||
| + | asm volatile (" | ||
| + | } | ||
| + | |||
| + | // Returning the results | ||
| + | return ADCW; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | La fonction '' | ||
| + | |||
| + | Dans cet exemple on a déjà expliqué le convertisseur analogique-numérique et on utilise la librairie concernant l’afficheur 7 segments. La valeur de 10 bits du convertisseur analogique-numérique est multipliée par 10 et divisée par 1024 afin d’obtenir une valeur entre 0 et 9. La valeur 10 est impossible parce que lorsqu’on divise en langage C seules les valeurs entières sont calculées, pas les résultats exacts. Pour avoir un résultat avec plus de précision on utilise la fonction de résultat moyen du calculateur. Comme résultat le programme indique le numéro entre 0 et 9 qui correspond à la position du potentiomètre sur l’indicateur. | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | // | ||
| + | // Example program of potentiometer on the Sensor module | ||
| + | // The position of the potentiometer is displayed on the 7-segment indicator | ||
| + | // | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // | ||
| + | // Selecting the channel | ||
| + | // | ||
| + | // 1 = photoresistor | ||
| + | // 2 = thermistor | ||
| + | // 3 = potentiometer | ||
| + | // | ||
| + | #define ADC_CHANNEL 3 | ||
| + | |||
| + | // | ||
| + | // Main program | ||
| + | // | ||
| + | int main(void) | ||
| + | { | ||
| + | int value; | ||
| + | |||
| + | // Adjusting 7-segment indicator | ||
| + | segment_display_init(); | ||
| + | |||
| + | // Adjusting ADC | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Endless loop | ||
| + | while (true) | ||
| + | { | ||
| + | // Reading 4 times rounded values of the channel | ||
| + | value = adc_get_average_value(ADC_CHANNEL, | ||
| + | |||
| + | // Displaying the hundreds of the indicated value | ||
| + | segment_display_write(value * 10 / 1024); | ||
| + | } | ||
| + | } | ||
| + | </ | ||