МК измеряет направление и скорость ветра. Измерения производятся с помощью прямоугольных сигналов, которые поступают от ветроуказателя(М63М-1). Поступают два сигнала с одинаковой частотой, но 2-ой сдвинут по фазе относительно 1-го. По частоте определяем V ветра, а по фазе направление. Программа в Bascom написано по следующему алгоритму:
1 Конфигурируем Timer1 и Timer3 режим захвата, по нараставшему фронту сигнала;
2. На вход IC1(PD4) подается 1-ый сигнал, а на IC3(PE7) 2-ой - сдвинутый по фазе;
3. По приходу импульса на IC1 останавливаем Timer1 берем значение Timer1 – вычисляем частоту. Тут же останавливаем Timer3 берем значение – вычисляем фазу по формуле t=(фаза/180)*период => фаза = (t*180)/period , где t - время для Timer3
Частота вычисляется точно(измерял осциллографом, а вот с фазой беда. Формулы взяты из технического описания М63М-1
Код: Выделить всё
$regfile = "m128def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 32
$framesize = 32
'-------------------------------------------------------------------------------
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , E = Porta.4 , Rs = Porta.5
'-------------------------------------------------------------------------------
Dim Errord1 As Bit , Errord2 As Bit 'переменные для температуры
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim A As Byte , A2 As Byte , N As Byte 'переменные для температуры
Dim B As Byte , B2 As Byte
Dim Ss1 As Byte , Ss2 As Byte
Dim D As Byte , D2 As Byte
Dim E As Byte , E2 As Byte
Dim Zahvatvrem As Word , Zahvatvrem1 As Word , Perphazi As Word , Ugol1 As Word ,Phaza As Word 'переменные для ветра
Dim Period1 As Single , Per1 As Single , Ugol As Single , Sdvig As Single
Dim Chastota As Single
Dim Sd As String * 3 'скорость ветра
Dim Znak As String * 1 , Znak1 As String * 1 , Znak2 As String * 1 'переменные для температуры
'-------------------------------------------------------------------------------
Config Timer1 = Timer , Prescale = 1024 , Capture Edge = Rising , Noise Cancel = 1 , Clear Timer = 1
Config Portd.4 = Input
Enable Interrupts
Enable Capture1
Enable Timer1
Start Timer1
Zahvatvrem = 0
'-------------------------------------------------------------------------------
Config Timer3 = Timer , Prescale = 1024 , Capture Edge = Rising , Noise Cancel = 1
Config Porte.7 = Input..
Enable Capture3
Enable Timer3
Start Timer3
Zahvatvrem1 = 0
'-------------------------------------------------------------------------------
Config Pinc.7 = Input
Config Portd.7 = Output
Config Portd.2 = Output
Yug Alias Pinc.7 ' Вход для сигнала от геркон
Osnovnaya Alias Portd.2 ' Сигналы на входы IC1,IC3 МК входы подаются через оптопары. Через этот порт коммутируем
Sdvinut Alias Portd.7 ' То же самое
Reset Osnovnaya
Reset Sdvinut
Reset Yug
'-------------------------------------------------------------------------------
On Capture3 Zahvat3
On Capture1 Zahvat1
Const Pha = 0 , 01152 ' 180* 0.000064 для удобства вычислений
Const T = 0.000064 ' (1024*65536/16 000 000)/65536 -примерное время за
' которое значение Timer1,Timer3 увеличивактся на 1
Do
Set Osnovnaya
Reset Sdvinut
Gosub Skorost
Gosub Napravlenie
Gosub Datchik1
Gosub Datchik2
Gosub Pokaz
Loop
End
Napravlenie:
If Yug = 1 Then 'добавлено временно, чтобы узнать где юг. В М63М в этом положении есть геркон
Ugol1 = 180
Else
If Period1 = 0 Then
Ugol1 = 0
Else ' Ugol=(180*t)/period1 ,где t= Phaza*T Pha=180*T
Per1 = Phaza / Period1
Ugol = Pha * Per1
Ugol1 = Round(ugol)
End If
End If
Phaza = 0
Return
'-------------------------------------------------------------------------------
Skorost:
Period1 = Zahvatvrem * T 'получаем время для вычисления частоты
If Period1 = 0 Then
Chastota = 0
Else
Chastota = 1 / Period1
End If
Sd = Fusing(chastota , "#.#")
Return
'-------------------------------------------------------------------------------
'------------------
'------------------
'Тут код для датчиков температуры
-------------------------
Pokaz:
Locate 1 , 1
If Ugol1 < 100 Then Lcd Chr(7) ; " " ; Sd ; " m/c" ; " " ; "0" ; Ugol1 ; Chr(2) ; " " 'выводим на LCD
If Ugol1 < 10 Then Lcd Chr(7) ; " " ; Sd ; " m/c" ; " " ; "00" ; Ugol1 ; Chr(2) ; " "
If Ugol1 > 99 Then Lcd Chr(7) ; " " ; Sd ; " m/c" ; " " ; Ugol1 ; Chr(2) ; " "
Ugol1 = 0
Locate 2 , 1
If Errord1 = 1 Or Errord2 = 1 Then
If Errord2 = 1 Then
Errord2 = 0
Lcd Chr(1) ; " " ; Znak1 ; Ss1 ; Chr(2) ; "C" ; " " ; Chr(0) ; "-Error"
Else
If Errord1 = 1 Then
Errord1 = 0
Lcd Chr(1) ; "-Error" ; " " ; Chr(0) ; " " ; Znak2 ; Ss2 ; Chr(2) ; "C "
End If
End If
Else
Lcd Chr(1) ; " " ; Znak1 ; Ss1 ; Chr(2) ; "C" ; " " ; Chr(0) ; " " ; Znak2 ; Ss2 ; Chr(2) ; "C "
End If
Return
'*******************************************************************************
Zahvat1:
Stop Timer1
Stop Timer3
Zahvatvrem = Timer1 'берем значение для вычисления скорости ветра
Phaza = Timer 'берем значение для вычисления напрвления ветра
Timer1 = 0
Start Timer1
Start Timer3
Return
Zahvat3:
Timer3 = 0 'обнуляем значение Timer 3
Return


