====== Potenciómetro ====== //Conhecimento prévio: [HW] [[en:hardware:homelab:digi]], [ELC] [[en:electronics:voltage_divider]], [AVR] [[en:avr:adc]], [LIB] [[en:software:homelab:library:adc]], [LIB] [[en:software:homelab:library:module:segment_display]]// ===== Teoria ===== [{{ :examples:sensor:potentiometer:sensor_potentiometer_designator.png?120|Símbolo eléctrico do potenciómetro}}] 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 ===== [{{ :examples:sensor:pote.png?250|Potenciómetro de volta única}}] 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, prescale) * unsigned short adc_get_value(channel) * unsigned short adc_get_average_value(channel, num_samples) A função //adc_init// tem de ser chamada no inicio do programa, é utilizada para fazer o ADC funcionar. A voltagem de referência tem de ser seleciona ou do pino AREF ou do pino AVCC, ou ser selecionada voltagem fixa interna. Adicionalmente o ciclo do relógio do conversor tem de ser configurado pelo prescaler (factor de divisão de frequência), que será usado para dividir o ciclo de relógio do controlador. A conversão é rápida quando utilisando ciclo de relógio alto mas com isto baixa a acuracia . A função //adc_get_value// é usada para medir, permite selecionar o canal e retorna um resultado de 10 bits (11-bit para o Homelab III). A função de medição é inter bloqueio, portanto, ela aguarda o fim da conversão e retorna os resultados só depois de todas as medições serem feitas. As seguintes funções da biblioteca são providenciadas para apoiar o conversor ADC ATmega2561. ~~CL~~ // 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, ADSC); // Waiting the end of the conversion while (bit_is_set(ADCSRA, ADSC)) { asm volatile ("nop"); } // Returning the results return ADCW; } No exemplo explicado anteriormente, são usados o programa conversor analógico-digital e a biblioteca de indicador de números de 7 segmentos. O valor do conversor analógico-digital é multiplicado por 10 e dividido por 2048 para obter o valor entre 0 e 9. O valor 10 é impossível chegar devido aos arredondamentos em inteiros na linguagem C. Função da média do resultado do conversor é usado para obter resultados mais precisos. Derivados disto este programa de operação mostra os números de 0 a 9, que correspondem à posição do potenciómetro no indicador. 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. // 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, ADC_PRESCALE_16); // Endless loop while (1) { // Reading 4 times rounded values of the channel value = adc_get_average_value(ADC_CHANNEL, 4); // Displaying the hundreds of the indicated value // Robotic HomeLab II //segment_display_write(value * 10 / 1024); // Robotic HomeLab III segment_display_write(value * 10 / 2048); } }