Уважаемые форумчане!
Подскажите, как можно организовать подсчет количества импульсов в единицу времени. На сайте есть пример универсального модуля для работы с перефирией через ADC. Может подскажете как сделать модуль для подсчета импульсов (расходомер, спидометр, тахометр и т.д.)?
Расходомер
Сообщений 1 страница 12 из 12
Поделиться12012-05-10 11:07:27
Поделиться22012-05-10 11:30:34
на форуме Bascom AVR нашел код
'JP duval 4/01/2005 -----------------------------------------------------------
' -----------------[flowmeter for ULM ultralight aircrafts]-------------------
'what I know
' tank capacity 29 liters
' consumption for 1 hour about 6 or 7 litres
'the flowmeter DIGMESA FHKSC 932-8501give me 1800 pulses per litre
' 29*1800=52200 pulses available, for security we work only with 48000
'******************************************************************
' use of Int1 = PortD.3
'VCC-------------^^^^^^^---------portd.3
' R= 4.7K
$hwstack = 100 'only for version 1.11.7.7 and higher
$swstack = 80 'only for version 1.11.7.7 and higher
$framesize = 50 'only for version 1.11.7.7 and higher
' -----[variables]----------------------------------------
Dim J As Byte , K As Byte , Flag As Bit
Dim Volume As Word , Calculating_volume As Word , Staying_volume As Word
Dim Barre As Word , Barre_number As Byte
Dim Tank As String * 8
Dim Diff_volume As Word
Dim Average As Byte , Total_average As Byte
Dim Seconde As Byte
Dim Ci As Long
'----[design of the bar]----------
Deflcdchar 5 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Deflcdchar 4 , 30 , 30 , 30 , 30 , 30 , 30 , 30 , 30
Deflcdchar 3 , 28 , 28 , 28 , 28 , 28 , 28 , 28 , 28
Deflcdchar 2 , 24 , 24 , 24 , 24 , 24 , 24 , 24 , 24
Deflcdchar 1 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16
Deflcdchar 0 , 32 , 4 , 6 , 3 , 24 , 12 , 4 , 32
Deflcdchar 6 , 32 , 4 , 12 , 24 , 3 , 6 , 4 , 32
' -------[ config ]-----------------------------------
'config must be writen on 1 line
Config Lcdmode = Port ' config 4 bit
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Config Clock = Soft
Config Portb = Input 'for noise
Config Portd = Input
Config Int1 = Rising
Enable Interrupts
Enable Int1
On Int1 Suiteint1
Cursor Off , Noblink
'----[main]----------------------------------------------------------------------------------
'---initialisation-----------
Seconde = _sec
Volume = 48000 'nomber of pulse to count
Diff_volume = Volume 'for average
K = 0
Flag = 0
Cls
Locate 1 , 13 : Lcd "L/h"
' ----[lighting of the level bar]----------------------------------------
For J = 2 To 16
Locate 2 , J : Lcd Chr(5)
Next
Do
If Seconde <> _sec Then
'-------[instant consumption]---------------------------------
Waitms 400
Diff_volume = Diff_volume - Volume '# between previous volume and now
Average = Diff_volume
Total_average = Average + Total_average 'add of Average
Diff_volume = Volume 'for the next second
Incr K 'for the ponderation
If K = 10 Then
Ci = Total_average * 1000 ' CI= Instant Consumption
'here I prever use word than single for calculation
Ci = Ci / 1800 'transform in litre
Ci = Ci * 360 'per hour
Ci = Ci / 100 'formated
Locate 1 , 1 : Lcd " "
If Flag = 0 Then
Tank = Str(ci) 'Tank is a string it is use as generic variable
If Ci < 100 Then
Tank = Format(tank , "0.0")
Locate 1 , 10 : Lcd Tank
Else
Tank = Format(tank , "00.0")
Locate 1 , 9 : Lcd Tank
End If
Locate 1 , 13 : Lcd "L/h"
End If
Total_average = 0 : K = 0 'initialisation after 10 seconds
End If
'------[volume staying inthe tank]---------------------------
If Staying_volume = Volume Then Goto Encore 'security
Calculating_volume = Volume / 180 'Transform in litre
Tank = Str(calculating_volume) 'use of the string
Tank = Format(tank , "00.0")
Locate 1 , 16 : Lcd Chr(0) ' a small change in right side of 1st line
Locate 1 , 1 : Lcd "V:" ; Tank
Waitms 400
Locate 1 , 16 : Lcd Chr(6) ' a small change in right side of 1st line
Staying_volume = Volume 'initialisation for the next second
'------[ bargraph]------------------------------------------------
Barre = Volume / 600 '1 bar =333 ml (checked)
Barre_number = Barre Mod 5 'the owner character to display at the end of bargraph
Barre = Barre / 5 'the number of full character to display
Locate 2 , 1 : Lcd "R"
If Barre > 1 Then
For J = 2 To Barre
Locate 2 , J : Lcd Chr(5) 'the full character
Next
Elseif Barre = 1 Then
Locate 2 , 2 : Lcd Chr(5)
Elseif Barre = 0 Then
Flag = 1
Locate 2 , 1 : Lcd " "
Waitms 300
Locate 2 , 1 : Lcd "----RESERVE-----"
Waitms 300
End If
'----[Usage of owner characters 5,4,3,1 bar]--------------------
Barre = Barre + 1
If Barre_number > 0 Then
Locate 2 , Barre : Lcd Chr(barre_number)
Else
Locate 2 , Barre : Lcd " " 'owner character very special ? ! :-)
End If
If Volume < 1201 Then 'big alarm !
Disable Int1
Exit Do
End If
Encore:
Seconde = _sec
End If
Loop
Cls
Do
Locate 2 , 1 : Lcd " "
Waitms 300
Locate 2 , 1 : Lcd "----RESERVE-----"
Waitms 300
Loop
End 'end program
'----------------------------------------------------------------------------------------
Suiteint1: ' dйcrement on interruption-------------
Decr Volume
Return
ReturnЗдесь отсутствует кристал он mega 8. Когда ставлю частоту кварца 32768, при компиляции выскакивает ошибка.
Поделиться32012-05-10 11:50:30
Вот есть схема частотного расходомера, но не на баскоме. Можно ли это переветси на баском? Требуется вывод информации на Экран от сотового.
Поделиться42012-05-10 18:35:53
TAlex, а вы уверены, что она работает или нашли нечто похожее в инете и думаете, что подойдет?
Поделиться52012-05-10 18:42:02
TAlex, а вы уверены, что она работает или нашли нечто похожее в инете и думаете, что подойдет?
Как утверждают авторы данных статей, то да. Но у меня код на баскоме не работает Ссылка
Поделиться62012-05-11 00:36:53
Хуже некуда рыться в чужом коде, особенно если обвязка/железо не копируете.
Сложного в подсчете импульсов - не вижу, быстрее бы сами разобрались под свои мощности и написали, за одно и Бэйсик изучили. 
Поделиться82012-05-11 20:11:41
Ну и какие сложности? даже схема есть. 1800 импульсов на литр, между двумя импульсами утекает 1/1800 литра
Считаем время между двумя импульсами, делим (1/1800) на получившееся время, получаем мгновенный расход.
По прерыванию увеличиваем переменную, умножаем (1/1800) на переменную, получаем общий расход.
делим общее количество на общее время - получаем средний расход
Выводим все на LCD
Отредактировано demonizer (2012-05-11 20:12:50)
Поделиться92012-05-12 10:22:58
А почему код не компилируется?
Поделиться102012-05-12 10:53:03
Допиши в начале программы
$regfile = "m8def.dat"
И все скомпилируется
Размер кода 2,8kB
Демонстрационная версия BASCOM не скомпилирует более 2kB, кажется.
И второе, 32768 кварц подключается к XTAL1 и XTAL2, но не пишется $crystal = 32768 !!!
Он конфигурируется включением Config Clock = Soft и работает только на них.
Для работы программы в этом случае используется внутренний RC-генератор, он как раз и конфигурируется $crystal = [сколько-то там мегагерц]
Поделиться112012-05-12 10:59:22
Демонстрационная версия BASCOM не скомпилирует более 2kB, кажется.
Не более 4kB.
Поделиться122012-05-12 11:32:33
Ну, значит проблема в $crystal = 32768

