[AVR32] Frekvensräknare i C

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Pragmatiker
Inlägg: 19
Blev medlem: 5 februari 2012, 11:55:17

[AVR32] Frekvensräknare i C

Inlägg av Pragmatiker »

Hej!
Jag är lite grön på det här med analog elektronik + digital elektronik, så om jag uttrycker mig fel eller otydligt så säg gärna till.

Nu är det så att jag försöker lösa en labb, vi ska skicka in en sinusvåg i en avr32 mcu (EVK1100 utvecklingskort) för att sedan mäta frekvensen på den.
Den här sortens problem är inget jag är van vid, har mest kodat objektorienterat så jag känner mig lite lost.
Jag har i alla fall lyckats få igång ADC'n och har kunnat mäta likspänningar.

Nu försöker jag hitta på någon slags algoritm för att räkna ut frekvensen på en sinusvåg och jag har tänkt att göra följande:

1 Hitta max amplitud genom att mäta x antal gånger, jämföra med föregående max värde spara det värde som är högst.
2 Räkna hur många gånger max amplitud förekommer under en sekund, detta skulle då bli frekvensen på signalen.

Jag kan passa på att tillägga att signalen aldrig kommer att ändra frekvens eller amplitud medan man mäter den.
Det är en ren sinusvåg på 10kHz,2V p-p och med en DC offset av 1V.

Så vad tror ni, kommer detta att fungera eller finns det något bättre sätt? All form av feedback uppskattas.
Användarvisningsbild
vojnik
Inlägg: 106
Blev medlem: 9 november 2008, 17:50:19
Ort: Jönköping

Re: [AVR32] Frekvensräknare i C

Inlägg av vojnik »

Genom att ta tiden mellan nollspänningspasseringarna kan du även mäta på fyrkantssignaler.

Ett annat alternativ är att skicka in signalen i en FFT.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: [AVR32] Frekvensräknare i C

Inlägg av Icecap »

Om det ska lösas med AD-omvandlaren måste det samplas men minst den dubbla hastigheten (men helst mer) för att ens kunde se signalen. Det räcker med 8 bit om det hjälper något.

Sedan måste signalen behandlas och då AD-omvandlingen bör ske med en känd frekvens kan man relativt enkelt räkna att ett visst antal perioder tar en viss tid (antal samples) och då räkna fram frekvensen.

Men om alla trick är tillåtna ville det vara ett bättre sätt att använda en Capture-enhet som triggas av in-signalen. Dock kanske in-signalen måste förstärkas till rena digitala nivåer.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [AVR32] Frekvensräknare i C

Inlägg av sodjan »

Eller fånga nollgenomgångrna via en av komparatorerna (det har
väl även PIC32 !?). Om man AC kopplar (och klipper överspännngar)
signalen kan man få det att fungera över ett lite större aplitudintervall.
Komparator utgången borde gå att köra in i counter/capture logiken.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: [AVR32] Frekvensräknare i C

Inlägg av Icecap »

Helt sant - men det står AVR32...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [AVR32] Frekvensräknare i C

Inlägg av sodjan »

Aj fan... :-)
Men det gäller fortfarande om det finns komparatorer...
Nerre
Inlägg: 27234
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: [AVR32] Frekvensräknare i C

Inlägg av Nerre »

Som jag tolkar TS är det programmeringen som är det kluriga.

Det finns två sätt att få fram frekvensen:

1. Räkna antalet perioder på en viss tid
2. Mäta avståndet mellan två perioder (inversen av frekvensen är ju periodtiden, f=1/T)

Om signalens amplitud varierar lite grann är det direkt olämpligt att använda topparna för mätningen, risken finns att du missar en del toppar. Som flera har antytt är det vettigare att titta på nollgenomgången. Om signalen inte är symmetrisk kring noll så man man antingen filtrera bort DC-komponenten med hårdvara (en kondensator i serie) eller mjukvara (där vet jag inte hur man gör enklast, men den handlar ju om en normalisering bara egentligen).

Att läsa in A/D-värden till en array och "signalbehandla" är nog inte den mest optimala lösningen, men om frågeställningen främst handlar om programmeringsuppgiften skulle jag nog göra så.

Annars är det antagligen enklare att göra en nollgenomgångsdetektor i hårdvara och använda interrupt för att mäta tiden mellan nollgenomgångar.
Pragmatiker
Inlägg: 19
Blev medlem: 5 februari 2012, 11:55:17

Re: [AVR32] Frekvensräknare i C

Inlägg av Pragmatiker »

Hej och tack för alla svar.

Uppgiften som jag håller på med går ut på att vi ska lära oss att använda en ADC, så det är ett krav att vi ska sampla med den ADC som sitter i MCU och sedan med denna data räkna ut frekvensen.

FFT har jag varit inne på men jag kan ingenting om signalteori så det är rena rama grekiskan för mig.

Fler av er har nämnt att jag ska mäta vid nollgenomgång, men det är ett nytt begrepp för mig så jag vet helt ärligt inte vad som menas med det.
Ska söka lite på nollgenomgång på google, men om någon har tid och lust för att förklara detta så skadar det inte :)

Uppgiften måste lösas helt i mjukvara så jag kan ej använda mig av någon extern elektronik.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: [AVR32] Frekvensräknare i C

Inlägg av Icecap »

OK, då är första steg att AD-omvandlaren tuggar på i minst den dubbla hastighet av frekvensen som ska mätas. Du ska mäta 10kHz, vad kan du skrämma upp AD-omvandlaren till?

Sedan kan programmet ta hand om "nollgenomgången" vid att kolla <är detta värde lägre än det förra?>
Är svaret ja har du en fallande flanka och första ja är "nollgenomgången".

Sedan är det bara att räkna antal sampels och antal nollgenomgångar över en rimlig tid och du har ratio. Då AD-hastigheten ska vara känd kan du då enkelt räkna ut frekvensen.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: [AVR32] Frekvensräknare i C

Inlägg av jesse »

>och första ja är "nollgenomgången".

nja... första 'ja' kommer väl precis efter toppen.

jag ser ett par problem:

om det finns brus på ingången (det gör det alltid) så innebär det att du kan ha riktig otur och detektera två 'nollgenomgångar' precis efter varandra... jag skulle vilja föreslå någon form av schmitt-trigger funktion (fast i mjukvara då, eftersom ni skulle använda ADC).

Denna funktion kan du göra t.ex. så här:

1) mät ett antal värden ett tag. spara högsta och lägsta.
2) halvera de insamlade max- och min - värdena
3) använd det halva max-värdet som gränsvärde för 'positiv' och det halva min-värdet för 'negativ'.

4) mätning: en positiv följd av en negativ betyder en period.
5) räkna antalet perioder under en sekund.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: [AVR32] Frekvensräknare i C

Inlägg av Icecap »

jesse: helt rätt men TS har ännu inte berättat vilken samplingshastighet AD-omvandlaren kan skrämmas upp till, worst case är att den kan sampla med 20kHz och redan då blir det stora problem med antialiasing. Men har man sampler nog är det sätt du beskriver helt säkert det rätta.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: [AVR32] Frekvensräknare i C

Inlägg av bearing »

Verkar inte rimligt att ADC i AVR32 har så låg samplingshastighet som 20kSPS. ADC i de små ATtiny klarar ca 75kSPS. ADC i XMEGA klarar 200kSPS alternativt 2MSPS.
Användarvisningsbild
Icecap
Inlägg: 26651
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: [AVR32] Frekvensräknare i C

Inlägg av Icecap »

Det må vara så men TS har inte angivit ytterligare data, alltså är det svårt att kommentera ytterligare. Det kan ju vara något sunkigt skol-kit som kör på 50Hz för att eleverna ska hinna med, vad vet jag?
nifelheim
Den första
Inlägg: 2490
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: [AVR32] Frekvensräknare i C

Inlägg av nifelheim »

edit: mitt dåliga minne refererade till DAC

kollade vad databladet sa om ADC:
8 bitar
Throughput Rate ADC Clock = 8 MHz 533 kSPS
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: [AVR32] Frekvensräknare i C

Inlägg av Swech »

EVK1100 utvecklingskort står det i först posten
Vi kan väl rimligen anta att uppgiften går att lösa på befintlig utrustning.

10kHz,2V p-p och med en DC offset av 1V.

1. Mät och ta reda på min och max (ungefärligt värde)
Om vi för enkelheten räknar med 1 på adn motsvarat 0.01V
Värdet pendlar mellan 100 (1.00V) och 300 (3.00V)
Differens -> 300-100 = 200
Dela den med 4 då får vi
Min + diff 1/4 -> 150
max - diff 1/4 -> 250

2. Starta en timer och sampla samtidigt med ADn
Nollställ räknare
Om ad < 150 så sätt flagga
om ad > 250 och flaggan är satt så
räknare = räknare +1
flagga = 0
upprepa tills räknare = 10.000
stoppa timer och räkna ut frekvensen
Du har nu samplat 10.000 perioder under en tid uppmätt av din timer.

På detta sätt så får du inte så hysteriska krav på samplingshastigheten
Swech

ÄÄÄH det är ju i princip samma som Jesses förslag.. :doh:
Skriv svar