Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
Помощь по алгоритму программы для стенда
SD Дата: Чт, 12.05.2011, 12:46  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 3
Репутация: 0   ±
Замечания:   ±
На сайте с 15.03.2010

Статус: Offline

Уважаемые форумчане! Нужны ваши идеи по реализации программы для готового устройства.
Суть в следующем: есть вентилятор и есть нагревательный элемент. Каждый из них должен работать циклически, например 1 минута работа, 5 минут пауза (для обоих). Временные интервалы (всего их получается 4) настраиваемые в пределах 0÷30 мин, шаг 1 мин, причем точность плюс минус пять секунд роли не играет. В качестве способа установки времени хочу задействовать 4 входа АЦП с подключенными к ним переменными резисторами. Кнопки, и сопутствующую им процедуру установки и занесения констант в память задействовать не хочу – обслуживающий персонал тетки предпенсионного возраста, поэтому нужна простота.
Пробовал реализацию через
VentPA = ADIn 0
VentPA = (VentPA /0.2048)/1000
Select VentPA
Case 0 To 0.2
Print At 1, 13, "N=01"
Case 0.2 To 0.4
Print At 1, 13, "N=02"
..........
EndSelect
и т. д.
как итог – почти полное заполнение памяти программы. Может подскажете путь попроще?
Прикрепления: Registry_Cycle_.rar (19.8 Kb)

Сообщение отредактировал SD - Чт, 12.05.2011, 12:50
ЯНДЕКС Дата: 12.05.2011
ADMIN Дата: Чт, 12.05.2011, 13:05  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

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

Вот формула для вычисления значения 10 разрядного АЦП в милливольтах:

Code

Dim Ad_Result  As ADRESL.Word
Dim Value      As Word
Ad_Result = ADIn 0
Value = 489 * (Ad_Result / 100)  'Получаем значение в милливольтах

Это информация к размышлению. Пока подумай сам, позже попробуем решить. Это несложно.
SD Дата: Чт, 12.05.2011, 13:29  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 3
Репутация: 0   ±
Замечания:   ±
На сайте с 15.03.2010

Статус: Offline

С информацией для размышления разобрался и применил в программе. Но основной вопрос остался прежним - как упростить процедуру привязки диапазона значений напряжения к соответствующему количеству минут установки. Использовать для этого Select Case громоздко и что-то мне подсказывает - дюже нерационально.
ADMIN Дата: Чт, 12.05.2011, 18:04  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Вот немного набросал. Думаю, все будет понятно. Я Просто исхожу из того, что максимальное значение АЦП будет 1023. Поскольку тебе требуется всего 30 шагов, то делим максимальное значение АЦП на 30, получаем 34.
Получаем такой код:

Code


DEVICE = 16F876A
'-------------------------------------Предустановки--------------------------------------------

XTAL 4
DECLARE LCD_TYPE  ALPHA       'Тип ЖКИ
DECLARE LCD_DTPIN PORTB.4     'Подключение шины данных
DECLARE LCD_RSPIN PORTB.2     'RS -> PORTB.2
DECLARE LCD_ENPIN PORTB.3     'E -> PORTB.3
DECLARE LCD_INTERFACE 4       'Интерфейс передачи - 4-проводный    
DECLARE LCD_COMMANDUS 2000    'Задержка перед посылкой команды    
DECLARE LCD_DATAUS 50        'Задержка перед посылкой данных    
DECLARE LCD_LINES 2           'Число строк ЖКИ
DECLARE ADIN_RES 10           '10-битный АЦП
DECLARE ADIN_TAD FRC       'Выбор тактирования    
DECLARE ADIN_STIME 100         '50 мкС на выборку
'-------------------------------------Настройки портов-----------------------------------------
TRISA = %00101111                
TRISB = %00000011
TRISC = %00000000    
PORTB = %00000000
PORTC = %00000000    
ADCON1 = %10000000            'Установить выводы порта А входами АЦП
PORTB_PULLUPS = off          'Выключить подтяжку резисторов к порту PORTB    
'-----------------------------------Конфигурация переменных------------------------------------
;   Symbol VentR PORTA.0    'Управление затвором полевого транзистора
;   Symbol VentP PORTA.1     'Звуковая сигнализация при работе
;   Symbol RegR PORTA.2        'Управление включением реле для замера сопротивления измеряемого позистора
;   Symbol RegP PORTA.3
'   SYMBOL Pusk PORTB.0        'Кнопка ПУСК для старта начала измерения и обработки
;   Symbol Rezhim PORTB.1      'Переключение питающий напряжений 130-425В для изменения коэфф. деления АЦП
;   Symbol Alarm PORTC.0
'   DIM VentRA AS FLOAT         'Переменная для хранения результата АЦП вольт    
;   Dim VentPA As Float         'Переменная для хранения результата АЦП вольт    
;   Dim RegRA As Float             'Переменная для хранения результата АЦП вольт
;   Dim RegPA As Float        'Переменная для хранения результата АЦП вольт    
       DIM i AS BYTE
DIM ADCRes[4] AS WORD    ' Переменная для результата преобразования
DIM RABOTA1 AS BYTE
DIM PAUSA1 AS BYTE
DIM RABOTA2 AS BYTE
DIM PAUSA2 AS BYTE
'-------------------------------------Очистка дисплея------------------------------------------
CLS
'---------------------------Подать звуковой сигнал о готовности к работе-----------------------
PRINT AT 1, 1, "STEND SIRP V1.0"
DELAYMS 1000
CLS
'--------------------Измерение и вывод на дисплей значения напряжения питания------------------
Start:
GOSUB ReadADCs
        RABOTA1=ADCRes[0]
        PAUSA1=ADCRes[1]
        RABOTA2=ADCRes[2]
        PAUSA2=ADCRes[3]
PRINT AT 1, 1, DEC2 RABOTA1," ", DEC2 PAUSA1 'Здесь просто отображаем результат в минутах по каждому порту
PRINT AT 2, 1, DEC2 RABOTA2," ", DEC2 PAUSA2
GOTO Start
;;'-----------------------------Проверка сопротивления позистора---------------------------------

'------------------------------------------------------------------------------------------- ---
ReadADCs:
        FOR i = 0 TO 3    
          ADCRes[i] = ADIN i 'Теперь в данном элементе массива ADCRes[i] содержится значение одного из каналов АЦП
              ADCRes[i] = ADCRes[i]/34 'А теперь мы преобразуем это значение в минуты
        NEXT
RETURN

То, что я написал выше, вообще не требуется/

Теперь имеем значения резисторов в минутах. Теперь попробуй вести отсчет с помощью таймера(чтобы отсчет шел в фоне основной программы) в прерываниях. Настрой TIMER1 на прерывания через каждые 0.5 сек и ставь выходы как тебе надо.
Вот как-то так...

Прикрепления: 6410248.rar (59.3 Kb)
SD Дата: Пт, 13.05.2011, 09:30  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Новенький
Сообщений: 3
Репутация: 0   ±
Замечания:   ±
На сайте с 15.03.2010

Статус: Offline

Спасибо, похоже в принципе разобрался - на самом деле оказалось все намного проще. Буду пробовать дальше сам.
ADMIN Дата: Пт, 13.05.2011, 09:52  |                                                                                                                Сообщение # 6
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Если что, спрашивай
  • Страница 1 из 1
  • 1
Поиск: