Вольтметр на atmega8 с семисегментными индикаторами: Вольтметр на ATmega8 с семисегментными индикаторами — Устройства на микроконтроллерах — Схемы устройств на микроконтроллерах

Вольтамперметр МК Atmega8 с автоматическим выбором измеряемого диапазона силы тока

‘* Filename : Вольтметр, 2х диапазонный ампертметр *
‘* Revision : 5.1 *
‘* Controller : ATMEGA8 *
‘* Compiler : BASCOM-AVR 2.0.6.1 *
‘* Author : MACTEPOK *
‘*******************************************************************************
$regfile = «m8def.dat» ‘определяем контроллер
$crystal = 8000000 ‘внутренний генератор
‘$sim
$lib «mcsbyte.lbx» ‘подключаем библиотеку функций

Config Pinc.0 = Input : Portc.0 = 1 ‘кнопка Выбор
Config Pinc.1 = Input : Portc.1 = 1 ‘кнопка Вверх
Config Pinc.2 = Input : Portc.2 = 1 ‘кнопка Вниз

Config Portd = Output : Config Portb = Output ‘порты на выход к которым подключен индикатор

Load1 Alias Portb.3 ‘нагрузка №1
Load2 Alias Portb.4 ‘нагрузка №2
Vibor Alias Pinc.0 ‘кнопка Выбор
Up Alias Pinc.1 ‘кнопка Вверх
Down Alias Pinc.2 ‘кнопка Вниз

Config Adc = Single , Prescaler = Auto , Reference = Avcc ‘настраиваем АЦП
Dim W As Byte , Y As Byte , X As Byte , I As Byte , Z As Byte , Chislo(6) As Integer , Channel_1 As Integer , On1 As Word , Off1 As Word , Channel_2 As Integer , On2 As Word , Off2 As Word , Channel_3 As Integer , Sostoyanie As Byte , Sostoyanie_2 As Byte , Copy_print As Integer , Copy_print_sec As Integer , Copy_var As Integer , _print As Integer , _print_sec As Integer , Pokazaniya As Integer , View_menu As Byte , Booton_flag As Bit , Booton_flag_2 As Bit , Count As Word , Error_flag As Bit
Dim On2_l As Word , On2_h As Word , Off2_l As Word , Off2_h As Word , Diapazon As Byte
Dim Razryad_1 As Byte , Razryad_2 As Byte , Temp_najatiya As Byte , Indicator As Byte
Dim Menu_punkt As Byte ‘пункт меню
Dim Set_flag As Bit ‘флаг режима настройки уставок
Dim Podskaz_flag As Bit , Podskaz_flag_sec As Bit ‘флаги режима отображения подсказок на соответствующих каналах
Dim Default As Eram Byte At &h24 ‘переменная EEPROM для записи начальных уставок для первого включения прибора

‘A Alias Portd.5 : B Alias Portd.7 : C Alias Portd.3 : D Alias Portd.1 ‘порты, к которым подключены сегменты индикатора
‘E Alias Portd.0 : F Alias Portd.6 : G Alias Portd.4 : H Alias Portd.2 ‘
‘Dig1 Alias Portb.0 : Dig2 Alias Portb.1 : Dig3 Alias Portb.2 ‘ порты, к которым подключены общие аноды 1го индикатора
‘Dig1_sec Alias Portb.5 : Dig2_sec Alias Portb.6 : Dig3_sec Alias Portb.7 ‘ порты, к которым подключены общие аноды 2го индикатора

A Alias Portd.2 : B Alias Portd.6 : C Alias Portb.7 : D Alias Portb.2 ‘порты, к которым подключены сегменты индикатора
E Alias Portd.0 : F Alias Portb.6 : G Alias Portd.7 : H Alias Portb.5 ‘
Dig1 Alias Portd.3 : Dig2 Alias Portd.4 : Dig3 Alias Portd.1 ‘ порты, к которым подключены общие аноды 1го индикатора
Dig1_sec Alias Portd.5 : Dig2_sec Alias Portb.0 : Dig3_sec Alias Portb.1 ‘ порты, к которым подключены общие аноды 2го индикатора

For X = 1 To 6 ‘ присваиваем всем цифрам пустоту, чтоб в момент включения не высвечивались нули
Chislo(x) = 11
Next
‘*********** ___ Переключение типа индикаторов (ОК/ОА) ___ *********************
Readeeprom Indicator , 30
If Vibor = 0 Then ‘ Удерживая кнопку УСТ, подаем питание.
For X = 1 To 200
If X = 150 Then ‘ При длительном нажатии
Set Booton_flag
Toggle Indicator.3 ‘ Переключаем младший (четвертый) бит переменной. Номер бита выбрал произвольно
Writeeeprom Indicator , 30
If Indicator = &B00000000 Then ‘ Если переключили на ОА, зажжем все сегменты идикатора для подтверждения
Reset A : Reset B : Reset C : Reset D : Reset E : Reset F : Reset G : Reset H
Set Dig1 : Set Dig2 : Set Dig3 : Set Dig1_sec : Set Dig2_sec : Set Dig3_sec
End If
If Indicator = &B00001000 Then ‘ Если переключили на ОK, зажжем все сегменты идикатора для подтверждения
Set A : Set B : Set C : Set D : Set E : Set F : Set G : Set H
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig1_sec : Reset Dig2_sec : Reset Dig3_sec
End If
Waitms 1500
Exit For
End If
If Vibor = 1 Then Exit For
Waitms 10
Next
End If
‘*******************************************************************************
If Default = 255 Then ‘при первом запуске, когда Default=255
Off1 = 120 ‘присваиваем начальный уставки
On1 = 110
‘ Off2 = 60
‘ On2 = 50
On2_l = 800
On2_h = 99
Off2_l = 600
Off2_h = 99
Indicator = &B00000000 ‘ для ОА. Indicator = &B00001000 для ОК
Razryad_1 = &B10111011
Razryad_2 = &B11101110
Writeeeprom On1 , 0 ‘ Записываем в EEPROM уставку ON1
Writeeeprom Off1 , 5 ‘ Записываем в EEPROM уставку OFF1
‘ Writeeeprom On2 , 10 ‘ Записываем в EEPROM уставку ON2
‘ Writeeeprom Off2 , 14 ‘ Записываем в EEPROM уставку OFF2
Writeeeprom On2_l , 22
Writeeeprom On2_h , 24
Writeeeprom Off2_l , 26
Writeeeprom Off2_h , 28
Writeeeprom Razryad_1 , 16
Writeeeprom Razryad_2 , 17
Writeeeprom Indicator , 30
Default = 100 ‘ присваиваем значение 100(произвольное, отличное от 255) и больше этот кусок кода выполняться не будет
End If
Readeeprom On1 , 0 ‘ Считываем из EEPROM уставку ON1
Readeeprom Off1 , 5 ‘ Считываем из EEPROM уставку OFF1
‘ Readeeprom On2 , 10 ‘ Считываем из EEPROM уставку ON2
‘ Readeeprom Off2 , 14 ‘ Считываем из EEPROM уставку OFF2
Readeeprom On2_l , 22
Readeeprom On2_h , 24
Readeeprom Off2_l , 26
Readeeprom Off2_h , 28
Readeeprom Razryad_1 , 16
Readeeprom Razryad_2 , 17

Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse ‘ конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Config Timer1 = Timer , Prescale = 1 : On Timer1 Bootons ‘ конфигурируем таймер 1 и назначаем подпрограмму которая выполняется при переполнении таймера
Enable Interrupts : Enable Timer0 : Enable Timer1 ‘ разрешаем прерывания, таймер 0, таймер 1
Start Timer0 : Start Timer1
Start Adc ‘ начало преобразования

If On2_l > 999 Then On2 = On2_h Else On2 = On2_l
If Off2_l > 999 Then Off2 = Off2_h Else Off2 = Off2_l

Do
 If X > 40 Then ‘ увеличили период опроса АЦП, чтобы значения не прыгали 
Stop Timer0 : Stop Timer1 ‘ на время преобразования останавливаем таймеры
Channel_1 = Getadc(5) ‘ Вольтметр 0..500 В ‘опрос АЦП (диапазон от 0 до 1023) (1 канал)
‘ Channel_1 = 1023 — Channel_1 ‘инвертирование раскомментировать===========
 Channel_1 = Channel_1 / 2.046 ‘пересчет тут любая формула для требуемого диапазона или необходимой характеристики 
If Channel_1 > 500 Then Channel_1 = 500 ‘верхний предел показаний

Channel_2 = Getadc(4) ‘ Ток 1,00 .. 9,99 А ‘опрос АЦП (2 канал)
‘ Channel_2 = Channel_2 ‘пересчет тут любая формула для требуемого диапазона или необходимой характеристики 
If Channel_2 > 999 Then Channel_2 = 999 ‘верхний предел показаний
‘ Razryad_2 = &B01110111
Diapazon = 2
If Channel_2 < 100 Then
Channel_2 = Getadc(3) ‘ Ток 0 .. 999 mА ‘опрос АЦП (3 канал)
If Channel_2 > 999 Then Channel_2 = 999
‘ Razryad_2 = &B11101110
Diapazon = 1
End If
X = 0 ‘
End If
Start Timer0 : Start Timer1
If On1 < Off1 Then ‘если уставка ON1 < OFF1 то режим нагревателя
If Channel_1 <= On1 Then Sostoyanie = 1 ‘если значение первого канала АЦП ниже уставки ON1, то включаем нагрузку №1
If Channel_1 >= Off1 Then Sostoyanie = 0 ‘если значение первого канала АЦП выше уставки OFF1, то выключаем нагрузку №1
Else ‘если уставка ON1 > OFF1 то режим охладителя
If Channel_1 >= On1 Then Sostoyanie = 1 ‘если значение первого канала АЦП выше уставки ON1, то включаем нагрузку №1
If Channel_1 <= Off1 Then Sostoyanie = 0 ‘если значение первого канала АЦП ниже уставки OFF1, то выключаем нагрузку №1
End If

If Sostoyanie = 1 Then Set Load1 Else Reset Load1 ‘управление 1м каналом нагрузки

‘ If On2 < Off2 Then ‘если уставка ON2 < OFF2 то режим нагревателя
‘ If Channel_2 <= On2 Then Sostoyanie_2 = 1 ‘если давление ниже уставки ON2, то включаем нагрузку №2
‘ If Channel_2 >= Off2 Then Sostoyanie_2 = 0 ‘если давление выше уставки OFF2, то выключаем нагрузку №2
‘ Else ‘если уставка ON2 > OFF2 то режим охладителя
‘ If Channel_2 >= On2 Then Sostoyanie_2 = 1 ‘если давление выше уставки ON2, то включаем нагрузку №2
‘ If Channel_2 <= Off2 Then Sostoyanie_2 = 0 ‘если давление ниже уставки OFF2, то выключаем нагрузку №2
‘ End If
If Diapazon = 2 Then
If Channel_2 >= On2_h Then Sostoyanie_2 = 1
If Channel_2 < Off2_h Then Sostoyanie_2 = 0
Else
If Channel_2 >= On2_l Then Sostoyanie_2 = 1
If Channel_2 < Off2_l Then Sostoyanie_2 = 0
End If

If Sostoyanie_2 = 1 Then Set Load2 Else Reset Load2 ‘управление 2м каналом нагрузки

Loop

‘*******************************************************************************
‘ Индикация

Pulse:
If View_menu <> 0 And Error_flag = 0 Then Incr Count ‘если находимся в меню и нет ошибки ввода уставок,то инкриментируем счетчик, который отвечает за автоматический выход из меню (~ через 5 сек)
If Count > 7000 Then ‘задается время автоматического выхода из меню
Count = 0 ‘сброс счетчика
View_menu = 0 ‘ выход из меню в основной режим
End If
‘ H = 1 ‘ выключаем точку на индикаторе
Stop Timer0 ‘останавливаем таймер 0
Select Case View_menu ‘в зависимости от пункта меню, записываем в переменные расчета следующие данные
Case 0 :
_print = Channel_1 ‘ основной режим. 1й индикатор показывает значение АЦП 1го канала
_print_sec = Channel_2 ‘ основной режим. 2й индикатор показывает значение АЦП 2го канала
If Diapazon = 2 Then Razryad_2 = &B01110111 Else Razryad_2 = &B11101110

Case 1 :
_print = On1 ‘ 1й индикатор показывает значение уставки ON1
_print_sec = Channel_2 ‘ 2й индикатор показывает значение АЦП 2го канала
Case 2 :
_print = Off1 ‘ 1й индикатор показывает значение уставки OFF1
_print_sec = Channel_2 ‘ 2й индикатор показывает значение АЦП 2го канала
Case 3 :
_print = Channel_1 ‘ 1й индикатор показывает значение АЦП 1го канала
If On2_l = 1000 Then Razryad_2 = &B01110111 Else Razryad_2 = &B11101110
_print_sec = On2 ‘ 2й индикатор показывает значение уставки ON2
Case 4 :
_print = Channel_1 ‘ 1й индикатор показывает значение АЦП 1го канала
If Off2_l = 1000 Then Razryad_2 = &B01110111 Else Razryad_2 = &B11101110
_print_sec = Off2 ‘ 2й индикатор показывает значение уставки OFF2

End Select

If Podskaz_flag = 0 Then ‘если не выводим на 1й индикатор подсказки, то работаем с числами
Copy_print = _print ‘
Copy_var = Copy_print ‘
For I = 3 To 1 Step -1 ‘ цикл в котором разбивается переменная на 3 числа
Chislo(i) = Copy_print Mod 10 ‘ заносим в масив последнюю цифру от числа Copy_print(123 mod 10 = 3)
Copy_print = Copy_print / 10 ‘ отсекаем последнюю цифру от числа Copy_print (123/10=12)
Next ‘ убираем незначимые нули
If Copy_var < 100 Then Chislo(1) = 11 ‘для 2х значного числа
‘ If Copy_var < 10 Then Chislo(2) = 11 ‘для однозначного числа
End If
If Podskaz_flag_sec = 0 Then ‘если не выводим на 2й индикатор подсказки, то работаем с числами
Copy_print_sec = _print_sec ‘
Copy_var = Copy_print_sec
For I = 6 To 4 Step -1 ‘ цикл в котором разбивается переменная на 3 числа
Chislo(i) = Copy_print_sec Mod 10 ‘ заносим в масив последнюю цифру от числа _print(123 mod 10 = 3)
Copy_print_sec = Copy_print_sec / 10 ‘ отсекаем последнюю цифру от числа Copy_print_sec (123/10=12)
Next ‘убираем незначимые нули
‘ If Copy_var < 100 Then Chislo(4) = 11 ‘для 2х значного числа
‘ If Copy_var < 10 Then Chislo(5) = 11 ‘для однозначного числа
End If

If Indicator = 0 Then ‘ Гасим индикаторы перед выводом информации
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig1_sec : Reset Dig2_sec : Reset Dig3_sec ‘ Для индикатора с ОА
Else
Set Dig1 : Set Dig2 : Set Dig3 : Set Dig1_sec : Set Dig2_sec : Set Dig3_sec ‘Для индикатора с ОK
End If

Incr W : If W > 6 Then W = 1 ‘ выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z ‘ переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту А
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z

Select Case W ‘ включаем цифру(разряд) которую выбрали (w). Подаем плюс на общий провод конкретной цифры (разряда)
Case 1 :
If Indicator = 0 Then
Set Dig3
If Podskaz_flag = 0 Then H = Razryad_1.3 Else H = 1
Else
Reset Dig3
If Podskaz_flag = 0 Then
H = Razryad_1.3
Toggle H
Else
H = 0
End If
End If
Case 2 :
If Indicator = 0 Then
Set Dig2
If Podskaz_flag = 0 Then H = Razryad_1.2 Else H = 1
Else
Reset Dig2
If Podskaz_flag = 0 Then
H = Razryad_1.2
Toggle H
Else
H = 0
End If
End If
Case 3 :
If Indicator = 0 Then
Set Dig1
If Podskaz_flag = 0 Then H = Razryad_1.1 Else H = 1
Else
Reset Dig1
If Podskaz_flag = 0 Then
H = Razryad_1.1
Toggle H
Else
H = 0
End If
End If
Case 4 :
If Indicator = 0 Then
Set Dig3_sec
If Podskaz_flag_sec = 0 Then H = Razryad_2.3 Else H = 1
Else
Reset Dig3_sec
If Podskaz_flag = 0 Then
H = Razryad_2.3
Toggle H
Else
H = 0
End If
End If
Case 5 :
If Indicator = 0 Then
Set Dig2_sec
If Podskaz_flag_sec = 0 Then H = Razryad_2.2 Else H = 1
Else
Reset Dig2_sec
If Podskaz_flag = 0 Then
H = Razryad_2.2
Toggle H
Else
H = 0
End If
End If
Case 6 :
If Indicator = 0 Then
Set Dig1_sec
If Podskaz_flag_sec = 0 Then H = Razryad_2.1 Else H = 1
Else
Reset Dig1_sec
If Podskaz_flag = 0 Then
H = Razryad_2.1
Toggle H
Else
H = 0
End If
End If
End Select

Start Timer0
Return

Look: ‘ подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z ‘ определяем порядковый номер числа из таблици DATA. W — это цифра которую будем выводить 1..2..3, Y это номер сегмента (A=0 B=1 C=2…G=7)
If Indicator = 0 Then
Z = Lookup(z , Cifri_oa) ‘ выбираем из таблици включить или выключить нужный сегмент -OA
Else
Z = Lookup(z , Cifri_ok) ‘-OK
End If
Incr Y ‘Y это номер сегмента (A=0 B=1 C=2…). Chislo(w) * 7 — переход на начало нужной строки Data.Z = Y + Z — по очереди перебираем сегменты в строке.
Return

Cifri_oa:
‘ таблица сегментом для индикаторов с общим плюсом |Chislo(i) | Символ |
Data 0 , 0 , 0 , 0 , 0 , 0 , 1 ‘0
Data 1 , 0 , 0 , 1 , 1 , 1 , 1 ‘1
Data 0 , 0 , 1 , 0 , 0 , 1 , 0 ‘2
Data 0 , 0 , 0 , 0 , 1 , 1 , 0 ‘3
Data 1 , 0 , 0 , 1 , 1 , 0 , 0 ‘4
Data 0 , 1 , 0 , 0 , 1 , 0 , 0 ‘5
Data 0 , 1 , 0 , 0 , 0 , 0 , 0 ‘6
Data 0 , 0 , 0 , 1 , 1 , 1 , 1 ‘7
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 ‘8
Data 0 , 0 , 0 , 0 , 1 , 0 , 0 ‘9
Data 1 , 1 , 1 , 1 , 1 , 1 , 0 ’10 «-«
Data 1 , 1 , 1 , 1 , 1 , 1 , 1 ’11 «»
Data 1 , 1 , 1 , 0 , 0 , 0 , 1 ’12 «L»
Data 1 , 1 , 0 , 1 , 0 , 1 , 0 ’13 «n»
Data 0 , 1 , 1 , 1 , 0 , 0 , 0 ’14 «F»
Data 0 , 1 , 1 , 0 , 0 , 0 , 0 ’15 «E»
Data 1 , 1 , 1 , 1 , 0 , 1 , 0 ’16 «r»

‘*******************************************************************************
Cifri_ok:
‘ таблица сегментом для индикаторов с общим минусом |Chislo(i) | Символ |
Data 1 , 1 , 1 , 1 , 1 , 1 , 0 ‘0
Data 0 , 1 , 1 , 0 , 0 , 0 , 0 ‘1
Data 1 , 1 , 0 , 1 , 1 , 0 , 1 ‘2
Data 1 , 1 , 1 , 1 , 0 , 0 , 1 ‘3
Data 0 , 1 , 1 , 0 , 0 , 1 , 1 ‘4
Data 1 , 0 , 1 , 1 , 0 , 1 , 1 ‘5
Data 1 , 0 , 1 , 1 , 1 , 1 , 1 ‘6
Data 1 , 1 , 1 , 0 , 0 , 0 , 0 ‘7
Data 1 , 1 , 1 , 1 , 1 , 1 , 1 ‘8
Data 1 , 1 , 1 , 1 , 0 , 1 , 1 ‘9
Data 0 , 0 , 0 , 0 , 0 , 0 , 1 ’10 «-«
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 ’11 «» пусто
Data 0 , 0 , 0 , 1 , 1 , 1 , 0 ’12 «L»
Data 0 , 0 , 1 , 0 , 1 , 0 , 1 ’13 «n»
Data 1 , 0 , 0 , 0 , 1 , 1 , 1 ’14 «F»
Data 1 , 0 , 0 , 1 , 1 , 1 , 1 ’15 «E»
Data 0 , 0 , 0 , 0 , 1 , 0 , 1 ’16 «r»

‘*******************************************************************************

‘*******************************************************************************
‘ Опрос кнопок
Bootons:
Incr X
Stop Timer1
If Vibor = 0 And Booton_flag = 0 And Up = 1 And Down = 1 Then Gosub Set_mode ‘ Нажатие кнопки УСТ
If Set_flag = 1 And Vibor = 1 Then ‘Кнопки Вверх и Вниз активны только после входа в меню
If Up = 0 Then Gosub Up_const
If Down = 0 Then Gosub Down_const
End If
If Vibor = 0 And Up = 0 And View_menu = 0 And Booton_flag_2 = 0 Then Gosub Set_h_led1
‘ If Vibor = 0 And Down = 0 And View_menu = 0 And Booton_flag_2 = 0 Then Gosub Set_h_led2

If Vibor = 1 And Up = 1 And Down = 1 Then Reset Booton_flag ‘сброс флага удержания кнопки
If Vibor = 1 Then Reset Booton_flag_2
Start Timer1 : Start Timer0
Return
‘*******************************************************************************


Set_mode:
Enable Interrupts : Enable Timer0 : Start Timer0

Set Set_flag ‘ поднимаем флаг режима настройки уставок (находимся в меню)
Set Booton_flag ‘ поднимаем флаг удержания кнопки (пока не сбросится, в следующий пункт меню не попадаем)
Count = 0 ‘сброс счетчика автоматического выхода из меню
If On1 = Off1 Or On2_l = Off2_l And On2_h = Off2_h Then Gosub Errors ‘Блокировка ввода уставок. Переходим в подпрограмму индикации ошибки
Incr View_menu ‘ следующий пункт меню
If View_menu > 4 Then View_menu = 0 ‘ всего 4 пункта меню, 0й — основной режим

Select Case View_menu ‘индикация подсказок пунктов меню
Case 0 : ‘ —
Set Podskaz_flag
Set Podskaz_flag_sec
Chislo(1) = 10
Chislo(2) = 10
Chislo(3) = 10
Chislo(4) = 10
Chislo(5) = 10
Chislo(6) = 10
Reset Set_flag ‘
Waitms 500
Stop Timer1 : Stop Timer0
‘ Writeeeprom Off2 , 14 ‘ запись уставки OFF2 в EEPROM
Writeeeprom Off2_l , 26
Writeeeprom Off2_h , 28
Case 1 : ‘ On1
Set Podskaz_flag ‘Поднимаем флаг вывода подсказок (буквы) на 1й индикатор
Chislo(3) = 1
Chislo(2) = 13
Chislo(1) = 0
Waitms 500

Case 2 : ‘ OF1
Set Podskaz_flag ‘Поднимаем флаг вывода подсказок (буквы) на 1й индикатор
Chislo(3) = 1
Chislo(2) = 14
Chislo(1) = 0
Waitms 500
Stop Timer1 : Stop Timer0
Writeeeprom On1 , 0 ‘ запись уставки ON1 в EEPROM

Case 3 : ‘ On2
Set Podskaz_flag_sec ‘Поднимаем флаг вывода подсказок (буквы) на 2й индикатор
Chislo(6) = 2
Chislo(5) = 13
Chislo(4) = 0
Waitms 500
Stop Timer1 : Stop Timer0
Writeeeprom Off1 , 5 ‘ запись уставки OFF1 в EEPROM

Case 4 : ‘ OFF2
Set Podskaz_flag_sec ‘Поднимаем флаг вывода подсказок (буквы) на 2й индикатор
Chislo(6) = 2
Chislo(5) = 14
Chislo(4) = 0
Waitms 500
Stop Timer1 : Stop Timer0
‘ Writeeeprom On2 , 10 ‘ запись уставки ON2 в EEPROM
Writeeeprom On2_l , 22
Writeeeprom On2_h , 24
End Select

Reset Podskaz_flag
Reset Podskaz_flag_sec
Return

Errors:
Set Error_flag ‘ поднимаем флаг ошибки
If On1 = Off1 Then
Set Podskaz_flag
Chislo(1) = 15
Chislo(2) = 16 ‘Выводим подсказку Err и мигаем на 1м индикаторе
Chislo(3) = 16
Waitms 500
Chislo(1) = 11
Chislo(2) = 11
Chislo(3) = 11
Waitms 500
Chislo(1) = 15
Chislo(2) = 16
Chislo(3) = 16
Waitms 500
Chislo(1) = 11
Chislo(2) = 11
Chislo(3) = 11
Waitms 500
End If
If On2_l = Off2_l And On2_h = Off2_h Then
Set Podskaz_flag_sec
Chislo(4) = 15
Chislo(5) = 16 ‘Выводим подсказку Err и мигаем на 2м индикаторе
Chislo(6) = 16
Waitms 500
Chislo(4) = 11
Chislo(5) = 11
Chislo(6) = 11
Waitms 500
Chislo(4) = 15
Chislo(5) = 16
Chislo(6) = 16
Waitms 500
Chislo(4) = 11
Chislo(5) = 11
Chislo(6) = 11
Waitms 500
End If
Select Case View_menu ‘ взависимости от того, в каком пункте меню ввели неверное значение
Case 0 : ‘ возвращаем из EEPROM предыдущие значения
Case 1 :
Readeeprom On1 , 0
Case 2 :
Readeeprom Off1 , 5
Case 3 :
‘ Readeeprom On2 , 10
Readeeprom On2_l , 22
Readeeprom On2_h , 24
Case 4 :
‘ Readeeprom Off2 , 14
Readeeprom Off2_l , 26
Readeeprom Off2_h , 28
End Select
Decr View_menu ‘ возвращаемся в предыдущий пункт меню (в ошибочный)
Count = 0 : Reset Error_flag
Return

Up_const:
Enable Interrupts : Enable Timer0 : Start Timer0
Count = 0
Select Case View_menu
Case 1 :
If On1 < 999 Then Incr On1 ‘
Case 2 : ‘
If Off1 < 999 Then Incr Off1
Case 3 : ‘
‘ If On2 < 999 Then Incr On2
If On2_l < 1000 Then
Razryad_2 = &B11101110
On2_h = 99
Incr On2_l
On2 = On2_l
End If
If On2_l > 999 Then
Razryad_2 = &B01110111
If On2_h < 999 Then Incr On2_h
On2 = On2_h
End If ‘
Case 4 : ‘
‘ If Off2 < 999 Then Incr Off2
If Off2_l < 1000 Then
Razryad_2 = &B11101110
Off2_h = 99
Incr Off2_l
Off2 = Off2_l
End If
If Off2_l > 999 Then
Razryad_2 = &B01110111
If Off2_h < 999 Then Incr Off2_h
Off2 = Off2_h
End If
End Select
Waitms 15
Return


Down_const:
Enable Interrupts : Enable Timer0 : Start Timer0
Count = 0
Select Case View_menu
Case 1 :
If On1 > 0 Then Decr On1 ‘ добавляется второе условие при работе с отрицательными числами
Case 2 :
If Off1 > 0 Then Decr Off1
Case 3 :
‘ If On1 > 0 Then Decr On2
If On2_h > 99 Then
Razryad_2 = &B01110111
On2_l = 1000
If On2_h > 99 Then Decr On2_h
On2 = On2_h
End If
If On2_h < 100 Then
Razryad_2 = &B11101110
If On2_l > 0 Then Decr On2_l
On2 = On2_l
End If
Case 4 :
‘ If Off2 > 0 Then Decr Off2
If Off2_h > 99 Then
Razryad_2 = &B01110111
Off2_l = 1000
If Off2_h > 99 Then Decr Off2_h
Off2 = Off2_h
End If
If Off2_h < 100 Then
Razryad_2 = &B11101110
If Off2_l > 0 Then Decr Off2_l
Off2 = Off2_l
End If
End Select
Waitms 15
Return


Set_h_led1:
Set Booton_flag_2
Rotate Razryad_1 , Left
Stop Timer1 : Stop Timer0
Writeeeprom Razryad_1 , 16
Return


Set_h_led2:
‘ Set Booton_flag_2
‘ Rotate Razryad_2 , Left
‘ Stop Timer1 : Stop Timer0
‘ Writeeeprom Razryad_2 , 17
Return

Встраиваемый ампервольтметр на ATmega8

Автор Hackaday.io под ником Electroniclovers123 рассказывает, как изготовить простой встраиваемый ампервольтметр на микроконтроллере ATmega8 и дисплее на чипе, совместимом с HD44780 (КБ1013ВГ6). Далее приведена схема устройства:

Шунтом амперметра служат два соединённых параллельно резистора сопротивлением в 0,33 Ома и мощностью в 5 Вт. Один из них на схеме не виден из-за неправильного кадрирования изображения самим мастером. Левый вывод шунта соединён с общим проводом ампервольтметра, а правый — с выводом 26 микроконтроллера. При помощи АЦП микроконтроллер измеряет падение напряжения на этом шунте. Таким образом, общий провод БП нагрузки оказывается соединён с общим проводом ампервольтметра, но его нельзя соединять с общим проводом самой нагрузки, иначе часть потребляемого нагрузкой тока пойдёт в обход шунта, и показания амперметра исказятся. Напряжение питания нагрузки попадает через делитель на резисторах на вывод 27 микроконтроллера, а напряжение питания самого ампервольтметра, ещё не пропущенное через стабилизатор — через другой делитель на вывод 25 микроконтроллера. Таким образом, при помощи трёх встроенных в микроконтроллер АЦП самоделка может измерять три параметра: ток, потребляемый нагрузкой, напряжение её питания и собственное напряжение питания. В программе заложены все необходимые коэффициенты, учитывающие параметры шунта и делителей напряжения. Еслм они будут отличаться, код можно скорректировать и откомпилировать заново. Для переключения режимов отображения информации в устройстве предусмотрена единственная кнопка. И вот мастер получил печатные платы (одну себе, одну знакомому, который тоже решил собрать такой же ампервольтметр?) и все необходимые компоненты:

Он впаивает в плату все компоненты (прошив микроконтроллер заранее, это не Arduino), не забыв установить стабилизатор на теплоотвод. Это особенно важно, если ампервольтметр и нагрузка питаются от одного и того же источника, напряжение которого заметно больше 5 В (но не больше 35). В некоторых случаях может потребоваться увеличение размера теплоотвода.

Предусматривает на плате плоские контакты для соединителей, аналогичных РППИ, и подключает с помощью таких соединителей проводники большого сечения (например, 2,5 мм2) для источника питания и нагрузки. Но полностью реализовать возможности проводников этого сечения (ток до 32 А) помешают печатные проводники, которые столько не выдержат.




Затем мастер запитывает устройство от импульсного преобразователя с 12 В на выходе:



Включает питание преобразователя, выходное напряжение которого регулирует миниатюрной отвёрткой, медленно вращая подстроечный резистор на его плате. В момент снятия скриншота с видео это напряжение составляет 11,28 В.

Далее приведено само видео с процессом сборки и наладки:

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


Источник (Source) Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

Цифровой вольтметр на Atmega8. Схема принципиальная. Прошивка.

Представленное здесь устройство пригодится, если у Вас есть блок питания с выходным напряжение 0-10 В. Именно такие пределы измерения «заложены» в схему представленную на рисунке. В ее основе — микроконтроллер Atmega8 (U1) в стандартном корпусе DIP. Он может показаться громоздким, но был выбран из-за широкой популярности, а также по причине того, что программаторы, для данного микроконтроллера очень распространены. Atmega8 используют большинство радиолюбителей и в Интернете можно найти немало схем с этим микроконтроллером. Поэтому, если Вам не понравится данный вольтметр, Atmega8 не останется лежать без дела.

Цифровой вольтметр на Atmega8. Схема электрическая принципиальная.

Цифровой вольтметр на Atmega8. Схема принципиальная.

Показатели измерения вольтметра будут отображаться на цифровом семисегментном трехзначном индикаторе (DISP1). Дам немного информации по поводу него.

7-сегментный цифровой LED индикатор — это индикатор, состоящий из семи светодиодов, установленных в форме цифры 8. Зажигая или выключая соответствующие LED-ы (сегменты) можно отображать цифры от нуля до девяти, а так же некоторые буквы. Обычно используется несколько цифровых индикаторов, чтобы создать многозначные цифры — для этого индикаторы снабжены сегментом в виде запятой (точки) — dp. В итоге, у одного индикатора 8 сегментов, хотя называют их по числу цифровых сегментов 7-сегментным.

Каждый сегмент индикатора представляет собой отдельный светодиод, который может быть включен (светиться) или выключен (не светиться) в зависимости от полярности подаваемого на них напряжения. Индикаторы бывают как с общим катодом, так и с общим анодом. Речь идет об общем соединении всех светодиодов (сегментов). Кроме этого, индикаторы могут содержать несколько цифр, в таком случаем каждая цифра называется разрядом или знаком. Например, трехразрядный (трехзначный) семисегментный индикатор содержит три цифры. Именно такой индикатор и понадобится для этого устройства.

Устройство 7-сегментного индикатора.

Устройство 7-сегментного индикатора.

В конструкции используется индикатор красного свечения GNT-2831BD-11 с общим анодом. Резисторы R1-R8 определяют ток в индикаторе и, следовательно, его яркость. Их сопротивление не должно превышать максимальный выходной ток (40 мА), даже когда все 8 светодиодов горят сразу. В схеме используется несимметричный 10-битный АЦП (аналого-цифровой преобразователь), находящийся в AVR. Диапазон выходного значения составляет 0-999. Когда будет достигнут предел этих значений, появится символ «—«.

На входе вольтметра (in) установлен делитель напряжения из резисторов R9, R10 и R11, обеспечивая диапазон измерения до 10 В с погрешностью 0,01 В. На выводе 23 микроконтроллера U1 делитель формирует напряжение, которое не должно превышать 2,5 В. Входное сопротивление вольтметра близко к 1мОм. Для калибровки вольтметра подайте на его вход точно известное напряжение и, перемещая подстроечный резистор R11, добейтесь на индикаторе таких же показаний.

Частота обновления вольтметра составляет около 4 Гц. Схема питается от стабилизированного источника напряжением 5 В. Потребляемый ток устройства составляет около 25 мА (большая часть потребления приходится на индикатор). Компоненты C1 и C2 расположите как можно ближе к микроконтроллеру.

Правильно выставленные биты представлены на рисунке ниже.

Конфигурационные биты вольтметра.

Конфигурационные биты вольтметра.

Если Вам необходимы пределы измерения до 100 В, измените значение R10 на 9,1мОм и R11 на 2,2 мОм. Тогда Вы получите желаемый диапазон измерения с погрешностью 0,1 В и входным сопротивлением около 10мОм. В этом случае придется изменить и место точки индикатора, чтобы она отображалась за двумя символами, а не за первым, как на схеме. Для этого вывод 28 микросхемы U1 оставьте свободным, а к общему проводу подключите вывод 27. Теперь вместо символов в виде 0.00 будут отображаться 00.0.

Прошивку можно скачать с нашего файлового архива: proshivka_voltmeter.zip [526 б]

Миниатюрный вольтметр на семисегментном LED индикаторе и PIC16F684

Привет читателям Датагора! Мне удалось собрать вольтметр минимальных размеров с посегментной разверткой индикатора при довольно высокой функциональности, с автоматическим определением типа индикатора и выбором режимов.
Миниатюрный вольтметр на семисегментном LED индикаторе и PIC16F684
Прочитав статьи Edward Ned’а, я собрал DIP-версию и проверил ее в работе. Действительно вольтметр работал, ток через вывод микросхемы к индикатору не превышал 16 миллиампер в импульсе, так что работа микросхемы без резисторов, ограничивающих токи сегментов, вполне допустима и не вызывает перегрузок элементов.
Не понравилось слишком частое обновление показаний на дисплее и предложенная шкала «999». Хотелось подправить программу, но исходных кодов автор не выкладывает.

В это же мне потребовались вольтметр и амперметр для небольшого блока питания. Можно было собрать на PIC16F690 совмещенный вариант, а можно было собрать два миниатюрных вольтметра, причем габариты двух вольтметров получались меньше совмещенного варианта.
Свой выбор я остановил на микросхеме PIC16F684 и написал исходный код для посегментной развертки индикатора.
В процессе написания кода возникла идея программируемого переключения шкал и положения запятой, что и удалось реализовать.

Содержание / Contents

• Автоматически определяется тип индикатора, поэтому в схеме будут работать как общий анод, так и общий катод.
• С помощью кнопки выставляется желаемая шкала измерений «1023», «511», «343», «256» или «204». Это означает, что при входном напряжении 5 Вольт будет, зажигается максимальное число из вышеуказанных. Поскольку число 10 зажечь на первом элементе индикатора невозможно, то вместо него зажигается верхний сегмент.
• Кнопкой выставляется желаемое место запятой – после первого, второго знака или без запятой.
• Можно запрограммировать сдвиг значений на постоянную величину – потребовался этот режим для правильного измерения тока (вычитается ток измерителя напряжения). Этот вариант и был применен, что и отображено на блок-схеме приложенном примере.

Питание измерителя осуществляется от источника 7,5 – 12 Вольт, при токе 15 – 25 мA, потребление тока зависит от индикатора. Более яркие индикаторы потребляют больший ток.

производится таким образом, чтобы можно было измерить наибольшее значение напряжения или тока. В этом случае будет наибольшая точность при минимальном воздействии помех.

В измерителе программно реализована посегментная развертка индикатора, поэтому в каждый момент времени зажигается только один из сегментов в каждом из знаков. Это приводит к снижению нагрузки на выводы микроконтроллера по сравнению с поразрядной индикацией.

Миниатюрный вольтметр на семисегментном LED индикаторе и PIC16F684 Деталей в схеме очень мало, и все они расположены на плате между выводами индикатора 0,36″.

Кнопка используется только перед установкой в конечное устройство, при эксплуатации ей не пользуются. При включении происходит измерение падения напряжения на резисторе R4 и по результатам измерений происходит выбор примененного типа индикатора «Общий катод» или «Общий анод».

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

Сдвиг шкалы вычисляется автоматически по результатам измерения паразитного тока, протекающего по шунту блока питания, если это необходимо.

После установки нужных значений шкалы, положения запятой и сдвига показаний производится запись установленных значений в EEPROM и в дальнейшем эти данные вызываются из памяти при включении.

Программа написана на «mikroC for PIC» и снабжена достаточным количеством комментариев для понимания ее работы.

• Короткое нажатие вызывает смену шкалы. Шкалы меняются по кругу («1023», «511», «343», «256» или «204»). На индикаторе загорается максимальное значение шкала на 0,5 секунды, а затем высвечивается значение входного напряжения.
• Длительное (0,5 – 1 сек) нажатие перемещает запятую вправо по кругу (после первого, второго знака или без запятой).
• Если кнопка удерживается при включении 0,5 — 2 сек, то измеритель ожидает 3 секунды, пока установятся режимы блока питания и записывает величину паразитного тока в память. При этом нагрузка от блока питания не должна быть подключена.
Если эту коррекцию надо изменить, то операцию можно повторить.
Если коррекцию надо убрать, то кнопку надо удерживать при включении более 3 секунд. Миниатюрный вольтметр на семисегментном LED индикаторе и PIC16F684
Был собран малогабаритный блок питания, у него получились следующие параметры:
Напряжение 0 – 31,2 Вольта.
Ток 0 – 2,2 Ампера.Миниатюрный вольтметр на семисегментном LED индикаторе и PIC16F684
Как видно из блок-схемы, через шунт протекает ток, потребляемый измерителем напряжения, который сдвигает показания измерителя тока в сторону увеличения. Этот ток имеет постоянную величину, поэтому этот сдвиг можно учесть в программе измерителя.

Для измерения напряжения в этом случае удобными оказались значения: шкала «343» и запятая после 2-го знака. При этом максимальное значение шкалы составит 34,3 Вольта, что вполне приемлемо.

Для измерения тока удобными оказались значения: шкала «255» и запятая после 1-го знака, соответственно максимальное значение шкалы составит 2,55 Ампера. В связи с тем, что по токоизмерительному шунту протекает ток, потребляемый измерителем, показания тока были завышены. После проведения коррекции этот паразитный ток стал вычитаться из общих показаний и показания стали правильными.

После установки шкал в блоке питания были подобраны значения резисторов делителя R2, R3 и коэффициент усиления OP1 так, чтобы показания соответствовали контрольным.

• Простейший вольтметр на PIC16F676.
• Суперпростой вольтметр стал ещё проще!
• Готовые миниатюрные вольтметры с доставкой, кому недосуг паять.
• Семисегментные LED индикаторы с Али.
• Чипы PIC16F684. ▼ Файловый сервис недоступен. Зарегистрируйтесь или авторизуйтесь на сайте.

▼ Файловый сервис недоступен. Зарегистрируйтесь или авторизуйтесь на сайте.

Спасибо за внимание!

Камрад, рассмотри датагорские рекомендации

Миниатюрный вольтметр на семисегментном LED индикаторе и PIC16F684

Иван Внуковский (if33)

Украина, г. Днепропетровск

Радиолюбитель, стаж более 40 лет. Работал на заводе инженером КБ, инженером по обслуживанию ЭВМ, механиком по ремонту бытовой техники. Сейчас на пенсии.

 

Семисегментный индикатор и динамическая индикация на AVR микроконтроллере ATmega8

В разных конструкциях бывает оправдано использовать семисегментные светодиодные индикаторы, дешево и сердито по сравнению с символьными ЖКИ. Светодиодный индикатор представляет собой восемь светодиодов (7 для представления цифры и 1 для точки) расположенные в виде слегка наклоненной цифры:
В разных конструкциях бывает оправдано использовать семисегментные светодиодные индикаторы, дешево и сердито по сравнению с символьными ЖКИ. Светодиодный индикатор представляет собой восемь светодиодов (7 для представления цифры и 1 для точки) расположенные в виде слегка наклоненной цифры:
семисегментный светодиодный индикатор
Светодиоды внутри имеют общий анод (ОА) или общий катод (ОК). То есть, для управления одной цифрой нужно 8 выводов микроконтроллера. А что же делать, когда нужно управлять, например, четырьмя цифрами? Использовать микроконтроллер с 4*8=32 выводами? Не экономично.

Для такого случая придумали динамическую индикацию. Для этого соединяем выводы, которые отвечают за включение сегментов в общую шину, а общими анодами (катодами) будем управлять через транзисторы. В отдельный момент времени горит только одна цифра. Таким образом быстро перебирая цифры на дисплее (как кадры в фильме) мы получим эффект постоянно горящего изображения. В замедленном варианте, как это происходит, можно посмотреть на картинке:
анимация динамической индикации
А вот ускоренная в 25 раз картинка, уже начинают вырисовываться контуры «12.34»:
анимация динамической индикации
Используя принцип динамической индикации мы сможем управлять четырьмя цифрами при помощи 8+4=12 выводов. Использование же 2-х сдвиговых регистров HC595 может сократить это число до 4. Рассмотрим схему подключения к микроконтроллеру:
анимация динамической индикации
Управлять же индикатором будем с помощью микроконтроллера ATmega8. Резисторы R5-R13 – ограничительные на 470 Ом. R1-R4 – по 1кОм. Транзисторы Q1-Q4 – любые PNP типа, я использовал BC807 в планарном исполнении. Конденсаторы С5,С7 – электролиты по 100 и 200мкф соответственно, С4,С6 – керамика по 0,1мкф. Так как индикатор с общим анодом, то соответственно включение разряда/сегмента производиться низким уровнем.

Для индикаторов с общим катодом схема аналогична, только транзисторы следует взять NPN структуры, и управляться индикатор будет высоким уровнем.
Продемонстрируем сказанное, напишем программу, которая будет перебирать числа от 0 до 9999 и выводить их на семисегментный индикатор.

  1. #include <avr/io.h>

  2. #include <avr/interrupt.h>

  3. // 0 1 2 3 4 5 6 7 8 9

  4. const unsigned char codes[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  5.  

  6. unsigned char data[4]={0x00,0x00,0x00,0x00};

  7. unsigned char counter=0;

  8.  

  9. void pause (unsigned int a)

  10. { unsigned int i; for (i=a;i>0;i--); }

  11.  

  12. void init_timer (void)

  13. { TIMSK=(1<<TOIE0); //Enable timer overflow interrupt

  14. TCCR0=(0<<CS00)|(1<<CS01)|(0<<CS02); //Prescaller = /1

  15. }

  16.  

  17. void convert_data (unsigned int x)

  18. {unsigned int temp,res;

  19. temp=x;

  20. res=temp/1000; //Calculate 1000-s

  21. data[3]=codes[res];

  22. temp=temp-res*1000;

  23.  

  24. res=temp/100; //Calculate 100-s

  25. data[2]=codes[res];

  26. temp=temp-res*100;

  27.  

  28. res=temp/10; //Calculaate 10-s

  29. data[1]=codes[res];

  30. temp=temp-res*10;

  31.  

  32. data[0]=codes[temp]; //Calculate 1-s

  33. }

  34.  

  35. ISR (TIMER0_OVF_vect)

  36. {PORTD=0xff;

  37. PORTB=~_BV(counter); //Enable digit

  38. PORTD=~data[counter]; //Write code

  39. counter=(counter+1)%4; //Increment digit counter

  40.  

  41. TCNT0=0x00; //Clear timer

  42. }

  43.  

  44. int main(void)

  45. { unsigned int x=0;

  46. DDRD=0xff;

  47. PORTD=0x00;

  48. DDRB=0x0f;

  49. PORTB=0x0f;

  50.  

  51. pause(1000); //Settle pause

  52. init_timer(); //Init timer

  53. sei(); //Interrupt enable

  54. while(1)

  55. {convert_data(x); //Conver data to codes

  56. if (x<9999) x=x+1; //Increment data

  57. else x=0;

  58. pause(30000);

  59. }

  60. return 1;

  61. }


Код очень простой. В массиве codes находятся коды, которые следует выводить на порт, чтобы получить желаемую цифру. Смена активной цифры производиться по прерыванию от переполнения таймера 0. А функция convert_data(int x) раскладывает число х по разрядам, и записывает соответствующие коды в массив data, данные из которого выводятся непосредственно на индикатор, при срабатывание прерывания.
Что из этого вышло, можно глянуть на рисунках:
фото динамической индикации
фото динамической индикации

Исходный код можно скачать в виде проекта под AVR Studio 4
Также, может кому пригодиться, платка для моего табло в формате .lay для программы Sprint Layout 5

Собери свою радиосхему!

Устройство собрано на микроконтроллере ATMEGA-8 и светодиодном индикаторе с общим катодом MT-30361, ниже в архиве имеются 2 варианта прошивок, для индикатора с ОК и ОА.

Технические характеристики:

Напряжение питания: 6..14 В

Потребляемый ток: 42 мА

Число разрядов индикатора: 3

Диапазон измерения: от 0 до 50 В

Шаг измерения: 0,1 В

Расчетная погрешность 0,4%

Особенности конструкции:

-Предусмотрена защита от подачи напряжения питания и измеряемого напряжения обратной полярности.

-Для уменьшения размеров устройства применяются SMD компоненты.

принципиальную схему.

Краткое описание схемы.

Входное напряжение питания ограничивается и стабилизируется на уровне 5В микросхемой DA1. Диод VD1 служит для защиты от перепутывания полярности напряжения питания. Стабилитрон VD2 защищает вход микроконтроллера от превышения напряжения и напряжения обратной полярности.

Измеряемое напряжение через делитель R1 R2 R3 поступает на вход АЦП микроконтроллера и преобразуется в цифровой код. Для сглаживания пульсаций код усредняется по 16 замерам. Конденсатор С4 подавляет помехи в источнике опорного напряжения АЦП. Измеренный код масштабируется и величина напряжения раскладывается на десятичные разряды (десятки, единицы и десятые доли вольт). Полученные величины поочередно выводятся в соответствующие разряды индикатора методом динамической индикации. Резисторы R5..R12 ограничивают ток сегментов индикатора до безопасных значений.

 

Детали и настройка.

Чип резисторы R1, R2 желательно применить полупрецизионные размера 0805 или 0603 с допуском 1%. Резистор R3 подстроечный импортный номиналом 1,5-2кОм типа 3329H или 3329H-1.

Чип резисторы R4-R12 размера 0805 с допуском ±5%. Чип конденсаторы С1 и С2 керамические размера 1206, С1 емкостью не менее 10 мкФ с рабочим напряжением от 25 до 50В. Конденсатор C2 не менее 10 мкФ с рабочим напряжением 10..16В. Также можно применить танталовые чип конденсаторы емкостью 10..22мкФ размера «A». Рабочее напряжение конденсатора С1 не менее 25В, а конденсатора С2 не менее 10В.

Чип конденсатор С3 керамический размера 0805, конденсатор С4 размера 0603.

Диод VD1 любой подходящий по размерам с барьером Шоттки. Чип стабилитрон VD2 BZV55C5V1 в корпусе SOD-80.

Стабилизатор DA1 типа L7805ABD2T в корпусе D2PAK или MC7805BDTG в корпусе DPAK.

Светодиодный индикатор с общим катодом МТ-30361(E30361-L-G-8-w) зеленого или МТ-30361(E30361-L-C-8-w) красного свечения.

Заменив прошивку можно применить и индикаторы с общим анодом. Микроконтроллер DD1 любые из серии ATMEGA-8 в корпусе TQFP-32.

 

Для настройки устройства на его вход подают образцовое напряжение 25В и регулируя R3 добиваются совпадения показаний вольтметра с образцовым напряжением. После этого ось подстроечного резистора контрится каплей краски.

 

Несколько слов по поводу конденсатора С4. В большинстве случаев вольтметр нормально работает и без него, однако с некоторыми экземплярами микроконтроллера Atmega8A при отсутствии входного напряжения вольтметр может показывать не нулевое напряжение. Это происходит из-за влияния помех на источник опорного напряжения 2.56В. При подключении С4 помехи полностью устраняются.

Вид собранной платы

 

Программа написана на языке С для компилятора WinAVR-20090313

Заводские настройки фьюз-бит при программировании менять не требуется.

Код и прошивки для варианта индикатора с общим катодом:

Исходный код для ATMEGA-8 и прошивка для ATMEGA-8

 

файлы проекта (~45кб.)

Ампервольтметр с измерением отобранной ёмкости от аккумулятора на Atmega8 и дисплее от Nokia 1202

РадиоКот >Схемы >Цифровые устройства >Измерительная техника >

Ампервольтметр с измерением отобранной ёмкости от аккумулятора на Atmega8 и дисплее от Nokia 1202

     С приближением холодов резко возрастает число случаев отключения электроэнергии. Это происходит как по воле природы (обледенение линий электропередач и обрывы проводов) так и из-за человеческого фактора (веерные отключения по графику). Чтобы не сидеть часами без электроэнергии автором был приобретен импульсный преобразователь напряжения =12V в ~220V мощностью 200 Вт. Подключив к нему 12-вольтовый свинцовый аккумулятор можно в любой момент запитать бытовую технику указанной мощности, вплоть до телевизора. Единственное неудобство при этом – необходимость постоянно как-то отслеживать степень заряда аккумулятора, иначе в самый неподходящий момент при понижении напряжения ниже 10 В преобразователь отключается. Замер напряжения аккумулятора, тока нагрузки и подсчет отобранной у аккумулятора ёмкости с сохранением в энергонезависимой памяти – задача как раз для микроконтроллера.
     В Интернете было найдено нечто подобное на форуме https://radioskot.ru/ — Цифровой измеритель тока и напряжения (автор Бухарь). Идея данного проекта была переработана под собственную задачу, в результате чего получился вот такой приборчик:

     Технические характеристики:
Измеряемое (питающее) напряжение, В…………………………………3,50÷20,00
Измеряемый ток, А………………………………………………………………..0,00÷20,00
Измеряемая ёмкость, мАч…………………………………………………..0÷99999
Измеряемая температура внешним датчиком DS18B20, °C..…..-55,0 ÷ +128,0
Потребляемый ток (без подсветки), мА………………………………….2,6
Частота замеров, Гц………………………………………………………….……4

    Схема электрическая принципиальная:

     Измеритель содержит стабилизатор напряжения питания +3В DA2 LP2951CM-3.0, микроконтроллер DD1 ATmega8A-AU, графический дисплей от Nokia 1202, делитель измеряемого входного напряжения R7, R8, шунт токовый R1 сопротивлением 1мОм из полоски манганина, усилитель токового канала DA1 AD8551ARZ с цепями смещения и обвязки, разъём X1 для подключения программатора, разъём X2 для подключения внешнего датчика температуры, кнопки управления SB1…SB3 а также цепи фильтрации и защиты по питанию.
     Стабилизатор напряжения LP2951CM-3.0 – типа Low Dropout с допустимым входным напряжением до +30В, обеспечивает питанием +3В все цепи устройства.
     Входное напряжение измеряется с помощью резистивного делителя :10 R7, R8 каналом ADC6 микроконтроллера. В качестве опорного напряжения использован его внутренний ИОН +2,56В. Резисторы использованы с допуском ±5% поскольку предусмотрена программная калибровка прибора, но для лучшей температурной стабильности всё же рекомендуются к применению резисторы с большей точностью.
     Дискретность при измерении напряжения 10-ти разрядным АЦП микроконтроллера составляет 25мВ, но поскольку число замеров составляет 300, виртуальное разрешение АЦП возрастает до примерно 14 разрядов, а дискретность уменьшается примерно в 16 раз до 1,5мВ [1], чего вполне достаточно для отображения результата в формате ХХ.ХХ В.
     Схема измерения потребляемого тока состоит из шунта R1, усилителя DA1 и канала ADC7 АЦП микроконтроллера. Первоначально была идея использовать готовый шунт от сгоревшего китайского мультиметра типа M830, в котором имеется диапазон 20А. Сопротивление манганинового проволочного шунта в таких мультиметрах составляет 0,01Ом. При токе 20А рассеиваемая мощность шунта составит: P=I²R=20²∙0,01=4Вт!!! При рекомендованных к измерению мультиметром 10А — 10²∙0,01=1Вт.
     Конечно, при кратковременных замерах тока до 10А мультиметром нагрев такого шунта будет незначительным, но при постоянном протекании тока величиной 20А (а это 10,5В∙20А=210Вт нагрузки) такой шунт явно не выдержит.
     Поэтому был использован шунт сопротивлением в 10 раз меньше, т.е. 0,001 Ом. Рассеиваемая на таком шунте мощность при токе 20А составит уже приемлемые 20²∙0,001=0,4Вт. Шунт изготовлен из манганинового листа толщиной 1 мм. Размеры вырезанной полосы составляют 35х12мм с напаянными по краям медными накладками шириной 6 мм. Подобный шунт используется в некоторых типах электронных счетчиков электроэнергии.
     Чтобы усилить падение напряжения на таком шунте (20А∙0,001 Ом=0,02В) до верхнего диапазона АЦП использован неинвертирующий усилитель на ОУ DA1 с коэффициентом усиления 111. В качестве ОУ был применён AD8551, имеющий, благодаря технологии Zero-Drift, довольно малое смещение нуля (Low Offset Voltage: 1 mV) и хорошую температурную стабильность (Input Offset Drift: 0.005 mV/°C) [2].
     Для компенсации возможного первоначального смещения нуля конкретного экземпляра ОУ в отрицательную сторону служат резисторы R17, R18. Т.о. на входе ОУ создаётся небольшое положительное смещение, компенсируемое программным путём в процессе калибровки.      Дискретность измеряемого тока АЦП микроконтроллера составляет 22,5мА. С учетом 300 замеров и виртуального разрешения АЦП около 14 разрядов реальная дискретность уменьшается примерно в 16 раз до ~1,4 мА. Конденсатор C1 в цепи ООС ОУ DA1 реально был убран с платы для лучшего “зашумления” входного сигнала АЦП и уменьшения дискретности [1].
     Для подсчёта отобранной от аккумулятора ёмкости временные интервалы для микроконтроллера формируются часовым кварцем ZQ1 и таймером-счетчиком 2, работающим в асинхронном режиме.
     Кнопки SB1…SB3 подключены к линиям микроконтроллера через ограничительные резисторы R9…R11. В момент нажатия кнопок формируется импульс тока смачивания (10мс) для автоматической зачистки контактов кнопок, величина которого ограничивается данными резисторами в районе 6мА. Т.о. удаляется тонкая пленка окислов с контактов, образующаяся с течением времени.
     Измеритель выполнен на печатной плате размерами 50х34х1,5мм из одностороннего фольгированного стеклотекстолита. Плата разрабатывалась специально под стандартный пластиковый корпус 57х37,5х18,5 мм, применяемый для телевизионных антенных фильтров и сумматоров ДМВ+МВ, разделителей и т.п.
     Вид со стороны дисплея в корпусе:

     Вид со стороны печатных проводников:

     Плата фиксируется в корпусе на разъёме X2 и клеммниках X3, X4, под которые в боковых стенках сделаны пазы.

     Перечень элементов:

C1 = 0* (0805)
C2, C3 = 0,01 (0805)
C4 = 10,0х25В (Танталовый, корпус А)
C5 = 0,47×50В (0805)
C6 = 4,7uF (0805 6,3В)
C7, C8 = 24pF (0805)
C9 = 0,47 (0805)
C10 = 47,0х6,3В (Танталовый, корпус А)
C11 = 0,47 (0805)
C12 = 1,0 (0603)
C13 = 4,7uFх6V (0603)
C14 = 0,47 (0603)

DA = DS18B20 (TO-92 (PR35))
DA1 = AD8551ARZ (SO-8)
DA2 = LP2951CM-3.0 (SO-8)

DD1 = ATmega8A-AU (TQFP-32)

h2 = STE2007 (Nokia 1202_1203_1280)

L1, L2 = 22uH (1206)

R1 = 0.001 Ом (Шунт манганиновый 20А)
R2 = 1к (0805)
R3 = 3к (0805)
R4 = 470 (1206)
R5 = 10 (1206)
R6 = 330к (0805)
R7 = 270к (1206)
R8 = 30к (0805)
R9-R11 = 430 (0805)
R12 = 220 (0805)
R13 = 4,7к (0805)
R14 = 330к (1206)
R15 = 1к* (1206)
R16 = 470 (0603)
R17 = 47*±1% (0603)
R18 = 1М±1% (С2-29В-0,125)

SB1-SB3 = Кнопка тактовая 6х6х6,5мм

VD1 = MBR0540 (SOD-123)
VD2 = BZV55-C33V (SOD-80)
VD3 = MBR0540 (SOD-123)

X1 = WSR-6 (Вилка на плату угловая, шаг 2мм)
X2 = WKR-3 (Шаг 2,54 мм)
X3, X4 = DG301R-5.0 (Клеммник)

ZQ1 = Кварц часовой Ø3мм, 32768 Гц

Перемычки 1206 – 5 шт.

     Дисплей монтируется в последнюю очередь – крепится к плате при помощи нескольких кусочков толстого (3 мм) двухстороннего пористого скотча. Шлейф аккуратно изгибается под 180° и припаивается к печатным дорожкам на плате паяльником с узким жалом.
     После сборки и проверки монтажа необходимо запрограммировать микроконтроллер. Фьюзы (PonyProg):

     После подачи питания на дисплей выведется текущая информация (напряжение, ток, сопротивление нагрузки, мощность, рассеиваемая нагрузкой, температура внешнего датчика DS18B20 (для контроля температурного режима преобразователя) и отобранная от аккумулятора ёмкость:

     При отсутствии внешнего датчика температуры вместо ХХ.Х°С будет выводиться надпись “TERM OFF”:

     При нажатии кнопки “▲” текущее значений ёмкости будет сохранено в энергонезависимой памяти с подтверждением в виде всплывающего сообщения:

     При нажатии кнопки “МЕНЮ” на экране появляется меню настроек:

 

     Перемещение по меню осуществляется кнопками “▲” и “▼” (при этом перемещается курсор ►слева пунктов).
Вход/выход из пункта меню настроек осуществляется кнопкой “МЕНЮ”. Активный пункт выводится с инверсией.
Первый пункт “Сохр. мАч” предназначен для включения функции автоматического сохранения текущей измеренной ёмкости при выключении питания.

     Следующий пункт включает/выключает подсветку.
     Пункт “Калиб.U” предназначен для калибровки канала измерения напряжения во внешнему эталонному вольтметру. Для более точной калибровки измеряемое напряжение выводится с дискретностью 1мВ.
     Пункты “Калиб.I” и “Смещ.I” предназначены для калибровки токового канала. Сначала необходимо в отсутствие нагрузки выставить смещение нуля в соответствующем пункте так, чтобы получить нулевые показания тока. Вернее, в пункте “Калиб.I” показания тока должны немного выйти в положительную область и быть в диапазоне (0.000÷0.001)А, т.к. отрицательное значение АЦП не измеряет. Для более точной калибровки измеряемый ток выводится с дискретностью 1мА. В пункте “Смещ.I” отображается заданное смещение тока и знак. При затруднении с регулировкой смещения тока следует уменьшить сопротивление резистора R18. После регулировки смещения нуля токового канала следует подключить последовательно с нагрузкой образцовый амперметр и в пункте “Калиб.I” выставить точное значение потребляемого тока.
     Пункт меню “Выход” предназначен для перехода в обычный режим измерения (кнопкой “▲” или “▼”).
     В нижней строке меню настроек отображается сохранённое значение измеренной ёмкости.
     Обнулить измеренную ёмкость можно кнопкой “▼” в обычном режиме измерения:

     Литература:
     1) AVR121. Enhancing ADC resolution by oversampling
     2) AD8551/AD8552/AD8554 Datasheet

     

Файлы:
Исходник
Плата
Схема

Все вопросы в Форум.


Как вам эта статья?

Заработало ли это устройство у вас?

Взаимодействие с 7-сегментным дисплеем с микроконтроллером AVR

В этом руководстве мы собираемся разработать счетчик 0-99 с помощью , сопрягая два семисегментных дисплея с микроконтроллером ATMEGA32A . Здесь мы считаем события в зависимости от количества нажатий кнопки.

Прежде чем двигаться дальше, давайте разберемся, что такое семисегментный дисплей. Семисегментный дисплей получил свое название от того факта, что он имеет семь светящихся сегментов. Каждый из этих сегментов имеет светодиод (светоизлучающий диод).Вы можете увидеть схему контактов семисегментного дисплея на изображении ниже.

7 Segment Display

Светодиоды изготовлены таким образом, что свечение каждого светодиода ограничивается его собственным сегментом. Здесь важно отметить, что светодиоды на любом семисегментном дисплее расположены в режиме общего анода (общий положительный) или общего катодного режима (общий отрицательный).

Common Anode and Common Cathode Displays

Схема подключения светодиодов с общим катодом и общим анодом показана на рисунке выше. Здесь можно увидеть, что в общем катоде отрицательные клеммы каждого светодиода соединены вместе и выведены как GND.В общем аноде положительный полюс каждого светодиода соединен вместе и выведен как VCC. Эти дисплеи с общим катодом и общим анодом очень удобны при объединении нескольких ячеек.

Теперь давайте разберемся с мультиплексированием. Это простой метод, используемый для параллельного подключения большего количества устройств, чтобы уменьшить количество требуемых выводов, используя визуальный эффект. Предположим, что светодиод постоянно включается и выключается со скоростью 2 Гц в секунду, то есть он включается два раза и выключается два раза в секунду.Теперь с такой скоростью человеческий глаз может видеть как цикл включения, так и цикл выключения. Но если увеличить частоту до 50 Гц, это будет 50 раз включения и 50 раз выключения светодиода за секунду. При такой скорости человеческий глаз вообще не может видеть циклы выключения. Это эффект зрения. При такой скорости глаз видит светодиод с меньшей яркостью, и все.

Необходимые компоненты

Аппаратное обеспечение: ATMEGA32, источник питания (5 В), ПРОГРАММАТОР AVR-ISP, HDSP5503, семисегментные дисплеи (две части) (подойдет любой общий катод), конденсатор 47 мкФ (подключен к источнику питания), кнопка (три штуки), Резистор 10 кОм (две штуки), резистор 1 кОм, резистор 220 Ом (две штуки), конденсатор 100 нФ (три штуки), транзисторы 2N2222 (две штуки).

Софт: Atmel studio 6.1, прогисп или flash magic.

Принципиальная электрическая схема и рабочие пояснения

Decimal Counter Circuit Diagram using AVR Microcontroller

Подключения, которые выполняются для 7-сегментного дисплея, следующие:

PIN1 или e к PIN (A, 4)

PIN2 или d на PIN (A, 3)

PIN4 или c на PIN (A, 2)

PIN5 или h или DP на PIN (A, 7) /// Не требуется, поскольку мы не используем десятичную точку

PIN6 или b на PIN (A, 1)

PIN7 или a на PIN (A, 0)

PIN9 или f на PIN (A, 5)

PIN10 или g на PIN (A, 6)

PIN3 или PIN8 или CC к коллектору транзистора

Здесь важно то, что хотя оба сегмента используют один и тот же порт данных для ATMEGA, общие катоды обоих дисплеев подключены к двум разным коллекторам транзисторов.Теперь, что касается мультиплексирования, как объяснялось во введении, мы собираемся включать и выключать дисплеи вместо светодиодов.

Здесь у нас есть два транзистора, каждый из которых управляет током от каждого дисплея. Что мы делаем, мы собираемся запустить один транзистор на 10 мс, а другой дисплей на еще 10 мс, поэтому один дисплей будет включен на 10 мс, а затем выключится, в течение этого времени будет включен другой дисплей. Затем снова отобразите один и так далее. Эти периоды включения и выключения малы для глаз, поэтому мы видим, что оба дисплея постоянно включены, что в действительности не так.

Здесь присутствуют две кнопки, одна кнопка предназначена для увеличения счетчика отображения, а другая — для уменьшения счетчика отображения. Присутствующие здесь конденсаторы предназначены для того, чтобы свести к нулю эффект отскока кнопок. Если их удалить, контроллер может считать больше одного при каждом нажатии кнопки.

Резисторы, подключенные к контактам, предназначены для ограничения тока, когда кнопка нажата, чтобы опустить контакт к земле. Каждый раз, когда нажимается кнопка, соответствующий штифт контроллера опускается на землю, и, таким образом, контроллер распознает, что определенная кнопка нажата, и должно быть предпринято соответствующее действие — он может увеличивать или уменьшать счетчик в зависимости от нажатой кнопки.

Счетчик отображается в двух сегментах путем мультиплексирования, как объяснялось ранее. Работа этого счетчика 0-99 объясняется шаг за шагом кода C, приведенного ниже. Вы также можете прочитать это руководство, если работаете с микроконтроллером 8051: 7-сегментный дисплей, интерфейс с 8051.

.Принципиальная схема

и C-код

В этом проекте мы собираемся разработать цифровой вольтметр диапазона 25 В с использованием микроконтроллера ATMEGA32A. В ATMEGA мы собираемся использовать 10-битный АЦП (аналого-цифровой преобразователь) для создания цифрового вольтметра. Теперь АЦП в ATMEGA не может принимать входное напряжение более +5 В, поэтому для получения более высокого диапазона мы будем использовать схему делителя напряжения.

Voltage Divider Circuit

Теперь важно отметить, что входной сигнал, используемый контроллером для преобразования АЦП, составляет всего 50 мкА.Этот эффект нагрузки резистивного делителя напряжения важен, поскольку ток, потребляемый из Vout делителя напряжения, увеличивает процент ошибки, пока нам не нужно беспокоиться об эффекте нагрузки.

Мы возьмем два резистора и сформируем схему делителя так, чтобы для напряжения Vin 25 В мы получили выходное напряжение 5 Вольт. Так что все, что нам нужно сделать, это умножить значение Vout на «5» в программе, чтобы получить реальное входное напряжение.

Необходимые компоненты

Аппаратное обеспечение: ATMEGA32, источник питания (5 В), ПРОГРАММАТОР AVR-ISP, JHD_162ALCD (16 * 2LCD), конденсатор 100 мкФ, конденсатор 100 нФ (5 шт.), Резистор 10 кОм, резистор 2 кОм, потенциометр 1 кОм или предустановка.

Софт: Atmel studio 6.1, прогисп или flash magic.

Принципиальная электрическая схема и рабочие пояснения

AVR Microcontroller Based Voltmeter Circuit Diagram

Полная принципиальная схема цифрового вольтметра показана на рисунке выше. Здесь PORTB ATMEGA32 подключен к порту данных ЖК-дисплея. Следует не забыть отключить связь JTAG в PORTC ot ATMEGA, изменив байты предохранителя, если вы хотите использовать PORTC в качестве обычного порта связи.В ЖК-дисплее 16×2 всего 16 контактов, если есть черный свет, если нет подсветки, будет 14 контактов. Можно включить или оставить контакты подсветки. Теперь в 14 контактах 8 контактов данных (7-14 или D0-D7), 2 контакта источника питания (1 и 2 или VSS & VDD или gnd & + 5v), 3 контакта rd для контроля контрастности (VEE-контролирует толщину символов. должен быть показан) и 3 контакта управления (RS, RW и E). (Узнайте больше о ЖК-дисплее в этом руководстве: Сопряжение ЖК-дисплея с микроконтроллером AVR).

В схеме вы можете заметить, что я взял только два управляющих контакта, это дает гибкость для лучшего понимания, бит контрастности и READ / WRITE не часто используются, поэтому их можно замкнуть на землю.Это переводит ЖК-дисплей в режим максимальной контрастности и чтения. Нам просто нужно управлять контактами ENABLE и RS, чтобы отправлять символы и данные соответственно.

Подключения, которые выполняются для ЖК-дисплея, приведены ниже:

PIN1 или VSS на землю

PIN2 или VDD или VCC к питанию + 5В

PIN3 или VEE на землю (дает максимальный контраст для новичков)

PIN4 или RS (выбор регистра) к PD6 uC

PIN5 или RW (чтение / запись) на землю (переводит ЖК-дисплей в режим чтения, что упрощает обмен данными для пользователя)

PIN6 или E (Enable) к PD5 uC

PIN7 или D0 — PB0 uC

PIN8 или D1 — PB1 uC

PIN9 или D2 — PB2 uC

PIN10 или D3 — PB3 uC

PIN11 или D4 — PB4 uC

PIN12 или D5 — PB5 из uC

PIN13 или D6 — PB6 uC

PIN14 или D7 — PB7 стандарта uC

На схеме вы можете видеть, что мы использовали 8-битную связь (D0-D7), но это не обязательно, мы можем использовать 4-битную связь (D4-D7), но с 4-битной коммуникационной программой становится немного сложнее.Мы подключаем 10 контактов ЖК-дисплея к микроконтроллеру, из которых 8 контактов — это контакты данных, а 2 контакта — для управления.

Напряжение на R2 (2,2 кОм) не является полностью линейным; это будет шумно. Чтобы отфильтровать шум, конденсаторы помещаются на каждом резисторе в цепи делителя, как показано на принципиальной схеме выше.

Потенциал 1K здесь предназначен для регулировки точности АЦП. В ATMEGA32A мы можем подавать аналоговый вход на любой из восьми каналов PORTA, не имеет значения, какой канал мы выбираем, поскольку все они одинаковы, мы собираемся выбрать канал 0 или PIN0 PORTA.10 = 5 мВ. Таким образом, на каждые 5 мВ приращения на входе у нас будет приращение на единицу на цифровом выходе.

Теперь нам нужно настроить регистр АЦП исходя из следующих условий:

1. Прежде всего нам нужно включить функцию ADC в ADC.

2. Максимальное входное напряжение для преобразования АЦП составляет + 5 В (5 * (12,2 / 2,2) = 27,7 В; поскольку R1 = 10 кОм и R2 = 2,2 кОм). Таким образом, мы можем установить максимальное значение или ссылку АЦП на 5 В.

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

4. Для любого АЦП частота преобразования (аналоговое значение в цифровое значение) и точность цифрового выхода обратно пропорциональны. Поэтому для большей точности цифрового вывода нам нужно выбрать меньшую частоту. Для меньшей тактовой частоты АЦП мы устанавливаем предварительную продажу АЦП на максимальное значение (128). Поскольку мы используем внутренние часы с частотой 1 МГц, частота АЦП будет (1000000/128).

Это единственные четыре вещи, которые нам нужно знать для , чтобы начать работу с ADC .

Все четыре вышеупомянутые характеристики устанавливаются двумя регистрами:

ADC Multiplexer Selection Register ADMUX

ADC Control and Status Register

КРАСНЫЙ (ADEN): этот бит должен быть установлен для включения функции АЦП ATMEGA.

СИНИЙ (REFS1, REFS0): Эти два бита используются для задания опорного напряжения (или максимальное входное напряжение, мы будем давать). Поскольку мы хотим иметь 5V опорного напряжения, REFS0 должен быть установлен, в таблице.

Voltage Reference Selection

СВЕТЛО-ЗЕЛЕНЫЙ (ADATE): этот бит должен быть установлен для непрерывной работы АЦП (режим автономной работы).

РОЗОВЫЙ (MUX0-MUX4): эти пять битов предназначены для указания входного канала. Поскольку мы собираемся использовать ADC0 или PIN0, нам не нужно устанавливать какие-либо биты, как указано в таблице.

Single Ended input

КОРИЧНЕВЫЙ (ADPS0-ADPS2): эти три бита предназначены для установки предскалярного значения для АЦП. Так как мы используем предскаляр 128, нам нужно установить все три бита.

Division Factor

ТЕМНО-ЗЕЛЕНЫЙ (ADSC): этот бит устанавливается для АЦП, чтобы начать преобразование. Этот бит можно отключить в программе, когда нам нужно остановить преобразование.

Объяснение программирования

Работа этого цифрового вольтметра проекта объясняется шаг за шагом в приведенном ниже коде.

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *