This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| pt:examples:sensor:potentiometer [2015/12/09 15:31] – artica | pt:examples:sensor:potentiometer [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Potenciómetro ====== | ||
| + | // | ||
| + | [HW] [[en: | ||
| + | [ELC] [[en: | ||
| + | [AVR] [[en: | ||
| + | [LIB] [[en: | ||
| + | |||
| + | ===== Teoria ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Potenciômetro é uma resistência três resistor terminal, com resistÊncia fixa entre os seus dois contatos laterais e resistência variável entre o lado e contato do meio. Em princípio um potenciômetro é um atenuador (divisor de tensão), onde a resistência é formada entre contatos laterais e o contato do meio. | ||
| + | |||
| + | Um potenciómetro típico consiste em um resistor com superfícies condutoras e um contacto deslizante chamado deslizante. Quanto mais perto estiver a barra para a extremidade do resistor, menor será a resistência entre o cursor e o bordo e vice-versa. Um material de alta resistividade ou bobina feita de fio de resistência pode actuar como um resistor. Alguns potenciômetros ter relações lineares ou logarítmicas entre a resistência ea posição do controle deslizante. Potenciômetros são principalmente de volta única (exemplo na imagem), mas existem também potenciômetros deslizantes. Um tipo especial de potenciômetros são potenciômetros digitais, onde a regulação da resistência é feito dentro do esquema de micro de acordo com os sinais. | ||
| + | |||
| + | ===== Prática ===== | ||
| + | [{{ : | ||
| + | |||
| + | No módulo do HomeLab encontra-se um potenciometro de viragem de 10 kΩ. Este potenciómetro é ligado entre a terra e os potenciais de fornecimento do microcontrolador e o controle deslizante está ligada ao conversor analógico-digital (ADC). Com esta ligação, a tensão do potenciómetro de saída pode ser regulada entre 0 V e o fornecimento do microcontrolador. O valor digital da tensão de saída do potenciómetro em toda a sua gama de ajuste pode ser medido se a tensão de comparação AVR conversor digital-analógico for tomada a partir do pino AVCC. Para o Homelab III, a tensão máxima do pino AVCC é de 2.7 V, mas as entradas podem fornecer 3.3 volts. As seguintes funções para AVR ADC encontram-se na biblioteca do HomeLab: | ||
| + | |||
| + | * void adc_init(reference, | ||
| + | * unsigned short adc_get_value(channel) | ||
| + | * unsigned short adc_get_average_value(channel, | ||
| + | |||
| + | A função // | ||
| + | |||
| + | As seguintes funções da biblioteca são providenciadas para apoiar o conversor ADC ATmega2561. | ||
| + | |||
| + | ~~CL~~ | ||
| + | |||
| + | <code c> | ||
| + | // 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; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | No exemplo explicado anteriormente, | ||
| + | |||
| + | Deve ser notado onde está a ser ligado o potenciómetro analógico no hardware em particular. Por exemplo, se está conectado a um canal analógico 3 no caso do Homelab Sensor Módulo II ou canal analógico 15 no caso do módulo Home Labor III Interface. | ||
| + | |||
| + | <code c> | ||
| + | // Example program of potentiometer on the Sensor module | ||
| + | // The position of the potentiometer is displayed on the 7-segment indicator | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Robotic HomeLab II | ||
| + | //#define ADC_CHANNEL 3 | ||
| + | |||
| + | // Robotic HomeLab III | ||
| + | #define ADC_CHANNEL 15 | ||
| + | |||
| + | // Main program | ||
| + | int main(void) | ||
| + | { | ||
| + | int value; | ||
| + | |||
| + | // Adjusting 7-segment indicator | ||
| + | segment_display_init(); | ||
| + | |||
| + | // Adjusting ADC | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Endless loop | ||
| + | while (1) | ||
| + | { | ||
| + | // Reading 4 times rounded values of the channel | ||
| + | value = adc_get_average_value(ADC_CHANNEL, | ||
| + | |||
| + | // Displaying the hundreds of the indicated value | ||
| + | // Robotic HomeLab II | ||
| + | // | ||
| + | // Robotic HomeLab III | ||
| + | segment_display_write(value * 10 / 2048); | ||
| + | } | ||
| + | } | ||
| + | </ | ||