Frekvensmätning
Postat: 25 oktober 2008, 22:18:47
I samband med den frekvensgenerator jag har tillverkat uppstod problemet at mäta frekvenser mellan 125mHz och 50kHz.
Har en frekvensräknare (GW Universal Counter GUC-2010G) som fungerar hyggligt och verkar ganska precis. Den har längste gatetid på 10 sek, det är en dryg tid att vänta, speciellt när upplösningen bara kan bli i 0,1Hz.
Satt därför och funderade lite på att hitta ett snabbare och enklare sätt här till kvällen.
Praktik: på långsamma frekvenser kan man räkna pulstiden (stigande flank till stigande flank) med en timer i rätt läge, på en PIC kallas det "Capture" och det har jag sett andra ställe också så den tar vi. Det betyder att jag kan få ut mHz-frekvenserna med trevlig upplösning och att jag kan få en utläsning för varje puls.
Men högre upp i frekvenserna då? Ska jag visa på ett display kan det kvitta att ha en slukt snabb uppdatering av utläsningen, 3 gg/sek är allt som behövs.
Så jag tuggade lite på det och kom på en lösning. Den lösning kräver en capture-enhet + ytterligare en timer ställd som pulsräknare samt en aning logik.
Man har ett ingångssteg som tål det mesta, tänker att jag skulle hitta på nätet och "tjuva lite".
Signalen från ingångssteget går då till Clock-ingången på en D-flipflop MED Set & Reset-pinnar också, signalen går även till en AND-gate's ena ingång.
D-flipflop'ens Q-utgång går dels till Capture-ingången och dels till andra ingången på AND-gaten. Utgången från AND-gaten går till en Timer-ingång som är ställd i pulsräknare-läge.
D-flipflop'ens D, Set & Reset-ingångar styrs av µC'n.
Funktion:
* Frekvensmätning:
--- D sätt till '0', FF'en resets, Capture-enhetem nollas och sätt till att fånga BÅDA flanker och pulsräknaren nollas.
--- När µC'n är klar skickar den en '1' till D-ingången på FF'en.
--- Vid första stigande flank "flippar" Q-utgången till '1', det kommer en startpuls på Capture-enheten och pulsräknaren börjar räkna antal pulser.
--- Efter ett lagom tag skickar µC'n '0' till D-ingången på FF'en, förstkommande stigande flank skickar igenom den '0' och får Capture-enheten att ge ytterligare en interrupt, '0'-an stoppar ytterligare räkning av antalet pulser också.
Nu vet man alltså antalet pulser som har kommit och tiden som dessa har tagit, sedan kan lite matte räkna ut detta väldigt enkelt med mycket bra upplösning.
Vill man kan man ha en valfri prescaler direkt efter införstärkaren, kan man växla den som t.ex. 1:1 eller 1:256 ville detta medge att man kan spänna över ett mycket brett frekvensområde med bra upplösning + snabb utläsning.
Mätningspulsens längd är inte kritisk då man likaväl får rätt tal att räkna på, en vanlig timer duger alltså fint, t.o.m. ett mjukvarustyrd delay skulle duga.
Om man sedan väljer 1:1 i prescaler (om man bygger på det), ställer Set på FF'en till '1' kan man i lägre frekvenser ställa pulsräknaretimern till Capture-mode, fånga båda flanker och då få ut pulsbredd på endera nivå, duty-cycle och vad man annars ids räkna ut. Vill man kan man samla ihop data över ett antal cyklar och ta ett snitt, allt detta styrs av mjukvaran.
Hårdvaran är alltså "hur enkel som helst": ett input-steg (kan ju bli lite knepigt, speciellt vid höga frekvenser), en D-flipflop (kanske 7474), en AND-gate (kanske 74AHC1G08) samt en µC (jag väljer nog Renesas M16C28). Till det kan man lägga en prescaler och logiken för att välja "med eller utan nerdelning".
MEN... noggranheten beror självklart på µC's klocka, där duger det inte med vad som helst. Jag har ett par DS8000 liggande, de finns inte mer men det är TCXO'er på 8MHz med ett antal nollor efter. Ju bättre den klocka är ju bättre mätinstrument har man och jag vill påstå att en TCXO är ett MÅSTE för detta.
Jag har lyckats mäta frekvens på 3 kanaler på nästan detta vis med en 20MHz M16C och upp i närheten av 45kHz på båda kanalerna började det bli lite hackigt... fast jag hade inte D-FF'en med, för varje stigande flank kom det en interrupt då men mjukvaran såg till att mäta över längre tid.
Jag tror därför att detta system borde räcka upp till 8MHz utan prescaler på (eg. bara begränsat av hur snabbt pulsräknaren kan räkna), antal pulser kan ju lätt expanderas från räknarens 16 till 32 bit via overflow-interrupten.
På det vis skulle jag kunde bygga en frekvensmätare som kan klara av kanske 2 kanaler och ha ett frekvensspan från .... ja, riktigt lågt till ett par hundra MHz med fin upplösning hela vägen och snabb utläsning, självklart byter den mätområde automatisk osv.
Har en frekvensräknare (GW Universal Counter GUC-2010G) som fungerar hyggligt och verkar ganska precis. Den har längste gatetid på 10 sek, det är en dryg tid att vänta, speciellt när upplösningen bara kan bli i 0,1Hz.
Satt därför och funderade lite på att hitta ett snabbare och enklare sätt här till kvällen.
Praktik: på långsamma frekvenser kan man räkna pulstiden (stigande flank till stigande flank) med en timer i rätt läge, på en PIC kallas det "Capture" och det har jag sett andra ställe också så den tar vi. Det betyder att jag kan få ut mHz-frekvenserna med trevlig upplösning och att jag kan få en utläsning för varje puls.
Men högre upp i frekvenserna då? Ska jag visa på ett display kan det kvitta att ha en slukt snabb uppdatering av utläsningen, 3 gg/sek är allt som behövs.
Så jag tuggade lite på det och kom på en lösning. Den lösning kräver en capture-enhet + ytterligare en timer ställd som pulsräknare samt en aning logik.
Man har ett ingångssteg som tål det mesta, tänker att jag skulle hitta på nätet och "tjuva lite".
Signalen från ingångssteget går då till Clock-ingången på en D-flipflop MED Set & Reset-pinnar också, signalen går även till en AND-gate's ena ingång.
D-flipflop'ens Q-utgång går dels till Capture-ingången och dels till andra ingången på AND-gaten. Utgången från AND-gaten går till en Timer-ingång som är ställd i pulsräknare-läge.
D-flipflop'ens D, Set & Reset-ingångar styrs av µC'n.
Funktion:
* Frekvensmätning:
--- D sätt till '0', FF'en resets, Capture-enhetem nollas och sätt till att fånga BÅDA flanker och pulsräknaren nollas.
--- När µC'n är klar skickar den en '1' till D-ingången på FF'en.
--- Vid första stigande flank "flippar" Q-utgången till '1', det kommer en startpuls på Capture-enheten och pulsräknaren börjar räkna antal pulser.
--- Efter ett lagom tag skickar µC'n '0' till D-ingången på FF'en, förstkommande stigande flank skickar igenom den '0' och får Capture-enheten att ge ytterligare en interrupt, '0'-an stoppar ytterligare räkning av antalet pulser också.
Nu vet man alltså antalet pulser som har kommit och tiden som dessa har tagit, sedan kan lite matte räkna ut detta väldigt enkelt med mycket bra upplösning.
Vill man kan man ha en valfri prescaler direkt efter införstärkaren, kan man växla den som t.ex. 1:1 eller 1:256 ville detta medge att man kan spänna över ett mycket brett frekvensområde med bra upplösning + snabb utläsning.
Mätningspulsens längd är inte kritisk då man likaväl får rätt tal att räkna på, en vanlig timer duger alltså fint, t.o.m. ett mjukvarustyrd delay skulle duga.
Om man sedan väljer 1:1 i prescaler (om man bygger på det), ställer Set på FF'en till '1' kan man i lägre frekvenser ställa pulsräknaretimern till Capture-mode, fånga båda flanker och då få ut pulsbredd på endera nivå, duty-cycle och vad man annars ids räkna ut. Vill man kan man samla ihop data över ett antal cyklar och ta ett snitt, allt detta styrs av mjukvaran.
Hårdvaran är alltså "hur enkel som helst": ett input-steg (kan ju bli lite knepigt, speciellt vid höga frekvenser), en D-flipflop (kanske 7474), en AND-gate (kanske 74AHC1G08) samt en µC (jag väljer nog Renesas M16C28). Till det kan man lägga en prescaler och logiken för att välja "med eller utan nerdelning".
MEN... noggranheten beror självklart på µC's klocka, där duger det inte med vad som helst. Jag har ett par DS8000 liggande, de finns inte mer men det är TCXO'er på 8MHz med ett antal nollor efter. Ju bättre den klocka är ju bättre mätinstrument har man och jag vill påstå att en TCXO är ett MÅSTE för detta.
Jag har lyckats mäta frekvens på 3 kanaler på nästan detta vis med en 20MHz M16C och upp i närheten av 45kHz på båda kanalerna började det bli lite hackigt... fast jag hade inte D-FF'en med, för varje stigande flank kom det en interrupt då men mjukvaran såg till att mäta över längre tid.
Jag tror därför att detta system borde räcka upp till 8MHz utan prescaler på (eg. bara begränsat av hur snabbt pulsräknaren kan räkna), antal pulser kan ju lätt expanderas från räknarens 16 till 32 bit via overflow-interrupten.
På det vis skulle jag kunde bygga en frekvensmätare som kan klara av kanske 2 kanaler och ha ett frekvensspan från .... ja, riktigt lågt till ett par hundra MHz med fin upplösning hela vägen och snabb utläsning, självklart byter den mätområde automatisk osv.