====== 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);
}
}