Programació en C del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Sonòmetre digital

En aquest projecte volem veure el nivell de so i visualitzar-lo en una pantalla o de la manera que cada grup estimi més apropiada.

Farem servir el sensor de so. Els valors llegits al sensor poden anar de 0 a 1023. Si no hi ha so, el valor llegit serà 512.

Una manera senzilla però prou adequada seria fer un cert nombre de lectures amb el sensor i treure'n la mitjana. L'ona de so, probablement, no serà simètrica però la seva mitjana sí estarà al voltant del zero i, per tant, si fem la mitjana dels valors llegits pel sensor obtindrem un resultat proper a 512. Ens convindrà, doncs, calcular el valor mig rectificat. Per fer-ho, hem de restar el 512 per a que la mitjana teòrica estigui al zero, treure el valor absolut dels valors i trobar-ne la mitjana. Encara que el càlcul teòric és aquest, anem a mirar d'obtenir el resultat d'una manera més senzilla.

Si la lectura en un punt correspon a un valor positiu de senyal resultarà que la lectura serà més gran o igual que 512 i caldria restar-li 512 per tenir el valor correcte. Si, en canvi, la lectura correspon a un valor negatiu resultarà que la lectura serà menor de 512; en aquest cas, per obtenir el valor absolut, cal restar la lectura de 512. Per fer la mitjana podríem llegir un nombre determinat de valors i guardar-los (com es fa en el programa de mostra del sensor de so) però necessitem guardar dos bytes per a cada lectura i no disposem d'una gran quantitat de memòria. Probablement és millor anar sumant les lectures i, a l'acabar, dividir pel nombre total de lectures per obtenir la mitjana.

Si abans d'anar sumant ja trobem el valor mig rectificat (com hem explicat més amunt), cada valor sumat estarà entre 0 i 511 (ocuparà nou bits que haurem de guardar en dos bytes). Si sumem un nombre de valors inferior o igual a 128 ens caldran només dos bytes (o sigui, ens serveix un unsigned int) per guardar el resultat de la suma.

L'oïda humana capta sons entre 20 Hz i 20 kHz. Si volguéssim obtenir una mitjana representativa de totes les freqüències caldria fer lectures durant un temps de 50 ms per assegurar que hem agafat un període complet de la freqüència més petita (20 Hz). Per un altre costat, convindria agafar un mínim de dos punts per període a totes les freqüències que, en el cas de la més gran (20 kHz), ens obliga a fer una mesura cada 25 μs. Si intentem fer això, serà necessari prendre 2000 lectures cada 25 μs. A l'hora de la veritat, però, no podrem fer una lectura del conversor, obtenir-ne el valor mig rectificat i afegir-lo a la suma en menys de 25 μs i, per tant, haurem de triar una solució de compromís fent un nombre de lectures raonable amb una periodicitat factible.

Una ona de so pot tenir uns màxims molt acusats però de durada molt curta. Una manera molt millor de mesurar el nivell del so és calcular el seu valor eficaç o RMS normalitzat. Per calcular el valor eficaç normalitzat necessitem calcular primer la mitjana:

Mitjana

I després calcularem el valor eficaç de la resta entre cada valor i la mitjana per tal que els valors estiguin normalitzats (centrats en el zero):

Valor eficaç

No és fàcil, però guardar gaires valors ja que només disposem de 256 bytes de memòria de dades. Podem mirar, però, de simplificar una mica el mètode. Si suposem que la mitjana de les lectures és 512 no només ens estalviem de calcular la mitjana sinó que, a més, podem anar fent el sumatori mentre anem fent les lectures. Si fem servir aquest mètode, cada cop que llegim un valor li restarem 512, l'elevarem al quadrat i anirem afegint el resultat a la variable que emmagatzema la suma. Així, a l'acabar la lectura només faltarà fer la divisió i l'arrel quadrada. Suposem que els valors que anem llegint tenen un format unsigned int. Cada valor estarà entre -511 i +511. A l'elevar-los al quadrat tindrem resultats que aniran de 0 a 262143 (que requereixen 18 bits). Això vol dir que amb una variable de tipus long en tenim prou per guardar la suma de quadrats de fins a 8192 valors llegits. Cal tenir en compte, però, que l'arrel quadrada és una funció que fa servir variables float i, per tant, en algun moment haurem de convertir els valors a float.

A continuació posarem els programes realitzats pels grups. Estan tal com els han deixat i tenint present que no els va donar temps de simplificar-los o millorar-los. També pot ser que hi hagi errades ortogràfiques.

Programa del grup 1

Programa del grup 2

Programa del grup 3

Programa del grup 4

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.