Programació en C del PIC 16F690 amb PICkit 2

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

Brunzidor piezoelèctric

Un brunzidor piezoelèctric és un element capaç de generar un so d'una determinada freqüència quan se l'alimenta amb un senyal PWM de la freqüència desitjada. En el nostre cas emprem un brunzidor CUI o un CAF4. El connexionat és molt simple. Només cal connectar el positiu del brunzidor a la sortida PWM (RC5) i el negatiu a la pota VSS (negatiu de l'alimentació).

El PWM ha de tenir la freqüència de la nota desitjada i un temps d'activació proper al 50 %.

Els brunzidors són elements petits i molt senzills de fer servir però el seu so no és de gaire qualitat. Si volem un so més agradable, podem emprar un altaveu.

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 la que 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, CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#include "pic16f690.h"				// Carrega el fitxer d'adreces i paràmetres del PIC 16F690
#include <xc.h>					// Carrega el fitxer de funcions
#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
	CCPR1L = 49;				// Valor que correspon a un cicle del 35 % a 440 Hz
						// Registre que ens dóna l'amplada de tON
	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 dóna 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
}

 

 

Licencia de Creative Commons
This obra by Oriol Boix is licensed under a Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported License.