Programació en C del PIC 16F690

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

Altaveu

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.

Altaveu

El control de l'altaveu el farem des de la sortida PWM del microcontrolador amb un circuit com el de la figura.

Altaveu

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:

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
}

 

 

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