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

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Приборы, средства и способы измерения величин » Как сделать динамичное измерение?


Как сделать динамичное измерение?

Сообщений 1 страница 4 из 4

1

Суть вопроса такова. Собрал зарядное устройство для аккумулятора с функцией тренировки (цикл заряд- разряд).
Когда работает в подпрограмме заряд - разряд Rechim: индикация тока и напряжения обновляется у меня в цикле. При этом цикл может быть такой например заряд 10 секунд, разряд 5 секунд. Ну и естественно обновления измерения происходит через 15 секунд. Что меня не устраивает. Как можно сделать так чтобы во время цикла заряд - разряд, измерения проходили не зависимо от времени цикла? Выход на режим заряд - разряд тумблером на PD1. Установка времени заряда и разряда в подпрограмме прерывания по INT0. Код программы прилагаю.

$regfile = "m8def.dat"
$crystal = 8000000
$lib "lcd4.lbx"

Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2

Config Adc = Single , Prescaler = Auto , Reference = Avcc   'Конфигурация АЦП
Config Portd.0 = Output
  Reset Portd.0
  Config Pind.1 = Input
  Config Pind.2 = Input
  Config Pind.3 = Input
  Config Pind.4 = Input
  Config Pinc.3 = Input
  Config Pinc.2 = Input

   Portd.1 = 1
   Portd.2 = 1
   Portd.3 = 1
   Portd.4 = 1
   Portc.3 = 1
   Portc.2 = 1

    Config Int0 = Low Level

'Объявление переменных
Dim Vremja_r As Word
Dim Vremja_z As Word
Dim I As Single
Dim U As Single
Dim Iperv As Word
Dim Uperv As Word
Dim A As Word

  On Int0 Vremiy                                            'Имя подпрограммы прерывания
Enable Interrupts
Enable Int0
Start Adc                                                  'Запускаем аналого-дискретное преобразование

'-------------------------------------------------------------
'Главный цикл программы
Zikl:                                                       'Подпрограмма просто замер тока и напряжения

Reset Portd.0
     Vremja_r = 1
     Vremja_z = 1
   Cls
Do
    If Pind.1 = 0 Then                                      'Переход на подпрограмму заряд - разряд
   Goto Rechim
   End If
Iperv = Getadc(5)                                          'Считываем результат с пина 5 порта C измерение тока
I = Iperv / 100
    Uperv = Getadc(4)                                       'Считываем результат с пина 4 порта C измерение напряжения
    U = Uperv / 43
Locate 1 , 1                                               'Позиция курсора
Lcd "HaѕpЗ¶eЅёe  " ; U ; "  "                               'Выводим результат преобразования на дисплей
Locate 2 , 1
Lcd "Toє         " ; I ; "  "
Waitms 200                                                  ' Задержка 100 мс
Loop
End

       Rechim:
            Cls                                             'Подпрограмма  цикла заряд - разряд по заданному времени
          Do
      Set Portd.0
         Wait Vremja_r                                      'Время разряда
           Reset Portd.0
         Wait Vremja_z                                      'Время заряда
           Set Portd.0

      If Pind.1 = 1 Then
   Goto Zikl
      End If

    Waitms 100
      Iperv = Getadc(5)                                     'Считываем результат с пина 5 порта C - ТОК
   I = Iperv / 100
      Uperv = Getadc(4)                                     'Считываем результат с пина 4 порта C - НАПРЯЖЕНИЕ
   U = Uperv / 43
   Locate 1 , 1
   Lcd "Pa· " ; Vremja_r ; "  "
   Locate 1 , 9                                             'Позиция курсора
   Lcd "Haѕ " ; U ; "  "
   Locate 2 , 1
   Lcd "¤ap " ; Vremja_z ; "  "
   Locate 2 , 9
   Lcd "Toє " ; I ; "  "
     Loop
        End

       Vremiy:                                              'Подпрограмма прерывания для задания времени заряда
                                                            'разряда аккумулятора
         Cls

     Locate 1 , 1
     Lcd "  BpeјЗ     "
    Locate 2 , 1
   Lcd "Pa· " ; Vremja_r ; "  "
    Locate 2 , 9
   Lcd "¤ap " ; Vremja_z ; "  "

     If Pind.3 = 0 Then                                     'Кнопка для увеличения времени задания разряда
   Incr Vremja_r
     End If
   If Pind.4 = 0 Then                                       'Кнопка для уменьшенияи времени задания разряда
   Decr Vremja_r
        End If
        If Vremja_r < 1 Then
           Vremja_r = 1
           End If

    If Pinc.3 = 0 Then                                      'Кнопка для увеличения времени задания заряда
   Incr Vremja_z
     End If
   If Pinc.2 = 0 Then                                       'Кнопка для увеличения времени задания заряда
   Decr Vremja_z
        End If
        If Vremja_z < 1 Then
            Vremja_z = 1
            End If
            Waitms 200

       Return
              End

Отредактировано AleksanderG (2013-01-21 12:52:24)

0

2

Добавить прерывание по таймеру, в котором будет происходить измерение

0

3

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

Отредактировано AleksanderG (2013-01-21 15:28:05)

0

4

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

Код:
$regfile = "m8def.dat"
$crystal = 8000000
$lib "lcd4.lbx"
'$sim
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2

Config Adc = Single , Prescaler = Auto , Reference = Avcc   'Конфигурация АЦП
Config Timer1 = Timer , Prescale = 1024

 Config Portd.0 = Output
  Reset Portd.0
  Config Pind.1 = Input
  Config Pind.2 = Input
  Config Pind.3 = Input
  Config Pind.4 = Input
  Config Pinc.3 = Input
  Config Pinc.2 = Input

   Portd.1 = 1
   Portd.2 = 1
   Portd.3 = 1
   Portd.4 = 1
   Portc.3 = 1
   Portc.2 = 1

    Config Int0 = Low Level

'Объявление переменных
Dim Vremja_r As Word
Dim Vremja_z As Word
Dim I As Single
Dim U As Single
Dim Iperv As Word
Dim Uperv As Word
Dim A As Word

Dim Shetshik As Word

Shetshik = 0
Timer1 = 61630                                              ' прерывание примерно 0,5 сек

 Enable Interrupts
 On Int0 Vremiy                                             'Имя подпрограммы прерывания
 On Timer1 Izmerenie
Enable Int0
Enable Timer1



'-------------------------------------------------------------
'Главный цикл программы


Reset Portd.0
     Vremja_r = 1
     Vremja_z = 1
   Cls
Do
    If Pind.1 = 0 Then                                      'Переход на подпрограмму заряд - разряд
   Gosub Rechim
   End If

 I = Iperv / 100

 U = Uperv / 43
 Locate 1 , 1                                               'Позиция курсора
Lcd "HaѕpЗ¶eЅёe  " ; U ; "  "                               'Выводим результат преобразования на дисплей
Locate 2 , 1
Lcd "Toє         " ; I ; "  "

Loop
End

       Rechim:

Cls                                                         'Подпрограмма  цикла заряд - разряд по заданному времени
Vremja_r = Vremja_r * 2
Vremja_z = Vremja_z * 2
Do

Shetshik = 0

Do
Set Portd.0

Loop Until Shetshik = Vremja_r

Do                                                          'Время разряда
Reset Portd.0
Loop Until Shetshik = Vremja_z                              'Время заряда




   I = Iperv / 100

   U = Uperv / 43

   Locate 1 , 1
   Lcd "Pa· " ; Vremja_r ; "  "
   Locate 1 , 9                                             'Позиция курсора
   Lcd "Haѕ " ; U ; "  "
   Locate 2 , 1
   Lcd "¤ap " ; Vremja_z ; "  "
   Locate 2 , 9
   Lcd "Toє " ; I ; "  "


   If Pind.1 = 1 Then
   Exit Do
      End If
Loop

Vremja_r = Vremja_r / 2
Vremja_z = Vremja_z / 2

Return

       Vremiy:                                              'Подпрограмма прерывания для задания времени заряда


                                                            'разряда аккумулятора
         Cls

     Locate 1 , 1
     Lcd "  BpeјЗ     "
    Locate 2 , 1
   Lcd "Pa· " ; Vremja_r ; "  "
    Locate 2 , 9
   Lcd "¤ap " ; Vremja_z ; "  "

     If Pind.3 = 0 Then                                     'Кнопка для увеличения времени задания разряда
   Incr Vremja_r
     End If
   If Pind.4 = 0 Then                                       'Кнопка для уменьшенияи времени задания разряда
   Decr Vremja_r
        End If
        If Vremja_r < 1 Then
           Vremja_r = 1
           End If

    If Pinc.3 = 0 Then                                      'Кнопка для увеличения времени задания заряда
   Incr Vremja_z
     End If
   If Pinc.2 = 0 Then                                       'Кнопка для увеличения времени задания заряда
   Decr Vremja_z
        End If
        If Vremja_z < 1 Then
            Vremja_z = 1
            End If

       Return



Izmerenie:

 Start Adc                                                  'Запускаем аналого-дискретное преобразование

Iperv = Getadc(5)                                           'Считываем результат с пина 5 порта C измерение тока
Uperv = Getadc(4)                                           'Считываем результат с пина 4 порта C измерение напряжения

Stop Adc

Incr Shetshik                                               'увеличение переменной = 500мс

Timer1 = 61630

Return

Если правильно посчитал, то измерение будет происходить дважды в секунду, и соответственно увеличиваться переменная "Shetshik", от нее и отсчитывается время - заряд/разряд.

Отредактировано Виктор (2013-01-22 13:40:38)

0


Вы здесь » Программирование ATMEL в BASCOM. » Приборы, средства и способы измерения величин » Как сделать динамичное измерение?