8-900-374-94-44
[email protected]
Slide Image
Меню

Ампервольтметр на 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

sxem.org

ВОЛЬТАМПЕРМЕТР НА МИКРОКОНТРОЛЛЕРЕ В ЛАБОРАТОРНЫЙ БП

ВОЛЬТАМПЕРМЕТР НА МИКРОКОНТРОЛЛЕРЕ В ЛАБОРАТОРНЫЙ БП

      В наш век прогресса у любого радиолюбителя самый главный прибор при наладке устройств это лабораторный блок питания (БП). БП может быть как самодельный, так и заводского исполнения. Отличаются по сложности, может быть собран всего на одном линейном регуляторе напряжения, например LM317T, может быть собран на операционных усилителях, на транзисторах. БП может иметь защиту от КЗ, или наоборот, регулируемое ограничение выходного тока. А более совершенные БП имеют переключение режима «Защита от КЗ/Ограничение выходного тока». Но почти все БП оборудованы в лучшем случае стрелочным вольтметром. Цифровой вольтметр сложен в изготовлении и настройке, и чаще всего требует применения специализированных микросхем АЦП, например, КР572ПВ2А. 

     Но вся сложность заключается не в изготовлении платы, а в необходимости применения двухполярного питания +5 В, -5 В для питания указанной микросхемы. Для этого нужен отдельный маломощный БП или отдельные обмотки трансформатора. Таким образом, данные АЦП не очень зарекомендовали себя в радиолюбительской практике. Что же происходит? На дворе XXI-й век, а дизайна любительских БП не коснулся прогресс? Необходимо исправить эту ситуацию! Задумавшись над этим, я пришел к выводу, что надо сделать собственное устройство индикации параметров БП на микроконтроллере. В связи с этим и была разработан модуль – цифровой вольтамперметр. Который и будет рассмотрен далее более подробно. Данная разработка предложена вам для повторения и возможной доработки, так как она выполнена в пилотном варианте и требует доработок..(Планировалась функция вычисления потребляемой мощности и отображение на индикаторе, но до этого не дошли лапы, а при испытании обнаружены баги при измерении тока.) Но даже в таком варианте данная схема вполне работоспособна и может быть предложена для повторения даже начинающим радиолюбителям. Основной упор делался на то, чтобы сохранить минимальную сложность, чтобы не оставить за бортом начинающих радиолюбителей. Вот что у меня получилось.

     Схема и рисунок печатной платы представлены далее.

     Устройство обеспечивает следующие параметры и функции:

  • 1. Измерение и индикация выходного напряжения блока питания в диапазоне от 0 до 100 В, с дискретностью 0,01 В
  • 2. Измерение и индикация выходного тока нагрузки блока питания в диапазоне от 0 до 10 А с дискретностью 10 мА
  • 3. Погрешность измерения — не хуже ±0,01 В (напряжение) или ±10 мА (ток)
  • 4. Переключение между режимами измерения напряжение/ток осуществляется с помощью кнопки с фиксацией в нажатом положении.
  • 5. Вывод результатов измерения на большой четырехразрядный индикатор. При этом три разряда используются для отображения значения измеряемой величины, а четвертый – для индикации текущего режима измерения.
  • 6. Особенность моего вольтамперметра – автоматический выбор предела измерения. Смысл в том, что напряжения 0-10 В отображаются с точностью 0,01 В, а напряжения 10-100 В с точностью 0,1 В.
  • 7. Реально делитель напряжения рассчитан с запасом, если измеряемое напряжение увеличивается больше 110 В (ну может кому-то надо меньше, можно исправить это в прошивке), на индикаторе отображаются символы перегрузки – O.L (Over Load). Аналогично сделано и с амперметром, при превышении измеряемого тока больше 11 А вольтамперметр переходит в режим индикации перегрузки.

   Вольтметр осуществляет измерение и индикацию только положительных значений тока и напряжения, причем для измерения тока используется шунт в цепи «минуса». Устройство выполнено на микроконтроллере DD1 (МК) ATMega8-16PU.

 Технические параметры ATMEGA8-16PU:

  • Ядро AVR
  • Разрядность 8
  • Тактовая частота, МГц 16
  • Объем ROM-памяти 8K
  • Объем RAM-памяти 1K
  • Внутренний АЦП, кол-во каналов 23
  • Внутренний ЦАП, кол-во каналов 23
  • Таймер 3 канала
  • Напряжение питания, В 4.5…5.5
  • Температурный диапазон, C 40…+85
  • Тип корпуса DIP28

     Количество дополнительных элементов схемы — минимально. (Более полные данные на МК можно узнать из даташита на него). Резисторы на схеме — типа МЛТ-0,125 или импортные аналоги, электролитический конденсатор типа К50-35 или аналогичный, напряжением не менее 6,3 В, емкость его может отличаться в большую сторону. Конденсатор 0,1 мкФ — керамический импортный. Вместо DA1 7805 можно применить любые аналоги. Максимальное напряжение питания устройства определяется максимальным допустимым входным напряжением этой микросхемы. О типе индикаторов сказано далее. При переработке печатной платы возможно применение иных типов компонентов, в том числе SMD.

     Резистор R… импортный керамический, сопротивление 0,1 Ом 5 Вт, возможно применение более мощных резисторов, если габариты печатки позволяют установить. Также нужно изучить схему стабилизации тока БП, возможно там уже есть токоизмерительный резистор на 0,1 Ом в минусовой шине. Можно будет использовать по возможности этот резистор. Для питания устройства может использоваться либо отдельный стабилизированный источник питания +5 В (тогда микросхема стабилизатора питания DA1 не нужна), либо нестабилизированный источник +7…30 В (с обязательным использованием DA1). Потребляемый устройством ток не превышает 80 мА. Следует обращать внимание на то, что стабильность питающего напряжения косвенно влияет на точность измерения тока и напряжения. Индикация — обычная динамическая, в определенный момент времени светится только один разряд, но из-за инерционности нашего зрения мы видим светящимися все четыре индикатора и воспринимаем как нормальное число.

     Использовал один токоограничительный резистор на один индикатор и отказался от необходимости дополнительных транзисторных ключей, т. к. максимальный ток порта МК в данной схеме не превышает допустимые 40 мА. Путем изменения программы можно реализовать возможность использования индикаторов как с общим анодом, так и с общим катодом. Тип индикаторов может быть любым — как отечественным, так и импортным. В моем варианте применены двухразрядные индикаторы VQE-23 зеленого свечения с высотой цифры 12 мм (это древние, мало-яркие индикаторы, найденные в старых запасах). Здесь приведу его технические данные для справки;

  • Индикатор VQE23, 20x25mm, ОК, зеленый
  • Двухразрядный 7-сегментный индикатор.
  • Тип Общий катод
  • Цвет зеленый (565nm)
  • Яркость 460-1560uCd
  • Десятичные точки 2
  • Номинальный ток сегмента 20mA

     Ниже указано расположение выводов и габаритный чертеж индикатора:

 

  • 1. Анод h2
  • 2. Анод G1
  • 3. Анод A1
  • 4. Анод F1
  • 5. Анод B1
  • 6. Анод B2
  • 7. Анод F2
  • 8. Анод A2
  • 9. Анод G2
  • 10. Анод h3
  • 11. Анод C2
  • 12. Анод E2
  • 13. Анод D2
  • 14. Общ катод К2
  • 15. Общ катод К1
  • 16. Анод D1
  • 17. Анод E1
  • 18. Анод C1

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

• Сначала необходимо пропаять перемычки (переходные отверстия), которых много под индикаторами и возле микроконтроллера. 
• Затем микроконтроллер DD1. Для него можно использовать цанговую панельку, при этом ее надо устанавливать не до упора в плату, чтобы можно было пропаять выводы со стороны микросхемы. Т.к. не было под лапой цанговой панельки, было решено впаять МК намертво в плату. Для начинающих не рекомендую, в случае неудачной прошивки 28-ногий МК очень неудобно заменять.
• Затем все прочие элементы.

     Эксплуатация данного модуля вольтамперметра не требует объяснения. Достаточно правильно подключить питание и измерительные цепи. Разомкнутый джемпер или кнопка – измерение напряжения, замкнутый джемпер или кнопка – измерение тока. Прошивку можно залить в контроллер любым доступным для вас способом. Из Fuse-битов, что необходимо сделать, так это включить встроенный генератор 4 МГц. Ничего страшного не случится, если их не прошить, просто МК будет работать на 1 МГц и цифры на индикаторе будут сильно мерцать. 

     А вот и фотография вольтамперметра:

     Я не могу дать конкретных рекомендаций, кроме вышесказанных, о том, как подключить устройство к конкретной схеме блока питания — ведь их такое множество! Надеюсь, эта задача действительно окажется такой легкой, как это я себе представляю.

     P.S. В реальном БП данная схема не проверялась, собрана как макетный образец, в будущем планируется сделать простой регулируемый БП с применением данного вольтамперметра. Буду благодарен тем, кто испытает в работе данный вольтамперметр и укажет на существенные и не очень недостатки. За основу взята схема от ARV Моддинг блока питания с сайта радиокот. Прошивку для микроконтроллера ATmega8 c исходными кодами для CodeVision AVR C Compiler 2.04, и плату в формате ARES Proteus можно скачать на ФОРУМЕ. Также прилагается рабочий проект в ISIS Proteus. Материал предоставил – i8086.

   Схемы блоков питания

elwo.ru

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

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

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

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

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

ra4fjv.org

Простой амперметр на AVR на 3 и 0.3А

Это продолжение статьи об универсальном измерительном приборе на микроконтроллере. В ней речь пойдет о том, как на нашей универсальной плате сделать простой амперметр с пределом либо на 3А, либо на 300мА.

Схема

Схема и плата разработанного прибора универсальна. Для сборки амперметра необходимо установить на плату измерительный шунт и операционный усилитель. При этом схема будет выглядеть так:

Схема амперметра на AVR

… и печатная плата

Печатная плата амперметра

Проект платы в формате Sprint-Layout 5.0 можно скачать по ссылке.

Амперметр на 3А

Для сборки версии с пределом измерения от 0 до 3А вам потребуется установить на плату:

  1. C2 — танталовый конденсатор, 22мкФ, 16В T491C226K016AT, 1шт.
  2. C1,C3,C4 — конденсаторы на 0,1мкФ в корпусе 0805, 3шт.
  3. DA1 — стабилизатор L7805 в корпусе D2PAK, 1шт.
  4. DA2 — операционный усилитель L358N в корпусе SO8, 1шт.
  5. DD1 — микроконтроллер Atmega8a-au, 1шт.
  6. J1 — чип-резистор 1206 с сопротивлением 0 Ом, 1шт. (перемычка)
  7. HL1 — сегментный индикатор BA56-12YWA, 1шт. (желательно устанавливать через колодку)
  8. R1 — резистор с сопротивлением 0,1 Ом мощностью 1Вт, 1шт.
  9. R4 — чип-резистор 0805 на 1кОм, 1шт.
  10. R5 — подстроечный резистор CA6V на 25кОм, 1шт
  11. R6-R8, R12 — чип-резисторы 0805 на 1кОм, 4шт.
  12. R9-R11 — чип-резисторы 0805 на 56Ом, 3шт. (можно взять с меньшим сопротивлением для увеличения яркости)
  13. VT1-VT3 — транзисторы BC807-40, 3шт.
  14. Гребенка PLS-контактов

При токе через шунт R1 3А, падение напряжения на нем составит 0,3В. Резисторами R4, R5 задается коэффициент усиления этого сигнала по напряжению примерно в 10 раз. Усиленное напряжение поступает на АЦП микроконтроллера. На шунте при этом будет выделяться мощность 0,9Вт, что близко к максимально допустимой мощности. Если вы планируете часто его использовать на пределе измерения, то поставьте резистор R1 с большей мощностью.
Собранный амперметр выглядит следующим образом:

Амперметр на МК с лицевой стороны

Амперметр на МК с обратной стороны

Прошивку амперметра можно скачать здесь. Фьюз-биты без изменения.
На видео подробно показан процесс работы амперметра. К сожалению, у нас не было источника тока на 3А, поэтому нельзя было показать, что при токе больше 3А вольтметр выводит сообщение о переполнении.

Амперметр на 300мА

Отличие амперметра на 300мА от предыдущей версии исключительно в том, что необходимо поставить шунтирующее сопротивление R1 на 1Ом-1Вт и загрузить в память микроконтроллера другую прошивку.

Предосторожности

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

UPD:

Для того чтобы сделать версию на 50А необходимо установить элементы как в 3х-амперной версии, кроме резистора R1. Его сопротивление нужно уменьшить до 0,01Ом. Прошивку можно скачать здесь.

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

www.customelectronics.ru

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

Ваш адрес email не будет опубликован.