АЦП (ADC – analog digital converter) – аналого-цифровой преобразователь.
АЦП присутствует практически во всех моделях современных МК, в том числе и в серии mega производства фирмы ATMEL. С помощью него можно выполнять множество полезных действий – контролировать напряжение, обрабатывать различные сигналы с сенсоров и датчиков, преобразовывать аналоговый аудио сигнал в цифровую форму и тд. и тп. Так что же представляет из себя АЦП?
Аналого-цифровой преобразователь конвертирует входящий аналоговый сигнал (напряжение) в цифровую форму. Разрешение преобразователя указывает на то количество дискретных значений которое он может дать. В данном примере используется микроконтроллер ATmega32 (наш контроллер MRC40 с экспериментальным модулем). В этом МК имеется 8 входов АЦП, каждый из которых имеет разрешение 10 бит. Соответственно каждый канал выдает 1024 дискретных значений. Для примера мы подключили построечный резистор к выводу 0 порта А по следующей схеме.
Подстроечный резистор в данной схеме является, по сути, регулируемым резисторным делителем напряжения, собственно то напряжение, которое получится на выходе с данного делителя мы и преобразуем в цифровую форму. Результаты преобразования выводятся на текстовый ЖК-модуль. Значения представлены на дисплее в качестве дискретных значений (0 до 1023). Предварительно рассмотрим команды и функции для работы с АЦП в компиляторе BASCOM AVR. Конфигурирование аналого-цифрового преобразователя
ADC = single / ADC = free PRESCALER – делит внутреннюю частоту МК на 2,4,8,16,32,64 или 128 так как для работы АЦП требуется частота от 50-200 КГц, параметр AUTO автоматически выберет наиболее подходящий коэффициент деления частоты. Reference – выбор источника опорного напряжения. AREF – внешний источник, AVCC – напряжение питания схемы, INTERNAL – внутренний источник опорного напряжения на 2,56 в.
Start adc V = GETADC(0) Print V
STOP ADC – остановка режима аналого-цифрового преобразования. V = GETADC(channel) – получение результата преобразования с конкретного канала (пина порта). Channel – номер канала АЦП. На основе вышесказанного напишем тестовую программу:
'RoboZone.SU
$regfile = "m32def.dat" ' используем ATmega32 (MRC40 с универсальным модулем) $crystal = 16000000 ' частота установленного кварца 16 mHz $lib "lcd4.lbx" 'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
'Библиотека lcd4.lbx использует следующее подключение - '
'LCD = ATmega32 '---------------
'Rs = PortB.0 'RW = PortB.1 в данном варианте не используется - просто подключен (так же его можно подключить на землю) ' E = PortB.2 'E2 = PortB.3 данный вывод используется для подключения некоторых дисплеев с двумя чипами (здесь не используется) 'Db4 = PortB.4 'Db5 = PortB.5 'Db6 = PortB.6 'Db7 = PortB.7 'указываем конфигурацию подключения дисплея к портам МК Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 Config Lcd = 16 * 2 'используем дисплей на 2 строчки по 16 знакомест в каждой Config Adc = Single , Prescaler = Auto , Reference = Avcc 'конфигурация АЦП
'объявляем переменные Dim W As Word Start Adc 'запускаем аналого-цифровое преобразование '--------------выводим заставку------------------------------- Wait 1 'задержка 1 секунда Cursor Off 'отключаем отображение курсора на ЖК Cls 'очитка дисплея Locate 1 , 4 'позиция курсора Lcd "RoboZone.SU" 'выводим надпись Locate 2 , 5 ' позиция курсора Lcd "ADC test" 'выводим надпись Wait 2 'задержка 2 секунды '------------------------------------------------------------- 'главный цикл программы Do W = Getadc(0) 'считываем результат с пина 0 порта А. Locate 1 , 4 ' позиция курсора Lcd "ADC(0):" ; W ; " " 'выводим результат преобразования на ЖК Waitms 100 ' зедержка 0,1 секунды loop End
Вращая движок построечного резистора вы изменяете напряжение на входе АЦП, что отобразится на экране ЖК. Значения будут изменяться в диапазоне от 0 до 1023. Полученные дискретные значения, с помощью несложных расчетов можно превратить к примеру в вольты - получится простой вольтметр =). Экспериментируйте.