This shows you the differences between two versions of the page.
| ru:examples:sensor:potentiometer [2010/12/15 14:24] – создано eduardtlmk | ru:examples:sensor:potentiometer [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Потенциометр ====== | ||
| - | // | ||
| - | |||
| - | ===== Теория ===== | ||
| - | |||
| - | [{{ : | ||
| - | |||
| - | Потенциометр это переменный резистр с тремя контактами, | ||
| - | |||
| - | [{{ : | ||
| - | |||
| - | Типичный потенциометр состоит из сопротивления с токопроводящей поверхностью и из скользящего по ней подвижного контакта – движка. Чем ближе движок к углу сопротивления, | ||
| - | |||
| - | ===== Практика ===== | ||
| - | |||
| - | На плате модуля «Датчики» Домашней Лаборатории находится поворотный потенциометр 4,7 kΩ. Потенциометр подключен между землей и +5 V потенциалами, | ||
| - | опорное напряжение аналого-дигитального преобразователя AVR взять с вывода AVCC, то выходное напряжение потенциометра получит дигитальное значение на протяжении всей границы его регулирования. Для использования ADC AVR в библиотеке Домашней Лаборатории написаны следующие функции: | ||
| - | |||
| - | ~~PB~~ | ||
| - | ~~CL~~ | ||
| - | <code avr> | ||
| - | // | ||
| - | // Типы данных настроек | ||
| - | // | ||
| - | 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; | ||
| - | |||
| - | // | ||
| - | // Запуск 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, | ||
| - | |||
| - | // Ожидание окончания преобразования | ||
| - | while (bit_is_set(ADCSRA, | ||
| - | { | ||
| - | asm volatile (" | ||
| - | } | ||
| - | |||
| - | // Возвращение результата | ||
| - | return ADCW; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Функцию // | ||
| - | |||
| - | В примере программы используется только что объясненная библиотека аналогово-дигитального преобразователя и 7-сегментного цифрового индикатора LED. Значение 10-битного аналогово-дигитального преобразователя умножается на десять и делится на 1024, чтобы получить значение в пределах от 0 до 9. Значение 10 не может возникнуть, | ||
| - | |||
| - | <code c> | ||
| - | // | ||
| - | // Пример программы модуля «Датчики» Домашней Лаборатории. | ||
| - | // На 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, | ||
| - | |||
| - | // Бесконечный цикл | ||
| - | while (true) | ||
| - | { | ||
| - | // Считывание значения, | ||
| - | value = adc_get_average_value(ADC_CHANNEL, | ||
| - | |||
| - | // Отображение показаний в сотых | ||
| - | segment_display_write(value * 10 / 1024); | ||
| - | } | ||
| - | } | ||
| - | </ | ||