Frekvensmätning med PIC18 ?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Frekvensmätning med PIC18 ?

Inlägg av JimmyAndersson »

*PIC18LF2320, 40MHz*

Ungefär som rubriken lyder:

Jag skulle vilja mäta frekvensen på en ton med en PIC.
Vill mäta frekvenser mellan 300Hz och 4kHz. Varje mätning får göras så snabbt det går, men max med 500ms mellanrum mellan mätningarna.

Är det möjligt? :)
Ungefär hur gör man?
Användarvisningsbild
lgrfbs
Inlägg: 7310
Blev medlem: 28 januari 2005, 15:48:53
Ort: X-län
Kontakt:

Inlägg av lgrfbs »

Tycker att det varkar vara ett jobb för AD ovandling.
Idé terori:
Kolla AD värdet 100 gånger
Räkna ut medelvärdet
klart
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

Tja! Du skulle ju även kunna använda de digitala ingångarna om man förutsätter att en period varierar mellan c.a. 0V och 5V.

När sinusvågen (eller vad du nu har för insignal) stiger över gränsvärdet för en 1:a på t.ex. RA1 på PORTA så sätter du det som en period i en variabel och plussar sedan på med 1 varje gång RA1 skiftar från 0 till 1.

Sedan är det bara räkna pulserna över en viss tidsperiod, säg 10ms, och sedan multiplicera resultatet med 100 (eftersom 10ms går 100 ggr i en sekund), så får du frekvensen i Hz.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kör en timer som "counter".
Det är det den är till för...
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Bra tips!
Nu har jag lite att jobba med. Tack!
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Om tonen är enkel som sinus eller fyrkantvåg så går det bra att göra som grabbarna ovan beskriver.
Men toner från div musikinstrumet svänger mer komplicerat och passerar ofta 0 fler än 2 gånger/period.
Värsta tänkbara är att mäta frekvensen på en röst (kan passera 0 typ 16gr/period).
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Hur skulle man då göra för att mäta en ton från tex en gitarr? Hur funkar en vanlig stämmapparat?

Två toner från min aukustiska gitarr, E och A:
Bild
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Ja, den övre ljudkurvan passerar 0 8gr/period.
Och den har 2 toppar/period som är lika höga.

Jag skulle åxo vilja veta hur en stämmapparat fungerar.
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Tanken är just att bygga en stämmapparat. :)
Sedan kan man använda samma frekvensmätning till att bygga en MIDI-gitarr.

Tänker högt:
Men om man komprimerar ljudet och låter det passera en schmitt-trigger så det blir mer fyrkantvåg? Den kurvan borde bli lik en pwm-signal...
Bara en tanke som sagt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Den har väll ett antal (6 t.ex) smala notch filter för de olika
tonerna (=strängarna). Andra frekvenser är ju helt ointressanta...

Om det är en (ren) sinus som Jimmy vill mäta så får man väll
förstärka och klippa.
sm5uiu
Inlägg: 14
Blev medlem: 8 mars 2005, 23:29:01

Inlägg av sm5uiu »

Frekvensmätning utförs enkelt (vid låga frekvenser) med den inbyggda komparatorn. Annars får man använda en pic timer som klockas externt. Till denna krävs dock (om du inte har logiska nivåer) en liten förstärkare som driver insignalen till saturation.

73 de Sam
Användarvisningsbild
Henrik
Inlägg: 661
Blev medlem: 26 maj 2003, 23:39:14
Ort: Göteborg
Kontakt:

Inlägg av Henrik »

Hur vore det att sampla med a/d, för att sedan göra fft (fast fourier transform) på signalen?
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

FFT funkar ju faktist på en PIC18, men prestandan är begränsad. Frågan är om det går att göra det snabbt nog för att på ett spektrum runt kilohertzen.

http://www.microchip.com/stellent/idcpl ... e=en011084

Kolla in den här:
http://www.circuitcellar.com/library/pr ... oste98.pdf
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7464
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Skall Du stämma ett instrument är det enklaste att alstra rätt ton och sedan nollsväva strängen mot denna. Mycket enklare än att läsa av fladdrande siffror.
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1652
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Inlägg av RDX* »

vanlig FFT ger väldigt dålig upplösning i dessa sammanhang.

Det du ska använda dig av är autokorrelation eller AMDF (average magnitude difference function).

Autokorrelationen beräknar du genom:
Ryy(l)=sum( r(k) *r(k+l) ) där k är vektorindex och l är en förskjutning
Ryy kommer ge en vekor med korreketionen mellen signalen och signalen själv med en förkjutning. Detta innebär att du kommer få ett maximum vid den förskjutning som motsvarar din pitch.

En troligtviss bättre metod är AMDF som jobbar med differenser i stället.
AMDF(l)=sum( r(k) - r(k+l) ) där k är vektorindex och l är en förskjutning

AMDF fungerar på nästan samma sätt men nu får du ett minimum istället för et max. AMDF är lite lättare att tänka hur den fungerar.
om du har en period på 20 sample så kommer du få AMDF(20) = r(k) -r(k+20). Efter som du är inne på en ny period nu så kommer du att få noll (idealt). Jag har själv testat AMDF i både matlab och i en DSP, och det fungerar bra. Säg bara till om du vill ha mer förklarat eller vill ha matlab-filer på AMDF/autokorr.
Skriv svar