» » BASCOM AVR – тестируем АЦП (ADC) - аналого-цифровой преобразователь.
Информация к новости
  • Просмотров: 73548
  • Автор: administrator
  • Дата: 19 июля 2008
  • 20
19 июля 2008

BASCOM AVR – тестируем АЦП (ADC) - аналого-цифровой преобразователь.

Категория: BASCOM AVR

АЦП (ADCanalog digital converter) – аналого-цифровой преобразователь.

АЦП присутствует практически во всех моделях современных МК, в том числе и в серии mega производства фирмы ATMEL. С помощью него можно выполнять множество полезных действий – контролировать напряжение, обрабатывать различные сигналы с сенсоров и датчиков, преобразовывать аналоговый аудио сигнал в цифровую форму и тд. и тп. Так что же представляет из себя АЦП?

 

Аналого-цифровой преобразователь конвертирует входящий аналоговый сигнал (напряжение) в цифровую форму. Разрешение преобразователя указывает на то количество дискретных значений которое он может дать. В данном примере используется микроконтроллер ATmega32 (наш контроллер MRC40 с экспериментальным модулем). В этом МК имеется 8 входов АЦП, каждый из которых имеет разрешение 10 бит. Соответственно каждый канал выдает 1024 дискретных значений. Для примера мы подключили построечный резистор к выводу 0 порта А по следующей схеме.

Для примера мы подключили построечный резистор к выводу 0 порта А
Подстроечный резистор в данной схеме является, по сути, регулируемым резисторным делителем напряжения

 

Подстроечный резистор в данной схеме является, по сути, регулируемым резисторным делителем напряжения, собственно то напряжение, которое получится на выходе с данного делителя мы и преобразуем в цифровую форму.

Результаты преобразования выводятся на текстовый ЖК-модуль. Значения представлены на дисплее в качестве дискретных значений (0 до 1023).

 

Предварительно рассмотрим команды и функции для работы с АЦП в компиляторе BASCOM AVR.

 

Конфигурирование аналого-цифрового преобразователя

 
Пример:
Config Adc = Single , Prescaler = Auto , Reference = Avcc

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

START ADC – установка порта в режим аналого-цифрового преобразования.

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

 
Собственно более тут добавить нечего =) Компилятор BASCOM AVR в очередной раз проявляет себя с точки зрения удобства . Прошивайте контроллер и на экране ЖК появится вот такая картина.

 

Прошивайте контроллер и на экране ЖК появится вот такая картина

 

Вращая движок построечного резистора вы изменяете напряжение на входе АЦП, что отобразится на экране ЖК. Значения будут изменяться в диапазоне от 0 до 1023.

Полученные дискретные значения, с помощью несложных расчетов можно превратить к примеру в вольты - получится простой вольтметр =). Экспериментируйте.

 

Исходник тестовой программы вы можете скачать ниже.
Вы не можете скачивать файлы с нашего сервера

Метки к статье: BASCOM AVR, начинающим, ADC, АЦП

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
<
mamoutine

7 августа 2008 04:49

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
Цитата: foxit
Че то не нашел библиотеки adc.h


Да, действительно нет. Все проще. Ганератор кода добавляет функцию read_adc()
<
VladI

25 августа 2008 00:05

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
100 MB полезной информации!

http://www.4shared.com/file/54216569/91dba2ac/EDW_BASCOMpart1.html?s=1
http://www.4shared.com/file/51879626/43ce2d57/EDW_BASCOMpart2.html?s=1

Качаем,разархивируем.
Один из методов.
Запускаем NERO,вставлем в RW-к болванку.
Открываем в NERO разархивируемый файл с расширением .nrg (образ диска NERO) и записываем болванку...
С наилучшими пожеланиями VladI+ !

от админа
тут постяца комментарии, и КРАЙНЕ желательно по теме материала, если есть желание поделится информацией - roboforum.ru
на первый раз прощаю, в дальнейшем подобное будет удалатся не взирая...
<
gorgiqqq

23 сентября 2008 02:44

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
Спасибо за полезный материал, очень благодарен
<
smart

6 ноября 2008 15:45

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
Как ослабить сигнал - понятно. А как его усилить? Например, есть аудио-сигнал, он не превышает и половины вольта. При оцифровке значения колеблятся от 0 до 20.. этого маловато. Помогите найти решение для усиления сигнала, в частности, аудио-сигнала.
И если рассмотреть вариант ослабления опорного напряжения, может его стоит использовать? Или упадет точность и эти 0-20 расплывутся на 0-1024 с той же точностью?
Большое спасибо за отличный сайт и полезную информацию!
<
administrator

6 ноября 2008 21:03

Информация к комментарию
  • Группа: Администраторы
  • ICQ: {icq}
  • Регистрация: 26.02.2008
  • Статус: Пользователь offline
  • Публикаций: 66
  • Комментариев: 747
smart, усилить можно с помощью операционного усилителя. На сайте у нас есть модулек усилителя микрофона, вот как один из вариантов усиления аудио сигнала (только там не операционник, а спец. аудиоусилитель).
<
smart

7 ноября 2008 00:10

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
Спасибо, посмотрим! ;)
<
Pasha

20 ноября 2008 12:39

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
Ребята, вот еще интересная тема - Измерение температуры. Сначала хотел при помощи аналоговрго термосопротивления реализовать, а потом отискал датчик ds18b20 подключающийся по 1ware протоколу.

Так вот пара вопросов накопилась - может кто знает как опросить два датчика, висящих на одной ножке. каждый датчик имеет свой идинтификатор.

код:
$regfile = "m32.dat"
$crystal = 4000000
Config Lcd = 16 * 2 ‘ дисплей 2 строки по 16 символов
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6 ‘ конфигурируем дисплей

Config 1wire = Portd.5 ‘ на эту ножку подключим DS18B20 и подтягивающий резистор на 4,7 ком к + питания


Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Signtemperatura As String * 1
Dim T1 As Byte
Dim T2 As Byte
Dim I As Integer



Do
1wreset
1wwrite &HCC ‘ Выдаем команду чтения ПЗУ
1wwrite &H44 ‘ Запуск измерения

Waitms 750 ‘ Ждем окончания преобразования

1wreset
1wwrite &HCC
1wwrite &HBE ‘ Команда чтения ОЗУ датчика


Byte0 = 1wread() ‘ Читаем нулевой байт

Byte1 = 1wread() ‘ Читаем первый байт

If Byte1 >= 248 Then ‘ Проверяем на отрицательную температуру.248 в десятичном – 11111000 в двоичном. Если температура отрицательная – вычитаем из &HFF

Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"

Else
Signtemperatura = "+"
End If

T1 = Byte0 / 16 ‘ Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16 ‘ Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)

T1 = T1 + T2 ‘ Формирмируем результам и выдаем его на индикатор. Команда LCD сама преобразует его в десятичный вид

Cls
Lcd Signtemperatura ; T1 ; "C"
Wait 2
Loop
End


И еще маленький вопросик - как в Васике включить на pin внутринний подтягивающий резистор?

"config pinc.0 = input
portc.0 = 1"

Так или нет????
<
administrator

20 ноября 2008 18:04

Информация к комментарию
  • Группа: Администраторы
  • ICQ: {icq}
  • Регистрация: 26.02.2008
  • Статус: Пользователь offline
  • Публикаций: 66
  • Комментариев: 747
Pasha, два датчика таких еще не подключали, так что пока ничего по ним не скажу.
Конфигурирование портов описано тут - http://robozone.su/2008/07/08/bascom-avr-konfiguriruem-porty-mk.-podkljuchaem.ht
ml
Если не ошибаюсь то ты правильно описал.
<
Pasha

22 ноября 2008 00:23

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
Спасибо за ответ. В конфигурирование увы нет про резисторы. Как дойдет время до кнопок, то поэксперементирую и отпишусь что вышло. А пока подключаю жки. Проектирую 6 канальное устройство контроля нагрузки, сумарной мощности 16 кВт с зависимомстью от 2х температур, освещенности и двух входов с АЦП, ну, если кому интересно))
<
administrator

22 ноября 2008 01:31

Информация к комментарию
  • Группа: Администраторы
  • ICQ: {icq}
  • Регистрация: 26.02.2008
  • Статус: Пользователь offline
  • Публикаций: 66
  • Комментариев: 747
Pasha, успехов ! laughing
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.