Форум
Приветствую Вас, Гость · RSS Пятница, 19.04.2024, 06:57

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 26
  • 1
  • 2
  • 3
  • 25
  • 26
  • »
Форум » Форум по статьям сайта » Все темы » Универсальная схема для построения измерительных устройств (Применение, практика...)
Универсальная схема для построения измерительных устройств
Модератор форумаДата: Суббота, 30.07.2011, 19:37 | Сообщение # 1





Статья Универсальная схема для построения измерительных устройств

Если в таблице прошивок нет нужной прошивки пишите здесь.
Желательно в таком формате.
Пример:
5-0V_100 на вход РС5 поступает от 5 до 0V, отображение значения на LED индикаторе от 0 до 100
0-5V_9'99 на вход РС4 поступает от 0 до 5V, отображение значения на LED индикаторе от 0 до 999

знак ' означает гашение первого незначащего нуля.

Тема с исходниками для работы этого измерителя http://c2.at.ua/forum/2-53-1
 
VladaudiДата: Четверг, 04.08.2011, 07:10 | Сообщение # 2
Группа: Front-rank users
Сообщений: 7
Здравствуйте. Всё вроде правильно сделал и монтаж и прошивается отлично МК Atmega 8A, и 4MHz Fuses выставлял и 8 MHz но так и не запустилась схема, индикаторы c OA не светяться вообще почему-то, буду искать в чём дело. В протеусе всё работает отлично. Только вот не понял с EEPROMом он как был FF так и после прошивки FF, так и должно быть? Ещё я не подключал датики, но я не думаю что из-за этого может не запуститься микроконтроллер. А прошиваю на программаторе Chip Prog-2. Я хотел сделать управление компрессором автомобильным для накачки ресивера для воздушного сигнала, а датчики использовал - давления MM393с и - токовый, для измерения тока потребления компрессором и в случае перегрузки "микроконтроллер" отключить его, но думаю что с защитой по току может не получиться, так как при превышении тока, схема отключит компрессор, но следом же и включит сразу же его, вообщем надо будет подумать как программно сделать отключение компрессора, до устранения неисправности, и при последующем подачи питания на всё устройство, чтобы снималась блокировка на токовом канале. Фотографии печатки и схему выложу позже, как найду неисправность и запущу устройство, думаю что на этой неделе с вашей помощью сделаю.:-)

Сообщение отредактировал Vladaudi - Четверг, 04.08.2011, 07:14
 
RSSДата: Четверг, 04.08.2011, 20:11 | Сообщение # 3
Omakaitse
Группа: Пользователи
Quote (Vladaudi)
Только вот не понял с EEPROMом он как был FF так и после прошивки FF, так и должно быть

После первого включения в EEPROM МК прописывает свои константы, (по крайней мере три первые строки еер. изменяются).
А раз у тебя нет изменений значит на контроллер не подалось питание ноги 8,22 общий, 7,20 +5 вольт , (печатка то какая в дип?)
Quote (Vladaudi)
Фотографии печатки и схему выложу позже, как найду неисправность и запущу устройство, думаю что на этой неделе с вашей помощью сделаю.:-)
Тексь это и есть предмет разбирательства , когда заработает там уже и расматривать особо будет нечего biggrin
 
VladaudiДата: Четверг, 04.08.2011, 20:50 | Сообщение # 4
Группа: Front-rank users
Сообщений: 7
В том то и дело что питание приходит на ножки 8,22 общий, 7,20 +5 вольт, и индикатор исправен с ОА, проверял включение сигментов без МК, перемычками в сокете. Плата изготовлена фотоспособом, смотрел уже под микроскопом все дорожки отличные. Схему и печатку с МК в Dip корпусе, переделал под себя, с транзисторными ключами и релюшками. Сегодня купил третий МК, может бракованные попались, стоит МК Atmega8a у нас в Рязани - 120 руб, завтра попробую прошить, посмотрим что получиться. А ещё я в место дроселя 10 Mкг установил перемычку, на время испытания, но вроде бы не должно повлиять на включение устройства.

Добавлено (04.08.2011, 22:50)
---------------------------------------------
Вышлите пожалуйста прошивку для моей схемы, регулятора давления (1 канал) и измерителя тока потребления компрессором и отключение его по превышению им потребляемого тока (2 канал) при заклинивании компрессора например, желательно чтобы при превышении установленного тока, компрессор больше не включался, до того пока не выключишь и заново не включишь питание устройства, так как всё равно компрессор может работать только при включенном зажигании на автомобиле. А прошивка думаю нужна будет вот такая:
5-0V_100 на вход РС5 поступает от 5 до 0V, отображение значения на LED индикаторе от 0 до 100
0-5V_9'99 на вход РС4 поступает от 0 до 5V, отображение значения на LED индикаторе от 0 до 999
Заранее спасибо. smile

 
RSSДата: Четверг, 04.08.2011, 21:17 | Сообщение # 5
Omakaitse
Группа: Пользователи
Запускай по базовой схеме всё будет работать smile
Прикрепления: 5-0V_100_0-5V_9.zip (4.8 Kb)
 
VladaudiДата: Понедельник, 08.08.2011, 13:10 | Сообщение # 6
Группа: Front-rank users
Сообщений: 7
Спасибо за поддержку, в понедельник буду пробовать снова. Честно говоря я не знаю что ещё может быть, остаётся только думать или на программатор или на какой-то брак МК, хотя всё прошивается и читается потом. Пробовал фъюзы инвертировать, у меня где галочка "0", всё равно не работало устройство. :-(

Добавлено (08.08.2011, 15:10)
---------------------------------------------
Ну можете меня поздравить, всё схема ожила, а было всё как всегда просто, в программаторе ChipProg-2 надо было при программировании в закладке - опции убрать галочку - реверсировать порядок байт. И всё сразу ожило и на 4 Mhz и на 8 Mhz. Теперь подключу всё как я задумывал, то есть ключи транзисторные с релюшками, и входные цепи. Завтра напишу как всё в сборе работать будет. Вообщем рад теперь до уср...:-)

 
RSSДата: Вторник, 09.08.2011, 00:17 | Сообщение # 7
Omakaitse
Группа: Пользователи
Я здесь еще опробовал эту схемку в качестве показометра сетевого напряжения, результат мне очень понравился, ЛАТРом проверил в диапазоне от ~ 185 до 265V. Снял видео , видно где видно что эта универсальная схема производит замер напряжения так же как и мультиметр, Вообще так запрото можно сделать, но есть и недостаток скорость реакции (обусловлено моим схематическим решением см. схему)

А по точности измерения и линейности соответствует моему мультиметру .....
 
VladaudiДата: Вторник, 09.08.2011, 10:24 | Сообщение # 8
Группа: Front-rank users
Сообщений: 7
Практически закончил сборку и наладку устройства, вот внешний вид печатной платы вид со стороны деталей.

Схема предназначена для измерения давления в рессивере 1-канал и тока потребления компрессором 2-канал и соответственно включения и выключения при превышения пределов измерения. Всё это устройство делал для воздушного сигнала в моём авто Nissan Almera N16, давление поддерживается от 6-7 атм. Спасибо автору за отличную схему и прошивку. Будем дальше усовершенствовать схему.:-)
С/у Влад vladaudi@mail.ru

Добавлено (09.08.2011, 12:24)
---------------------------------------------
Принципиальную схему выложу на днях.

Прикрепления: 9275385.jpg (155.2 Kb) · 1420370.rar (81.5 Kb)


Сообщение отредактировал Vladaudi - Вторник, 09.08.2011, 10:22
 
VladaudiДата: Четверг, 18.08.2011, 08:05 | Сообщение # 9
Группа: Front-rank users
Сообщений: 7
Coviraylhik, а подскажите сложно будет в прошивке инвертировать выхода вых1 и вых2, я просто не любитель собирать на рассыпухе что-либо:-), раньше любил так, как выхода не было, а сейчас стремлюсь всё в процессор затолкнуть. Так как у меня при подачи питания на схему, включается компрессор, потому что оба реле нормально замкнуты и соответственно пока МК считает информацию с датчика давления и тока, проходит 0,5 секунды примерно за это время успевает компрессор включиться, и если давление набрано то естественно реле отключит компрессор, но это будет через 0,5 сек. То есть происходит кратковременное включение компрессора, при подачи питания, даже когда давление в норме. А так как у меня сделано что при отключении зажигания, всё отключается для безопасности, то и соответсвенно при включении зажигания происходит вот такое полусекундное включение компрессора (хотя всё в норме), вот я и решил сделать инверсию выходов и использовать нормально разомкнутые контакты. А потом хочу выбросить реле и перейти на полевые ключи, (не люблю контакты :-)). Заранее спасибо огромное.
Прикрепления: ____.rar (17.5 Kb)


Сообщение отредактировал Vladaudi - Четверг, 18.08.2011, 08:17
 
RSSДата: Четверг, 18.08.2011, 14:34 | Сообщение # 10
Omakaitse
Группа: Пользователи
Конечно же устройство должно начинать работу с нормально разомкнутых контактов.
Quote (Vladaudi)
в прошивке инвертировать выхода вых1 и вых2,

Про инвертировать выхода может сам пользователь через меню с помощью кнопок задав значения уставок ton-t-toff , или ton-t-toff.
Почитайте в статье с абзаца -
Code
Режимы уставок ton<t<toff , или ton>t>toff:

.
 
MACTEPokДата: Четверг, 18.08.2011, 15:41 | Сообщение # 11
Группа: Управляет МК
Сообщений: 351
Можно пощупать исходник? Могу добавить полное отключение после сработки. smile
 
RSSДата: Пятница, 19.08.2011, 21:49 | Сообщение # 12
Omakaitse
Группа: Пользователи
Да нет нужно не полное отключение, как я понимаю, на второй канал требуется выход с таймера , если Vladaudi поточнее опишет, что он хотел бы получить то возможно тогда и реализовать можно в программе.
Code

'* Filename : Универсальный 2х-канальный индикатор *
'* Revision : 5.0 *
'* 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 , 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 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 &H14 'переменная 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 , 26
If Vibor = 0 Then ' Удерживая кнопку УСТ, подаем питание.
For X = 1 To 200
If X = 150 Then ' При длительном нажатии
Set Booton_flag
Toggle Indicator.3 ' Переключаем младший (четвертый) бит переменной. Номер бита выбрал произвольно
Writeeeprom Indicator , 26
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 = 30 'присваиваем начальный уставки
On1 = 20
Off2 = 60
On2 = 50
Indicator = &B00000000 ' для ОА. Indicator = &B00001000 для ОК
Razryad_1 = &B10111011
Razryad_2 = &B10111011
Writeeeprom On1 , 0 ' Записываем в EEPROM уставку ON1
Writeeeprom Off1 , 5 ' Записываем в EEPROM уставку OFF1
Writeeeprom On2 , 10 ' Записываем в EEPROM уставку ON2
Writeeeprom Off2 , 14 ' Записываем в EEPROM уставку OFF2
Writeeeprom Razryad_1 , 16
Writeeeprom Razryad_2 , 17
Writeeeprom Indicator , 26
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 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 ' начало преобразования

Do
If X > 40 Then ' увеличили период опроса АЦП, чтобы значения не прыгали ======
Stop Timer0 : Stop Timer1 ' на время преобразования останавливаем таймеры
Channel_1 = Getadc(5) ' Вольтметр 'опрос АЦП (диапазон от 0 до 1023) (1 канал)
Channel_1 = 1023 - Channel_1 'инвертирование раскомментировать===========
Channel_1 = Channel_1 / 10 'пересчет тут любая формула для требуемого диапазона или необходимой характеристики ==============
If Channel_1 > 100 Then Channel_1 = 100 'верхний предел показаний
Channel_2 = Getadc(4)
' Channel_1 = 1023 - Channel_2 ' Датчик уровня 'опрос АЦП (2 канал)
' Channel_2 = Channel_2 / 2.046 'пересчет тут любая формула для требуемого диапазона или необходимой характеристики ==============
If Channel_2 > 999 Then Channel_2 = 999 'верхний предел показаний
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 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го канала
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го канала
_print_sec = On2 ' 2й индикатор показывает значение уставки ON2
Case 4 :
_print = Channel_1 ' 1й индикатор показывает значение АЦП 1го канала
_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 = Off2 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

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

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 = Off2 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
Case 4 :
Readeeprom Off2 , 14
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 < 100 Then Incr On1 '
Case 2 : '
If Off1 < 100 Then Incr Off1
Case 3 : '
If On2 < 999 Then Incr On2 '
Case 4 : '
If Off2 < 999 Then Incr Off2
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
Case 4 :
If Off2 > 0 Then Decr Off2
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
[/code]

-*******************************************************
 
VladaudiДата: Суббота, 20.08.2011, 07:25 | Сообщение # 13
Группа: Front-rank users
Сообщений: 7
Coviraylhik и MACTEPok - вот что я хотел бы сделать я уже писал ранее, таймер думаю на токовом канале не поможет, так как он включит опять через установленное время компрессор, а если компрессор заклинит или по каким-то причинам превысится ток потребления, то желательно отключить реле на токовом канале, до того пока сам пользователь не разберётся и не снимет флаг ошибки, например нажатием на какую-нибудь из кнопок, и так же чтобы отключением питания тоже не сбрасывалась эта авария, а только кнопкой ну или комбинацией кнопок.
А вот что я ещё заметил - что надо бы сделать защиту от отключения(обрыва) - датчика давления, так как при обрыве датчика или проводов идущих к нему, компрессор будет качать до посинения. Например если сопротивление превысило в измеряемой цепи, допустим если датчик стал от 500 Ом до бесконечности, то не включать этот канал вообще, до устранения сбоя, ну вообщем как и с каналом по току, описанного выше.:-)

Quote (Vladaudi)
Добавлено (16.08.2011, 16:42)
---------------------------------------------
Я обращаюсь к автору прошивки, вы бы не могли немного подкоректировать программу для моего устройства, я описывал его выше, вообщем - так, как при достижении установленного тока, при котором компрессор должен отключиться аварийно (например 20 ампер), он то отключается, но следом же потребление становиться равным нулю и компрессор снова пытается включиться соответственно и начинается колебательный процесс на этом токовом канале, я бы хотел чтобы второй канал, после превышения верхнего предела отключился до нажатия на любую кнопку. Заранее огромное спасибо, С/у Никитенко Влад.
Прикрепления: __.rar(17Kb)


Заранее спасибо всем, буду ждать от вас решений. Вот так и рождаются неплохие устройства.:-)
Прикрепления: 9169149.rar (16.9 Kb)


Сообщение отредактировал Vladaudi - Суббота, 20.08.2011, 07:56
 
MACTEPokДата: Понедельник, 22.08.2011, 07:09 | Сообщение # 14
Группа: Управляет МК
Сообщений: 351
Так, чтобы уточнить: обрыв датчика первого канала(датчик давления) - на входе ОУ будет полные +5В, на табло показания 0?
обрыв датчика второго канала(датчик тока) - на входе ОУ будет полные +5В, на табло показания 999?

Тогда сделаю блокировки по максимальному и минимальному значению.

Напишите ваши уставки на оба канала.
Проблему с кратковременным включением компрессора устранили?


Сообщение отредактировал MACTEPok - Понедельник, 22.08.2011, 07:30
 
VladaudiДата: Вторник, 23.08.2011, 17:26 | Сообщение # 15
Группа: Front-rank users
Сообщений: 7
Да всё правильно, только я пока приостановил испытания, так как уехал в командировку в Кириши, буду до 30-го августа, продолжим.:-) Уставки на давление мин 6,5 максимальное 7 атм. И по токовому каналу мин - 0 Ампер, максимальное 25 Ампер.

Добавлено (23.08.2011, 19:26)
---------------------------------------------
С током как-то более или менее понятно, превысил например 25Ампер, отключить до нажатия клавиши или комбинации клавишь и тогда только рзблокируешь устройство, а вот с давлением сложне наверное надо сделать так, как будет сопротивление на входе ОУ станет 500 Ом, то тогда тоже заблокировть до следующего нажатия любой клавиши. Так как сопротивление датчика 0 Ом это 10 атм, а 370 Ом это 0 атмасфер, ну отсюда можно с запасом взять например 500 Ом для контроля. Хотя думаю что так не получиться, ведь и 500 Ом на входе прибор будет на индикаторе показывать тоже "0" как и всё что выше 370 Ом и выше.:-(


Сообщение отредактировал Vladaudi - Вторник, 23.08.2011, 17:33
 
MACTEPokДата: Среда, 24.08.2011, 08:23 | Сообщение # 16
Группа: Управляет МК
Сообщений: 351
Первый канал (по давлению):
Регулировка по давлению, вкл/выкл по уставкам On1 и Of1.
При давлении ниже 0,5атм - авария обрыва датчика.
При первом включении может косяк быть. когда в системе нулевое давление (мало ли, не знаю как на самом деле). Сброс аварии обоих каналов - в основном режиме нажатие кнопки +(вверх) или -(вниз).

Второй канал(по току):
Защита по току, включение реле(разрыв цепи питания компрессора) при достижении уставки On2. Уставка Of2 в управлении теперь не учавствует.
При обрыве датчика(шунта) показания: 999, на входе операционника +5В - авария обрыва датчика. Сброс аварии обоих каналов - в основном режиме нажатие кнопки +(вверх) или -(вниз).
При сбросе ошибки - каналы нагрузки принудительно приводятся в нулевое состояние (реле выключены, их контакты замкнуты) все время, пока удерживаются кнопки + или - в основном режиме.
Прикрепления: 3119527.hex (15.6 Kb)
 
hfelyxДата: Среда, 02.11.2011, 23:33 | Сообщение # 17
Группа: Пользователи
Сообщений: 2
Привет всем радиолюбителям!
Сразу извинюсь,если полез не в ту тему!
Собираюсь сделать "Вольтамперметр МК Atmega8 с автоматическим выбором измеряемого диапазона силы тока"для зарядного устройства,и возникла пара вопросов:
1:Какой мощности должен быть шунт и можно ли применить шунт 0,005 Ом(есть под рукой 2 шт)или лучше соединить последовательно?
2:Важен ли номинал подстроечных резисторов и можно ли взять "больше"сопротивление?
3:Будет ли "работать" амперметр в двух направлениях,в смысле,отображать ток заряда-разряда батареи? wacko
4:Зачем здесь кнопки "+", "-" и "выбор"?Что ими делать?
Заранее признателен!!!


Сообщение отредактировал hfelyx - Четверг, 03.11.2011, 00:20
 
RSSДата: Четверг, 03.11.2011, 13:41 | Сообщение # 18
Omakaitse
Группа: Пользователи
Могу сказать так, когда уже сделаеш несколько подобных схем и из наработаной практики будет понятно, что все эти вопросы решаемы.
Quote (hfelyx)
1:Какой мощности должен быть шунт и можно ли применить шунт 0,005 Ом(есть под рукой 2 шт)или лучше соединить последовательно?

Можно, два последовательных тогда и номиналы резисторов в схеме обязки ОУ останутся без изменений, а можно и один шунт 0,005 Ом тогда номиналы резисторов в схеме обязки ОУ надо будет подкорректировать. В какую сторону ? придется самому определится.
Quote (hfelyx)
2:Важен ли номинал подстроечных резисторов и можно ли взять "больше"сопротивление?

Замена всегда возможна , но только что значит "больше", например если стоит 5 ком и поставить 6.8 ком это вроде как можно , а если 100к то скорее всего ничё хорошего.
Quote (hfelyx)
3:Будет ли "работать" амперметр в двух направлениях,в смысле,отображать ток заряда-разряда батареи?

Именно данный вариант нет, мной проверена схема в такой вот реализации otricatelnye_pokazanija_na_universalnoj_skheme.
Но повторивших ее пока нет , а растолковать на пальцах как ее сделать извини не возможности.

Quote (hfelyx)
4:Зачем здесь кнопки "+", "-" и "выбор"?Что ими делать?

Кнопки управления: установка порога защиты, гистерезис, возможность управления самому точками разрядности на индикаторах.
Quote

УПРАВЛЕНИЕ:
В основном режиме осуществляется индикация показаний датчиков на соответствующем индикаторе.
Нажатием кнопки "Выбор” происходит выбор уставок порога срабатывания каждого канала нагрузки.
Кнопками "+” и "-” изменение значения уставок. Каждый пункт меню поясняется подсказкой (On1, Of1, On2, Of2).
Для удобства настройки на каждом индикаторе отображаются уставка только своего канала, причем, второй индикатор продолжает показывать измеряемую величину.

Пдробнее здесь skhema_dlja_postroenija_izmeritelnykh_ustrojstv_mk_atmega8_led_2kh3
Схема очень универсальна поэтому без доп. кнопок не обошлось.
 
ВступающийДата: Вторник, 06.12.2011, 08:09 | Сообщение # 19
Группа: Front-rank users
Сообщений: 3
Доброго времени суток!У меня возник вопрос к разработчику данного девайса.К сожалению,в таблице под схемой я не нашёл необходимой прошивки.Можно скомпоновать два параметра;давление-уровень?Буду очень благодарен за помощь!! Режимы-давление 5-0V 0..10, уровень 5-0V 0..40.С датчиками проблем не будет,схема позволяет подогнать практически любой.А вот с прошивой беда.HELP!!!!!!!
 
RSSДата: Вторник, 06.12.2011, 11:27 | Сообщение # 20
Omakaitse
Группа: Пользователи
Не понял , нужна давление 5-0V 0..10, уровень 5-0V 0..40.С
в моем изложении это видится так
5-0V_10
5-0V_40
Такой конечно пока нет.....
Но для этой цели подойдет прошивка

5-0V_100
5-0V_100
 
ВступающийДата: Вторник, 06.12.2011, 17:25 | Сообщение # 21
Группа: Front-rank users
Сообщений: 3
Абсолютно согласен!Для первого канала показания до 100 приемлимы,а вот для второго...Просто при объёме 40л. показания до 100 будут вносить некоторую сумятицу.Постоянно держать под рукой калькулятор...А установка предполагается на автомобиль.
 
RSSДата: Вторник, 06.12.2011, 18:02 | Сообщение # 22
Omakaitse
Группа: Пользователи
Абсолютно несогласен biggrin
Если делать датчик по схеме с операционным усилителем проблем нет, подстроечным сопротивлением на выходе с ОУ настраиваете мас. выходное напряжение примерно 2 вольта и при полном баке уже никогда не будет показаний более 40 литров...
Или если на работающей схеме , можно и практически настроить.
При полном баке настраиваете показания 40 литров, и все дальше показания будут идти соответственно на уменьшение, и никакой сумятицы тут не будет.
 
ВступающийДата: Среда, 07.12.2011, 06:39 | Сообщение # 23
Группа: Front-rank users
Сообщений: 3
Спасибо за подсказку!Об этом я не подумал!Сегодня(если работа не загрузит)попробую собрать.Только плату придётся "перепахать" под DIP операционник и другие входные цепи.А то готового проекта не нашёл.Ещё раз спасибо за помощь!!
 
RSSДата: Среда, 07.12.2011, 09:12 | Сообщение # 24
Omakaitse
Группа: Пользователи
Quote (Вступающий)
Только плату придётся "перепахать" под DIP операционник и другие входные цепи


shok shok Если заработает ...... поможем с прошивкой под твои параметры (естественно вариант с уже имеющейся в статье прошивкой 5-0V_100 также полностью будет работоспособен)
 
SoftFelixДата: Воскресенье, 11.12.2011, 09:56 | Сообщение # 25
Группа: Front-rank users
Сообщений: 14
У меня вопрос-просьба, скорее всего, к MACTEPok. Я повторил эту схему для измерения давления масла в ДВС с датчиком ММ393А. Подробности можно посмотреть тут. Т.к. требовалось всего два разряда и один канал, то схема значительно упростилась.


+Исходник был исправлен для линейной шкалы 0...8 кг/см2 по рекомендации отсюда.

Но, как выяснилось, датчик ММ393А меняет своё сопротивление не линейно в зависимости от давления. Комрад syava-gor1 с Priorovod.ru снял реальные показания сопротивления при разном давлении. Вот что получилось:

Тут мои рассуждения.


Собственно вопрос-просьба: можно ли скорректировать прошивку для одного канала устройства с учётом этой нелинейности ММ393А?
 
MACTEPokДата: Воскресенье, 11.12.2011, 20:13 | Сообщение # 26
Группа: Управляет МК
Сообщений: 351
Dim Light As Integer , Any_var as Integer
Const Negativ = -1

Light = Getadc(5) '
Light = 1023 - Light
Light = Light / 10.23 '
Any_var = Light / 2000 ' 2000 - можно задавать изгиб линии
Any_var = Negativ * Any_var
Light = Exp(any_var)
If Light > 100 Then Light = 100

Как вариант программной корректировки, внесение експоненты.
На практике не пробовал, но, думаю надо в этом направлении двигаться
Прикрепления: 9955260.xls (19.0 Kb)
 
MACTEPokДата: Вторник, 13.12.2011, 13:32 | Сообщение # 27
Группа: Управляет МК
Сообщений: 351
Пока это. Упрощать уже сегодня не успею.
Прикрепления: SoftFelix.rar (44.4 Kb)
 
sergey_dptДата: Воскресенье, 18.12.2011, 11:31 | Сообщение # 28
Группа: Front-rank users
Сообщений: 2
собрал ампервольтметр (без автоматического изменения диапазона измерения тока http://c2.at.ua/3m/S_V_A/s_VA_ak.gif ) с защитой по току и получил мигалку (лампа вместо нагрузки) т.е. схема при превышении заданного порога по току отключает через реле нагрузку ток пропадает, реле опять включает, опять отключает и т.д. можно переделать прошивку чтобы при превышении заданного порога по току схема отключала нагрузку и не включала больше пока не передернут питание вот както так.
ЗЫ: в канале амперметра постоянно меняются показания при неизменной нагрузке скачет последняя цифра может както усреднить показания.
ЗЫЫ: ну и заодно канал вольтметра тоже переделать чтобы после превышения установленного порога отключался и больше не включался (ну это если защиту от перенапряжения делать)
 
MACTEPokДата: Пятница, 23.12.2011, 08:30 | Сообщение # 29
Группа: Управляет МК
Сообщений: 351
Пробуйте этот вариант, должно все корректно работать. в протеусе погонял.
Прикрепления: 0177892.rar (48.2 Kb)


Сообщение отредактировал MACTEPok - Пятница, 23.12.2011, 08:31
 
sergey_dptДата: Пятница, 23.12.2011, 08:48 | Сообщение # 30
Группа: Front-rank users
Сообщений: 2
Все правильно, точка переключается, все работает.
Еще раз благодарю, за проделанную работу.
 
MACTEPokДата: Пятница, 23.12.2011, 09:18 | Сообщение # 31
Группа: Управляет МК
Сообщений: 351
ok
 
SoftFelixДата: Пятница, 23.12.2011, 09:20 | Сообщение # 32
Группа: Front-rank users
Сообщений: 14
Quote (MACTEPok)
Да, тут все просто

А меня ещё вопрос образовался. По-поводу Вашей прошивки отсюда: тыц..
Я почему уточняю - блок для перепрошивки тяжко выковыривать для перепрошивки, а азы программирования в БАСКОМе я только-только постигаю по Вашим исходникам. Хотелось бы сразу получить максимально рабочую прошивку и потом уже вытаскивать блок из машины для перепрошивки.

Ещё раз вводные. Датчик давления подключен к ADC5 (28 нога), имеются только две цифры Инд.№1 (!), которые подключены к dig2 и dig3. Индикатор с общим катодом (ОК). Точку (h) всегда программирую кнопками между dig2 и dig3.

1. Вот тут я меняю местами Getadc(4) b Getadc(5) - это понятно. Сделал:

Code
If X > 40 Then                    ' увеличили период опроса АЦП, чтобы значения не прыгали ======
        Stop Timer0 : Stop Timer1                             ' на время преобразования останавливаем таймеры
        Light = Getadc(4)                    'опрос АЦП (диапазон от 0 до 1023) (1 канал)
        Light = 1023 - Light                    'инвертирование раскоментировать===========
        Light = Light / 10.23                    'пересчет тут любая формула для требуемого диапазона или необходимой характеристики ==============
        If Light > 100 Then Light = 100                       'верхний предел показаний (если Light > 100, то присваиваем Light = 100) =
        Pressure = Getadc(5)                    'опрос датчика давления (2 канал)
        Any_var = Pressure / 2000                             ' Здесь можно менять величину кривизны экспоненты
'      Any_var = Negativ * Any_var                          ' Если расскоментировать, изменим направление изгиба экспоненты
        Any_var = Exp(any_var)
        Pressure = 1023 - Pressure
        Pressure = Pressure / 12.7875                         '  80 = 1023/12,7875
        Any_var = Pressure * Any_var


Но теперь же давление будет показываться на dig4, dig5 и dig6? А они у меня не подключены. Или я ошибаюсь? Это самый главный вопрос.

2. Хочу сделать при первом (холодном) включении, когда NVRAM чистая, чтобы сразу выбирался индикатор с ОК. Вот в этом участке кода нужно изменить Indicator = &B00000000 на Indicator = &B00001000? Правильно?

Code

If Default = 255 Then                    'при первом запуске, когда Default=255
    Light_off = 60                    'присваиваем начальный уставки
    Light_on = 40
    Pressure_off = 70
    Pressure_on = 50
    Indicator = &B00000000                    ' для ОА. Indicator = &B00001000 для ОК
    Razryad_1 = &B11101110
    Razryad_2 = &B11101110
    Writeeeprom Light_on , 0                    ' Записываем в EEPROM уставку ON1
    Writeeeprom Light_off , 5                    ' Записываем в EEPROM уставку OFF1
    Writeeeprom Pressure_on , 10                             ' Записываем в EEPROM уставку ON2
    Writeeeprom Pressure_off , 14                            ' Записываем в EEPROM уставку OFF2
    Writeeeprom Razryad_1 , 16
    Writeeeprom Razryad_2 , 17
    Writeeeprom Indicator , 26
    Default = 100                    ' присваиваем значение 100(произвольное, отличное от 255) и больше этот кусок кода выполняться не будет
End If


А где заранее прописать точку между dig2 и dig3?
 
MACTEPokДата: Пятница, 23.12.2011, 10:33 | Сообщение # 33
Группа: Управляет МК
Сообщений: 351
Indicator = &B00001000 - любое отличное от нуля значение переключает на ОК
Razryad_1 = &B10111011 - положение точки для первого индикатора (dig1,dig2,dig3,пусто,dig1,dig2,dig3,пусто) - точка установлена во втором индикаторе dig2
Razryad_2 = &B10111011 - положение точки для второго индикатора (аналогично)

ЧТобы сильно не заморачиваться, сейчас оба индикатора выводят одинаковые показания с ADC5.
Однако. меню я не менял, поэтому, нажимая кнопку УСТ (Ввод), будут по кругу переключаться по прежнему 4 уставки (2 последние должны показываться на втором индикаторе). То же самое касается второго канала нагрузки. Он будет срабатывать по уставкам On2 и Off2.

Если конечно нужно, то можно поковыряться и сделать все похорошему
Прикрепления: 9691476.rar (45.1 Kb)


Сообщение отредактировал MACTEPok - Пятница, 23.12.2011, 10:34
 
SoftFelixДата: Пятница, 23.12.2011, 10:55 | Сообщение # 34
Группа: Front-rank users
Сообщений: 14
Quote (MACTEPok)
Если конечно нужно, то можно поковыряться и сделать все похорошему

Был бы очень благодарен! Уж лучше красивый и полностью функциональный код. ADC5 меряет давление с коррекцией и шкалой 0...8 (dig2, dig3; OK и точка в dig2 при чистой NVRAM), а второй канал (ADC4), как и прежде - температуру.

А новый исходник я сейчас просмотрю для самообучения.
 
MACTEPokДата: Пятница, 23.12.2011, 11:58 | Сообщение # 35
Группа: Управляет МК
Сообщений: 351
первый канал на давление (0..85)
второй канал на температуру (0..999)
Точки установлены во вторых разрядах. Кнопки функционируют.
Прикрепления: 3617846.rar (49.5 Kb)
 
MACTEPokДата: Пятница, 23.12.2011, 12:09 | Сообщение # 36
Группа: Управляет МК
Сообщений: 351
SoftFelix, ok
Единственно по коэффициенту корректировки (кривизну линии). Я его поставил наугад. Тут поверять только в реальных условиях, глядя на стрелочный прибор, с ним сравнивать. Далее методом подбора менять в коде значения коэффициента
Code
Any_var = Channel_1 / 2000
 
SoftFelixДата: Пятница, 23.12.2011, 12:34 | Сообщение # 37
Группа: Front-rank users
Сообщений: 14
Quote (MACTEPok)
динственно по коэффициенту корректировки (кривизну линии). Я его поставил наугад.

Так, вроде, был же график в екселе, где при 2000 всё очень хорошо получалось? Т.е. максимальная близость к реальным показаниям.
Quote (MACTEPok)
Тут поверять только в реальных условиях, глядя на стрелочный прибор, с ним сравнивать.

К сожалению, это вряд ли получится. ММ393А уже давно живёт в машине, а собрать тестовую конструкцию с тройником и механическим манометром у меня не получится. По этому, исключительно доверяю только этой информации:



Any_var = Channel_1 / 2000 вроде с этим было довольно точно.
 
MACTEPokДата: Пятница, 23.12.2011, 12:45 | Сообщение # 38
Группа: Управляет МК
Сообщений: 351
SoftFelix, тогда, взяв обычный переменный резистор и собрав на нем схему, выставляя на резисторе вот эти сопротивления, смотреть, что будет показывать устройство.
Может, конечно, это можно в протеусе сделать, только я не знаю, как наблюдать изменения именно сопротивления?
 
SoftFelixДата: Пятница, 23.12.2011, 13:52 | Сообщение # 39
Группа: Front-rank users
Сообщений: 14
Так, перешил. Что-то не очень получилось.

Ноль выставлял так: на подстроичнике выставил 309 ом и потенциометром платы выставил 0.0

должно_быть линейная_прошивка коррекция
309 0 0 0
283 0.5 0.5 0.9
251 1.0 1.2 2.0
218 1.5 2.1 3.0
185 2.0 2.8 4.1
145 3.0 3.9 5.2
119 4.0 4.7 5.9
102 4.5 5.2 6.4
88 5.0 5.6 6.7

Вот так... sad
 
MACTEPokДата: Пятница, 23.12.2011, 13:58 | Сообщение # 40
Группа: Управляет МК
Сообщений: 351
Сейчас тоже тестил в протеусе. Оказывается, у нас изгиб кривой не в ту сторону (сейчас выпуклая, а надо вогнутую)
Code
      Any_var = Negativ * Any_var

эту строку раскомментил

Также надо подстраивать резистор, который датчик на плюс подтягивает.
На http://c2.at.ua/load....-1-0-74 1к который, в протеусе я брал на 10к.
В результате в проекте показания отличались всего на 0,1 от ваших практических значений http://c2.at.ua/forum/2-14-3

Хм, ссылки не работают после того, как в пост добаляю.

http://c2.at.ua/load....-1-0-74
http://c2.at.ua/forum/2-14-3
Прикрепления: 5913105.rar (50.6 Kb)


Сообщение отредактировал MACTEPok - Пятница, 23.12.2011, 14:07
 
Форум » Форум по статьям сайта » Все темы » Универсальная схема для построения измерительных устройств (Применение, практика...)
  • Страница 1 из 26
  • 1
  • 2
  • 3
  • 25
  • 26
  • »
Поиск:

Конструктор сайтов - uCoz
Copyright MyCorp © 2024