logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega8] [bascom] Jak pomnożyć częstotliwość wejściową 7 razy?

przema72 03 Mar 2012 09:37 1794 4
REKLAMA
  • #1 10626810
    przema72
    Poziom 19  
    witam , potrzebuję pomnożyć 7razy impulsy wejściowe , częstotliwość wej nie jest duża max 200hz , znalazłem podobny program na pic16 mnożacy 39razy i kawałek kodu na atmege8 również mnożący 39razy , jednak zupełnie nie mam pojęcia jak cos takiego napisac w bascomie

    kod dla pic:
    Device 16F628A
    Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_ON
    'B0 = VSS input signal = input  (pin 6)
    'B3 = VSS output signal = output (pin 9)
    
    Dim tm As Word
    Dim ttm As DWord
    Dim Fout As Word
    Dim ovf As Word
    
    tm = 0                               ; set counter to 0
    ttm = 0
    Fout = 0                             ; output frequency -  245Hz is lowest possible
    ovf = 0
             ;76543210
    PORTB  = %00000000                  ; all low
    TRISB  = %00000001                  ; 7, 6, 5, 4, 3, 2, 1 en 0 are input (1) or output (0)
    INTCON = %11010000                  ; Enable interrupts  (GIE, PIE, RB0)
    T1CON  = %00110000                  ; setup timer1 with 1:8 prescale (1:2 and 1:4)
    PIE1.0 = 1                          ; enable tmr1 interrupt
    
    on_interrupt GoTo interrupt_handler
    
        While 1=1
    
        Wend
    
    interrupt_handler: 
     If INTCON.1 = 1 Then                 ; VSS pulse came in
        T1CON.0 = 0                       ; stop counter
        tm.LowByte  = TMR1L               ; read and save counter
        tm.HighByte = TMR1H
        TMR1H = 0                         ; reset counter to 0
        TMR1L = 0
        T1CON.0 = 1                       ; (re)start counter
        ttm = tm + (ovf * 65535)
        ovf = 0
        If ttm > 0 Then 
      ;     Fout = 39000000 /(ttm * 8)      ; Fout[p/s] = (multiplier / divider[at output]) * 1000000 [us/s] / (cc [p] * 8[p/us])
           Fout = 39000000 /(ttm * 2)      ; Fout[p/s] = (multiplier / divider[at output]) * 1000000 [us/s] / (cc [p] * 8[p/us])   [with 4 multiplier at output]
           If Fout > 245 Then HPWM 1, 127, Fout   
        EndIf
      EndIf  
      
    If PIR1.0 = 1 Then                   ;timer1 interrupt
        If ovf < 2 Then                  ;Because the timer counts a bit fast (thus accurate) we also need to count the overflows
           ovf = ovf + 1
        Else
            T1CON.0 = 0                      ;stop counter as the car has stopped (no input VSS pulse within 1,5 seconds)
            TMR1H = 0 
            TMR1L = 0
            Fout  = 0
            ovf =0;
            T2CON=%0000000 ; stop hpwm
        EndIf
        PIR1.0 = 0                          ; reset timer interupt flag
     EndIf
         INTCON = %11010000 ; Reset all interrupt flags
    Return


    a tu kawałek kodu dla atmega8 8mhz w C
     interrupt [EXT_INT0] void ext_int0_isr(void)
    {
        if (ovf>79)
        {
            if(--licznik<1) licznik=0;
        }
        else if(ovf<79)
        {
            if(++licznik>254) licznik=254;
        }
        ovf=0;
               
    }
    
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
       PORTB.3 = !PORTB.3;
       TCNT0=licznik;
       ovf++;
    }
    
     
  • REKLAMA
  • #2 10626876
    SylwekK
    Poziom 32  
    Tak na chłopski rozum pierwsze co przychodzi na myśl to stały pomiar częstotliwości wejściowej i na tej podstawie wytworzenie nowych impulsów o wyższej częstotliwości przeliczanych w czasie rzeczywistym. Oczywiście w takim układzie impulsy wyjściowe były by z lekkim opóźnieniem (co najmniej 2 imp. na wejściu), bo potrzebny jest przecież czas na zmierzenie odległości między tymi pierwszymi impulsami... to taka moja koncepcja na szybko, a czy zdała by egzamin? Myślę, że tak :)

    [EDIT]
    Włąśnie mi się coś przypomniało :) - żeby nie być gołosłownym, to właśnie taką namiastkę powielacza częstotliwości x14 zrobiłem tutaj

    Mierzona odległość między dwuklikiem jest rozkładana na 14 krótszych odcinków czyli ... mamy powielacz częstotliwości :) Teraz trzeba to przystosować do pracy bez zatrzymywania czyli mierzenie ciągłe czasu między każdym następnym, a poprzednim impulsem.
  • REKLAMA
  • #3 10627157
    przema72
    Poziom 19  
    opóźnienie w czasie nie jest zbyt istotne

    niestety ja dopiero zaczynam przygodę z uP , jestem na etapie ze gotowy kod jak już go zrozumie to jestem w stanie odpowiednio przerobić

    może pisze głupoty , ale można by uruchamiać timer generujący impulsy w czasie pomiędzy impulsami wejściowymi , mając wartość timera pomiędzy impulsami wejściowymi, generować sygnał wyjściowy w tym samym czasie timera ale z większa częstotliwością niż syg wej.
  • REKLAMA
  • #4 10627673
    SylwekK
    Poziom 32  
    Powiedz jeszcze czy ta częstotliwość wejściowa będzie sie zmieniać w dużym zakresie czy to po prostu 200Hz z jakimś marginesem ? Jeśli zmienna to jaka najmniejsza częstotliwość na wejściu wystąpi? Z uzyskaniem 1,4kHz na wyjściu nie powinno być żadnego problemu.
  • #5 10627689
    przema72
    Poziom 19  
    tak częstotliwość ma się zmieniać 0-200Hz , ogólnie jest to układ który ma za zadanie impulsy prędkości ze skrzyni biegów dopasować do prędkościomierza
    wiec poniżej np 2-3Hz częstotliwości wej. , może przestać generować czest. wyj.
REKLAMA