====== Потенциометр ====== //Необходимые знания: [HW] [[et:hardware:homelab:sensor]], [HW] [[et:hardware:homelab:digi]], \\ [ELC] [[et:electronics:voltage_divider]], [AVR] [[et:avr:adc]], [LIB] [[et:software:homelab:library:adc]], \\ [LIB] [[et:software:homelab:library:module:segment_display]]// ===== Теория ===== [{{ :examples:sensor:potentiometer:sensor_potentiometer_designator.png?120|Электрическое обозначение потенциометра}}] Потенциометр это переменный резистр с тремя контактами, где между двумя крайними контактами находится фиксированное сопротивление, а между крайними и средним контактами - переменное сопротивление. Потенциометр, в принципе, является и делителем напряжения, где сопротивления образуются между крайними и средним контактами. Синоним потенциометра (на английском языке //potentiometer//) - реостат (на английском //rheostat//). [{{ :examples:sensor:potentiometer:sensor_potentiometer_turn.jpg?120|Поворотный потенциометр}}] Типичный потенциометр состоит из сопротивления с токопроводящей поверхностью и из скользящего по ней подвижного контакта – движка. Чем ближе движок к углу сопротивления, тем меньше сопротивление между движком и этим углом, и наоборот. В роли сопротивления может выступать материал с большим удельным сопротивлением или обмотка скрученная из проволоки сопротивления. Существуют потенциометры как с линеарным, так и логарифмическим сопротивлением и позиционным отношением. Большая часть потенциометров поворотные (пример на картинке справа), но имеются так же и сопротивления скользящего типа. Особенный тип потенциометра это дигитальные потенциометры, в которых регулировка сопротивления происходит внутри микросхемы в соответствии с управляющими сигналами. ===== Практика ===== На плате модуля «Датчики» Домашней Лаборатории находится поворотный потенциометр 4,7 kΩ. Потенциометр подключен между землей и +5 V потенциалами, а движок соединен с каналом 3 аналого-дигитального преобразователя микроконтроллера. В таком случае можно регулировать выходное напряжение потенциометра в пределах от 0 до 5 V. Если опорное напряжение аналого-дигитального преобразователя AVR взять с вывода AVCC, то выходное напряжение потенциометра получит дигитальное значение на протяжении всей границы его регулирования. Для использования ADC AVR в библиотеке Домашней Лаборатории написаны следующие функции: ~~CL~~ // // Типы данных настроек // typedef enum { ADC_REF_AREF = 0x00, ADC_REF_AVCC = 0x01, ADC_REF_2V56 = 0x03 } adc_reference; typedef enum { ADC_PRESCALE_2 = 0x01, ADC_PRESCALE_4 = 0x02, ADC_PRESCALE_8 = 0x03, ADC_PRESCALE_16 = 0x04, ADC_PRESCALE_32 = 0x05, ADC_PRESCALE_64 = 0x06, ADC_PRESCALE_128 = 0x07 } adc_prescale; // // Запуск ADC // void adc_init(adc_reference reference, adc_prescale prescale) { // Разрешение работать ADC, выбор частотного делителя ADCSRA = bit_mask(ADEN) | (prescale & 0x07); // Выбор опорного напряжения ADMUX = (reference & 0x03) << REFS0; } // // Преобразование значения обозначеного канала // unsigned short adc_get_value(unsigned char channel) { // Обозначение канала ADMUX = (ADMUX & 0xF0) | (channel & 0x0F); // Начало преобразования bit_set(ADCSRA, ADSC); // Ожидание окончания преобразования while (bit_is_set(ADCSRA, ADSC)) { asm volatile ("nop"); } // Возвращение результата return ADCW; } Функцию //adc_init// нужно вызвать в начале программы, с помощью чего настраивается работоспособность AVR-а ADC. Cледует выбрать опорное напряжение с вывода AREF или AVCC, или наоборот входное фиксированное напряжение 2,56 V. В добавок нужно обозначить рабочий такт преобразователя, а точнее предварительный делитель частоты, с помощью которого делится рабочий такт микроконтроллера. Преобразование происходит быстрее при использовании более высокого такта, но в таком случае может пострадать точность измерения. Для измерения имеется функция //adc_get_value// с помощью которой можно выбрать канал и которая возвращает 10-битовый результат измерения в виде 16-битного целого числа. Функция измерения является блокирующей, т.е. она остается ждать конца преобразования и возвращает результат только тогда, когда измерение совершено. В примере программы используется только что объясненная библиотека аналогово-дигитального преобразователя и 7-сегментного цифрового индикатора LED. Значение 10-битного аналогово-дигитального преобразователя умножается на десять и делится на 1024, чтобы получить значение в пределах от 0 до 9. Значение 10 не может возникнуть, т.к. в языке Си в частном рассчитывается целочисленное, а не округленное значение. Для получения более точного результата измерения используется функция усреднения результата преобразователя. В качестве результата рабочая программа показывает на индикаторе цифры от 0 до 9, соответственно положению индикатора. // // Пример программы модуля «Датчики» Домашней Лаборатории. // На 7-сегментном цифровом индикаторе отображается положение потенциометра. // #include #include // // Выбор канала // // 1 = Фоторезистор // 2 = Терморезистор // 3 = Потенциометр // #define ADC_CHANNEL 3 // // Основная программа // int main(void) { int value; // Настройка 7-сегментного цифрового индикатора segment_display_init(); // Настройка ADC преобразователя adc_init(ADC_REF_AVCC, ADC_PRESCALE_8); // Бесконечный цикл while (true) { // Считывание значения, округленного в 4 раза value = adc_get_average_value(ADC_CHANNEL, 4); // Отображение показаний в сотых segment_display_write(value * 10 / 1024); } }