Статья №10
В этой статье будет рассмотрено применение Bascom для разработки аналогово – цифровых преобразователей (АЦП). Для начала рассмотрим более простой случай.
На Рис.1 представлена принципиальная схема четырёх - разрядного АЦП, которая содержит микроконтроллер ATtiny2313, суммирующий повторитель напряжения на Lm358N и жидкокристаллический индикатор типа MT-16S2H. Работа последнего с микроконтроллером была рассмотрена ранее в предыдущих статьях.
Суммирующий повторитель вырабатывает одно из шестнадцати возможных опорных напряжений. Напряжение подаётся на вывод компаратора микроконтроллера AIN0 и определятся кодом на выводах PD0 – PD3 ATtiny2313. Значение напряжений приведено в таблице:
На другой вывод компаратора – AIN1 подается измеряемое напряжение, которое сравнивается с опорным. Если входное напряжение превышает опорное, то 5 – й бит регистра управления и состояния компаратора - ACSR будет установлен, а если наоборот – сброшен.
Установим опорное напряжение равным 2,5 В (код = 1000). Если входное напряжение будет больше опорного, то из этого следует, что результирующий код больше 1000, следовательно, необходимо установить 2 – й бит порта, не меняя состояния третьего. Если же входное напряжение меньше опорного, результирующий код будет меньше 1000, следовательно необходимо сбросить 3 –й бит и установить 2– й. Далее подобную операцию нужно повторить с остальными битами.
Алгоритм преобразования представлен на блок – схеме программы “ADC4” – Рис.2.
Рис.2 - Блок-схема программы "ADC4"
Текст программы приведён ниже.
Программа “ADC4”:
$regfile = "attiny2313a.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Pinb.0 = Input 'конфигурирование входов компаратора
Config Pinb.1 = Input
Dim Dat As Byte 'объявление переменных
Dim I As Byte
Dim U As Single
Dim Pst As String * 6
Const K0 = 0.312 'определение констант
Const K1 = 0.001
Ddrd = &B11111111 'порт В-все выходы
Acsr.7 = 0 'включение компаратора
Do 'начало цикла
Portd = &B00001000 'начальное значение опорного напряжения
If Acsr.5 = 1 Then
Set Portd.2 'проверяем выход компаратора и устанавливаем 2-й бит, если на выходе 1
Else
Reset Portd.3 'иначе, сбрасываем 3-й бит
Set Portd.2 'и устанавливаем 2-й
End If
If Acsr.5 = 1 Then
Set Portd.1 'устанавливаем 1-й бит
Else
Reset Portd.2 'сбрасываем 2-й бит
Set Portd.1 'и устанавливаем 1-й
End If
If Acsr.5 = 1 Then
Set Portd.0 'устанавливаем 0-й бит
Else
Reset Portd.1 'сбрасываем 1-й бит
Set Portd.0 'и устанавливаем 0-й
End If
If Acsr.5 = 1 Then
Goto M1 'переход к вычислению напряжения
Else
Reset Portd.0 'сбрасываем 0-й бит
End If
M1:
Dat = Portd 'считываем код напряжения
U = Dat * K0
U = U + K1 'реальное значение напряжения
Pst = Fusing(u , "#.#") 'форматирование и округление до десятых долей
Cls
Lcd "U=" ; Pst ; " V " 'отображение на ЖКИ
Wait 1 'задержка=1сек
Loop 'конец цикла
End 'end program
Приведенный пример хорошо иллюстрирует принцип работы АЦП, однако на практике применяют преобразователи промышленного изготовления. Это АЦП либо встроенные в микроконтроллеры, либо - как отдельные микросхемы. Данные аналого – цифровые преобразователи имеют более высокую точность, поскольку их компоненты, выполненные по интегральной технологии на одном кристалле, имеют меньшие разбросы параметров, нежели дискретные. Часто применяют и АЦП, состоящие из специализированной микросхемы цифро - аналогового преобразователя (ЦАП) и микроконтроллера.
Рассмотрим применение Bascom на примере работы шести – разрядного АЦП, состоящего ЦАП - микросхемы JLC1562B и микроконтроллера ATtiny2313.
JLC1562B содержит шести – битный цифро – аналоговый преобразователь, напряжение на котором можно изменять в 64 уровнях, от 0 до 4 Вольт с шагом 0,0625. Он связан с микроконтроллером по шине I2C. Принципиальная схема устройства представлена на Рис.3.
Напряжение на входе АЦП задаётся переменным резистором 10 КОм. Выходное напряжение ЦАП (в предыдущем примере – суммирующий повторитель) служит опорным напряжением для компаратора. Значение напряжения отображается на ЖК – дисплее типа MT-16S2H и передаётся по протоколу RS-232 в порт персонального компьютера. Если компьютер не имеет СОМ – порта, необходимо применить переходник USB – RS-232.
Шести – битное значение для ЦАП JLC1562B передаётся следующим образом: в младших пяти битах – код от 0 до 63, в шестом задаётся порог срабатывания компаратора (0 – половина питающего напряжения, 1 – значение выхода АЦП). Седьмой бит управляет защелкой (устройство выборки – хранения): 0 – защёлкивает данные после команды чтения, 1 – защёлкивает данные, когда компаратор переключается из 0 в 1.
На Рис.4 представлена блок – схема программы “ADC6”.
Она состоит из двух циклов: основного, в котором происходит обработка значения напряжения и его вывод на ЖКИ и RS-232, и внутреннего цикла, в котором происходит увеличение значения данных, отсылаемых на ЦАП (от 0 до 63) и проверка сработки компаратора. В данном примере производится операция «ИЛИ»:
Dacwire = Dat Or Jcl1562bcomp
Таким образом, оба бита – бит выбора источника опорного напряжения и бит защёлки данных – устанавливаются в единицу.
Текст программы приводится ниже:
$regfile = "attiny2313a.dat" 'настройки
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Sda = Portb.5 'конфигурирование I2C
Config Scl = Portb.7
Config I2cdelay = 10
Const Adressw = &H70 'адрес для записи
Const Adressr = &H71 'адресс для чтения
Const Jcl1562bcomp = &B11000000 'биты выбора источника опорного напряжения и ‘защёлки выбора-хранения
Const Mask = &B00000001 'бит для определения контакта ввода напряжения АЦП (Р0)
Const K = 0.0625 'коэффициент пересчёта
Dim Dat As Byte 'объявление переменных
Dim Dacwrite As Byte
Dim Jclinput As Byte
Dim U As Single
Dim Daten As String * 4
Cls
Do
For Dat = 0 To 63 Step 1 'изменение данных от 0 до 63 (000000)
Dacwrite = Dat Or Jcl1562bcomp 'операция "ИЛИ"-установка битов выбора опорного ‘напряжения и защёлки
I2cstart
I2cwbyte Adressw
I2cwbyte Mask 'определения контакта ввода напряжения АЦП - Р0
I2cwbyte Dacwrite 'посылка в АЦП команды- для подкл.выборки-хранения и ‘источн.опорн.напряж.
I2cstop
I2cstart
I2cwbyte Adressr
I2crbyte Jclinput , Nack 'считывание данных АЦП
I2cstop
Jclinput = Jclinput And Mask 'выделение бита компаратора
If Jclinput = Mask Then 'если компаратор сработал (=1)
Exit For 'то выход из цикла
End If
Next Dat
U = Dat * K 'определение реального значения напряжения
Daten = Fusing(u , "#.##") 'форматирование и округление результата
Cls
Lcd "U=" ; Daten ; " V" 'отображение на ЖКИ
Print "U=" ; Daten ; " V" 'посылка в терминал по RS-232
Loop
End 'end program
Программы находятся в Приложении 1 данной статьи.