Referència | Trucs | Perifèrics | Recursos CITCEA | |
Tutorial | Exemples | Projectes | Inici |
Amb un altaveu podem aconseguir sons de més qualitat que amb un brunzidor però el circuit serà més complicat. El circuit que presentem està pensat per a petits altaveus, com el de la imatge. Per a altaveus més grossos no tindrà prou potència.
El control de l'altaveu el farem des de la sortida PWM del microcontrolador amb un circuit com el de la figura.
Els elements que intervenen en el circuit, a part de la placa del microcontrolador i l'altaveu, són els següents:
Cal tenir en compte que l'altaveu, el transistor i el díode tenen polaritat i, per tant, cal connectar-los com es mostra a la figura. Si és connecten d'una altra forma podem destruir algun component. Molts dels condensadors de 10 μF no tenen polaritat però altres sí. Si fem servir un condensador amb polaritat cal connectar els signes com s'especifica a la figura.
Al nostre circuit li hem de proporcionar un senyal PWM de la freqüència de la nota desitjada i un temps d'activació proper al 50 %.
La taula següent indica els valors que cal configurar en el PWM (amb una prescala de 16) per obtenir les notes de l'escala central del piano:
Nota | Freqüència teòrica (Hz) | PR2 | CCPR1L | DC1B | Freqüència real (Hz) | |||
do3 | C4 | 261,626 | 238 | 119 | 2 | 261,506 | ||
do#3 | re b3 | C#4 | Db4 | 277,183 | 224 | 112 | 2 | 277,778 |
re3 | D4 | 293,665 | 212 | 106 | 2 | 293,427 | ||
re#3 | mi b3 | D#4 | Eb4 | 311,127 | 200 | 100 | 2 | 310,945 |
mi3 | E4 | 329,628 | 189 | 95 | 0 | 328,947 | ||
fa3 | F4 | 349,228 | 178 | 89 | 2 | 349,162 | ||
fa#3 | sol b3 | F#4 | Gb4 | 369,994 | 168 | 84 | 2 | 369,822 |
sol3 | G4 | 391,995 | 158 | 79 | 2 | 393,082 | ||
sol#3 | la b3 | G#4 | Ab4 | 415,305 | 149 | 75 | 0 | 416,667 |
la3 | A4 | 440,000 | 141 | 71 | 0 | 440,141 | ||
la#3 | si b3 | A#4 | Bb4 | 466,164 | 133 | 67 | 0 | 466,418 |
si3 | B4 | 493,883 | 126 | 63 | 2 | 492,126 | ||
do4 | C5 | 523,251 | 118 | 59 | 2 | 525,210 |
Malauradament, el microcontrolador no té prou precisió i les notes reals tindran una freqüència lleugerament diferent, que és lque s'indica a la darrera columna.
La funció següent toca la nota que se li indica durant 0,2 s i després deixa un silenci de 0,2 s més. Per especificar la nota, cal escriure els valors corresponents a PR2, CCPR1L i DC1B a les respectives variables ValPR2, ValCCPR1L i ValDC1B.
A l'exemple NM la podeu veure en funcionament.
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8 #define _XTAL_FREQ 4000000 // La freqüència del rellotge és 4 MHz
void main (void){ TRISC = 0b00100000; // Definim com volem les E/S del port C // RC5 (sortida del PWM), de moment, com a entrada PORTC = 0; // Desactiva les sortides del port C CCP1CON = 0b00001100; // Configura el PWM, bits P1M (bits 7-6) a 00 mode senzill // DC1B = 11 (bits 5-4) els dos bits de menys pes són 0 // CCP1M = 11xx en mode senzill els bit 0 i 1 no afecten // Ho posa com a configuració del PWM PIR1bits.TMR2IF = 0; // Desactiva el bit d'interrupció del Timer 2 T2CON = 0b00000011; // Configura el Timer 2 // bits T2KCPS (bits 1-0) a 11 prescalat de 16 // bit 2 (TMR2ON) a 0, Timer aturat // Postscaler TOUTPS (bits 6-3) no afecten al PWM ... TocaNota(141, 71, 0); // Valor que correspon aproximadament a 440 Hz (LA3) ...
void TocaNota(char ValPR2, char ValCCPR1L, char ValDC1B) { TRISC = 0b00100000; // Definim com volem les E/S del port C // RC5 (sortida del PWM), de moment, com a entrada PR2 = ValPR2; // Carrega PR2 CCP1CON = CCP1CON & 0b11001111; // Posa a zero els bits que corresponen a DC1B ValDC1B = ValDC1B % 4; // DC1B va de 0 a 3 ValDC1B = ValDC1B * 16; // Desplaça els bits a la posició que els correspon a CCP1CON CCP1CON = CCP1CON | ValDC1B; // Coloca DC1B al seu lloc CCPR1L = ValCCPR1L; // Carrega CCPR1L, registre que ens dona l'amplada de tON PIR1bits.TMR2IF = 0; // Desactiva el bit d'interrupció del Timer 2 T2CON = 0b00000111; // Configura el Timer 2 // bits T2KCPS (bits 1-0) a 11 prescalat de 16 // bit 2 (TMR2ON) a 1, Timer activat // Postscaler TOUTPS (bits 6-3) no afecten al PWM while (PIR1bits.TMR2IF == 0) // Espera l'activació del bit d'interrupció del Timer 2 ; // Esperem TRISC = 0b00000000; // Posem RC5 (sortida del PWM) com a sortida __delay_ms(200); // Retard de 0,2 s TRISC = 0b00100000; // Posem RC5 (sortida del PWM) com a entrada // O sigui, silenci __delay_ms(200); // Retard de 0,2 s }
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.