Pomiar FREQ i DUTY ;)

Proste przykłady do częstych pytań.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Pomiar FREQ i DUTY ;)

Post autor: niveasoft » 23 lip 2017, 14:33

Jakoś mi umknęło by to zamieścić. Wartości w programie dobrane były na potrzeby pomiaru długości wtrysku..można go rozbudować.
Niemniej program pokazuje jak można użyć wejścia ICP do mierzenia jedncześnie długości impulsu masowego i plusowego co pozwala obliczyć wypełnienie ;)
Program nie był przeze mnie bardziej testowany i może jakiś bug się tam ukrywa :D
  1. $regfile = "m32def.dat"
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6.  
  7. '***********************************************************
  8. '*                                                         *
  9. '*   PROSTY MIERNIK CZĘSTOTLIWOŚCI, WYPEŁNIENIA I CZASÓW   *
  10. '*                                                         *
  11. '* BARTek niveasoft                                        *
  12. '***********************************************************
  13.  
  14. Config Lcd = 20x4
  15. Config Lcdpin = Pin , Rs = Portb.4 , E = Portb.3 , Db4 = Portb.2 , Db5 = Porta.0 , Db6 = Porta.1 , Db7 = Porta.2
  16. Cursor Off , Noblink
  17. Cls
  18.  
  19. Config Timer1 = Counter , Prescale = 64 , Capture_edge = Falling , Noise_cancel = 1       '262ms max
  20.  
  21.  
  22. Config Timer2 = Timer , Prescale = 1024 , Compare = Disconnect , Clear_timer = 1
  23.  Enable Compare2 : On Compare2 Przerwanie_timer2 Nosave
  24. Compare2 = 155                                         '10ms @16MHz/1024
  25.  Dim Miliseconds As Byte , 500ms As Byte , 1000ms As Byte
  26.  
  27. Dim Mig As Byte , Helpb As Byte
  28. Dim New_tim As Word , Old_tim As Word , New_hi As Word , New_lo As Word , Period As Word
  29. Dim New_impuls As Byte , Countdown As Byte , Copy_hi As Word , Copy_lo As Word
  30.  
  31. Dim Helpd As Dword , Freq As Dword , Time_hi As Dword , Time_lo As Dword , Duty As Dword
  32.  
  33. Config Portd.6 = Input : Signal_in Alias Pind.6
  34.  
  35. On Capture1 Capture_isr Nosave
  36.  
  37. Enable Capture1
  38. Enable Interrupts
  39.  
  40. Const Edge_fall = &B10000011
  41. Const Edge_rise = &B11000011
  42.  
  43. Const Ticks = _xtal / 64                               ' for 16MHz = 250 000
  44.  
  45. Countdown = 1
  46.  
  47. Do
  48.  
  49.  If New_impuls = 1 Then
  50.   New_impuls = 0
  51.  
  52.   If Countdown = 0 Then Cls
  53.  
  54.   Countdown = 10
  55.  
  56.  End If
  57.  
  58.  If 500ms = 1 Then
  59.   500ms = 0
  60.  
  61.     Locate 1 , 16
  62.     If Mig = 0 Then
  63.      Mig = 1 : Lcd "*"
  64.     Else
  65.      Mig = 0 : Lcd " "
  66.     End If
  67.  
  68.     If Countdown > 0 Then
  69.      Decr Countdown
  70.  
  71.  
  72.  
  73.      If Countdown = 0 Then
  74.  
  75.  
  76.       Locate 1 , 1 : Lcd "No signal..." ; Spc(4)
  77.  
  78.      Else
  79.  
  80.       Copy_hi = New_hi
  81.       Copy_lo = New_lo
  82.  
  83.        Helpd = Copy_hi + Copy_lo                       'for 1kHz = 250
  84.  
  85.       'obliczanie wypelnienia
  86.        Duty = Copy_hi : Duty = Duty * 100
  87.         Duty = Duty / Helpd
  88.          Locate 2 , 8 : Lcd "Duty=" ; Duty ; "% "
  89.  
  90.       'oblicznie freq
  91.         Shift Helpd , Left , 6                         'for 1kHz = 16000
  92.           Freq = _xtal / Helpd : Locate 2 , 1 : Lcd Freq ; "Hz "
  93.  
  94.         Shift Copy_hi , Left , 2
  95.         Shift Copy_lo , Left , 2
  96.  
  97.         Locate 1 , 3 : Lcd Copy_hi ; "us/" ; Copy_lo ; "us"
  98.  
  99.  
  100.  
  101.  
  102.      End If
  103.  
  104.     End If
  105.  
  106.  End If
  107.  
  108. Loop
  109. End
  110.  
  111. Capture_isr:
  112.  
  113.    $asm
  114.   !PUSH R16
  115.   !PUSH R17
  116.   !PUSH R20
  117.   !PUSH R21
  118.   !PUSH R23
  119.   !PUSH R24
  120.   !PUSH R25
  121.   !PUSH R26
  122.   !PUSH R27
  123.   !in R24, sreg
  124.   !PUSH  R24
  125.  
  126.   $end Asm
  127.  If Signal_in = 0 Then
  128.   New_hi = Capture1 - Old_tim
  129.   Tccr1b = Edge_rise
  130.  Else
  131.   New_lo = Capture1 - Old_tim
  132.    New_impuls = 1
  133.   Tccr1b = Edge_fall
  134.  End If
  135.   Old_tim = Capture1
  136.  
  137.   '          Tuned with NoSave Tool 1.10
  138.   $asm
  139.   !POP  R24
  140.   !out sreg, r24
  141.   !POP R27
  142.   !POP R26
  143.   !POP R25
  144.   !POP R24
  145.   !POP R23
  146.   !POP R21
  147.   !POP R20
  148.   !POP R17
  149.   !POP R16
  150.   $end Asm
  151.  
  152. Return
  153.  
  154. Przerwanie_timer2:
  155.   $asm
  156.   !PUSH R16
  157.   !PUSH R24
  158.   !PUSH R26
  159.   !PUSH R27
  160.   !in R24, sreg
  161.   !PUSH  R24
  162.   $end Asm
  163.  
  164.  If Miliseconds < 49 Then
  165.   Incr Miliseconds
  166.  Else
  167.   Miliseconds = 0
  168.    500ms = 1
  169.  End If
  170.   '          Tuned with NoSave Tool 1.10
  171.   $asm
  172.   !POP  R24
  173.   !out sreg, r24
  174.   !POP R27
  175.   !POP R26
  176.   !POP R24
  177.   !POP R16
  178.   $end Asm
  179. Return

Fotki miernika poniżej :D Jest to jakby komplementarny zestaw do tego generatora FREQ i DUTY

Obrazek Obrazek Obrazek Obrazek
ODPOWIEDZ