PIC单片机的定时器2 可以实现PWM功能。
在每一个PWM周期,还可以中断。
利用这个功能,在每个中断中,填写下一个占空比。实现语音播放的功能。
语音用8K, 8BITS的PCM, 一般的WAV文件用微机上自带录音机就可以转换。
把转换后的WAV文件用UltraEdit打开,变成数组放到ROM中。
关于PWM的计算可以上这个网来计算,比较方便。
http://www.microgo.cn/applications/pic-pwm-calculator-code-generator.html
/*
* PWM registers configuration
* Fosc = 41666666.666666664 Hz
* PFpwm = 8037.55 Hz (Requested : 8000 Hz)
* Duty Cycle = 50 %
* Resolution is 10 bits
* Prescaler is 16
* Ensure that your PWM pin is configured as digital output
* this source code is provided 'as is',
* use it at your own risks
*/
PR2 = 0b01010000 ;
T2CON = 0b00000111 ;
***R1L = 0b00101000 ;
***1CON = 0b10011100 ; //10 = 半桥输出:P1A和P1B被调制,带有死区控制
因为需要2个PWM 互补输出,需要把***1COM 改成半桥输出。
E***1DEL = 0X80;// 没有死区
PIR1bits.TMR2IF = 0;
PIE1bits.TMR2IE = 1;
IPR1bits.TMR2IP = 0;
TRISCbits.TRISC2 = 0; // RC2 SET OUTPIN
//在每次中断125US ,把放音数据放入PWM
if ((PIR1bits.TMR2IF)&&(PIE1bits.TMR2IE)) //
{
PIR1bits.TMR2IF = 0;
***R1L = voice_buffer[voice_count];
voice_count ++;
if (voice_count >= sizeof(voice_buffer))voice_count = 0;
}
用硬件来实现还是蛮简单的,直接驱动喇叭音质差,很差。
看来后续的滤波是必不可少的。
如果有做过的朋友希望能提供一个简单实用的电路。
文章评论(0条评论)
登录后参与讨论