Исследование внешнего i2c АЦП MCP3421, ИОН (2,048 вольта) встроен в чип АЦП
'===============================================================================
'*
'* Автор: Sasha_1973
'* Дата: 17.05.2014 г.
'* МК: ATmega328P
'* Тактовая частота МК: 1 MГц
'*
'* Компилятор: BASCOM-AVR 2.0.7.1
'* Используемый шрифт в Bascom: Consolas; размер = 14
'*
'* Программа симулятор: Proteus 7.10 SR0 rus
'*
'* Описание: Исследование внешнего i2c АЦП MCP3421
'*
'===============================================================================$map ' Получаем карту распределения памяти компилятором Bascom
$regfile = "m328pdef.dat"
$crystal = 1000000
$framesize = 32 ' Размер области используемой и необходимой для преобразований
$hwstack = 40 ' Размер аппаратного стека
$swstack = 16 ' Размер программного стека$baud = 4800 : Ucsr0a.1 = 1 ' Двойная скорость работы USART, скорость трансляции = $baud * 2
'===============================================================================
' Н А С Т Р О Й К А Ш И Н Ы i2c
'===============================================================================Config Sda = Portc.4 ' I2c Sda
Config Scl = Portc.5 ' I2c Scl
Config I2cdelay = 1 ' Скорость работы шины I2c на программном уровне
I2cinit'===============================================================================
' И С П О Л Ь З У Е М Ы Е К О Н С Т А Н Т Ы
'===============================================================================Const Const_дискретность_измерения = 16
Const Чтение_mcp3421 = &B11010001 ' Адрес чтения MCP3421
Const Запись_mcp3421 = &B11010000 ' Адрес записи MCP3421Dim Дискретность_измерения As Byte
Дискретность_измерения = Const_дискретность_измерения' Настройки по умолчанию = &B10010000
' Байт_настройки_MCP3421 = &B00000000
' ||||||||
' |||||||+--- 0 - Коэффициент усиления
' ||||||+---- 1 - Коэффициент усиления
' |||||+----- 2 - Выбор частоты дискретизации
' ||||+------ 3 - Выбор частоты дискретизации
' |||+------- 4 - Режим преобразования, 1 - непрерывное, 0 - одиночное с необходимостью перезапуска
' ||+-------- 5 - Выбор канала, в чипе MCP3421 не используется
' |+--------- 6 - Выбор канала, в чипе MCP3421 не используется
' +---------- 7 - При чтении - флаг готовности преобразования, при записи START преобразованияSelect Case Дискретность_измерения
Case 12 : Const 12bit_ацп = &B10010000 ' 240 SPS (12 bits) (Default)
Case 14 : Const 14bit_ацп = &B10010100 ' 60 SPS (14 bits)
Case 16 : Const 16bit_ацп = &B10011000 ' 15 SPS (16 bits)
Case 18 : Const 18bit_ацп = &B10011100 ' 3.75 SPS (18 bits)
End Select ' Дискретность_измерения'===============================================================================
' И С П О Л Ь З У Е М Ы Е П Е Р Е М Е Н Н Ы Е
'===============================================================================Dim Флаг_минус As Byte
Dim Сырые_данные_ацп(3) As ByteIf Дискретность_измерения > 16 Then
Dim Данные_ацп_long As Long At Сырые_данные_ацп(1) Overlay
Else
Dim Данные_ацп_integer As Integer At Сырые_данные_ацп(1) Overlay
End IfDim Готовые_данные_single As Single
Dim Готовые_данные_str As String * 10'===============================================================================
' И С П О Л Ь З У Е М Ы Е П О Д П Р О Г Р А М М Ы
'==============================================================================='\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
' З А П У С К И П Р Е Д В А Р И Т Е Л Ь Н Ы Е Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\Gosub Настройка_внешнего_ацп
Waitms 200
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'-------------- Разрешаем работу необходимых прерываний ----------------------'------------ Разрешаем работу всех включенных прерываний --------------------
' Enable Interrupts
'===============================================================================
' Г Л А В Н Ы Й Ц И К Л
'===============================================================================
Главный_цикл:Gosub Чтение_внешнего_ацп
Select Case Дискретность_измерения
Case 12 :
Готовые_данные_single = Данные_ацп_integer * 0.001
Готовые_данные_str = Fusing(готовые_данные_single , "#.###")
Case 14 :
Готовые_данные_single = Данные_ацп_integer * 0.00025
Готовые_данные_str = Fusing(готовые_данные_single , "#.#####")
Case 16 :
Готовые_данные_single = Данные_ацп_integer * 0.0000625
Готовые_данные_str = Fusing(готовые_данные_single , "#.#######")
Case 18 :
Готовые_данные_single = Данные_ацп_integer * 0.000015625
Готовые_данные_str = Fusing(готовые_данные_single , "#.#########")
End Select ' Дискретность_измеренияIf Флаг_минус <> 0 Then
Print "-" ; Готовые_данные_str ; " V"
Флаг_минус = 0
Else
Print Готовые_данные_str ; " V"
End IfWaitms 200
Goto Главный_цикл
End
'===============================================================================
' П О Д П Р О Г Р А М М Ы
'==============================================================================='===============================================================================
Чтение_внешнего_ацп:
'-------------------------------------------------------------------------------I2cstart
I2cwbyte Чтение_mcp3421If Дискретность_измерения = 18 Then
I2crbyte Сырые_данные_ацп(3) , Ack
If Сырые_данные_ацп(3).7 = 1 Then Флаг_минус = 1
End IfI2crbyte Сырые_данные_ацп(2) , Ack
If Сырые_данные_ацп(2).7 = 1 Then Флаг_минус = 1I2crbyte Сырые_данные_ацп(1) , Nack
I2cstopSelect Case Дискретность_измерения
Case 12 :
Сырые_данные_ацп(2) = &B00000000 And Сырые_данные_ацп(2)
Case 14 :
Сырые_данные_ацп(2) = &B00011111 And Сырые_данные_ацп(2)
Case 16 :
Сырые_данные_ацп(2) = &B01111111 And Сырые_данные_ацп(2)
Case 18 :
Сырые_данные_ацп(3) = &B00000011 And Сырые_данные_ацп(3)
Сырые_данные_ацп(2) = &B11111111 And Сырые_данные_ацп(2)
End Select ' Дискретность_измерения'-------------------------------------------------------------------------------
Return
'==============================================================================='===============================================================================
Настройка_внешнего_ацп:
'-------------------------------------------------------------------------------I2cstart
I2cwbyte Запись_mcp3421Select Case Дискретность_измерения
Case 12 : I2cwbyte 12bit_ацп
Case 14 : I2cwbyte 14bit_ацп
Case 16 : I2cwbyte 16bit_ацп
Case 18 : I2cwbyte 18bit_ацп
End Select ' Дискретность_измеренияI2cstop
'-------------------------------------------------------------------------------
Return
'===============================================================================
Пределы входного напряжения:
-2,048...2,048 вольт
Дискретность измерения:
12 bits 1 mV, 240 SPS, -2048.....2047
14 bits 250 µV, 60 SPS, -8192.....8191
16 bits 62.5 µV, 15 SPS, -32768.....32767
18 bits 15.625 µV, 3.75 SPS, -131072.....131071
! Дискретность выбирается соответсвенно в исходнике и симуляции !
Симуляция (Протеус 7.10) + Исходник (Bascom 2.0.7.1) + документация -- скачать
