作者:mtheory
摘要
本系统采用TI的MSP430F2013超低功耗单片机为控制核心,主要是用来作为红外信号的解码和对音频处理芯片的控制。音频处理和功放是采用maxim公司的MAX5406和MAX9763,能够实现对音量、均衡、低音和高音控制。同时系统具有温度保护功能,在芯片温度达到135摄氏度或以上,会自动关机,保护芯片不被烧坏
方案比较设计论证
方案一
采用TDA2030芯片,这种方案耗电大,功能少,故不采用。
方案二
采用MSP430,MAX5406,MAX9763三个芯片,以MSP430超低功耗单片机为控制核心,对MAX5406芯片进行控制,可以实现对系统音量,均衡,低高音,静音,开关机等控制。
实现功能不仅很多,而且系统也保持着非常低的功耗。
系统设计
系统框图如上
各芯片功能介绍
MSP430F2013是TI公司MSP430系列的一款超低功耗微控制器,它具有以下结构特点:16位的RISC CPU、16位的寄存器和常数发生器,可以获得很高的代码效率;五种低功耗模式,在便携式的测量应用中可以延长电池的使用寿命;数控振荡器(DCO)使得从低功耗模式切换到正常模式只要不到1μs;一个16位的定时器;WATCHDOG;10个I/O口;具备同步通信协议(SPI或者I2C);一个16位的Σ-Δ ADC。
MAX9763是立体声或单声3W桥接负载(BTL)音频功率放大器,立体声单端耳机放大器,同时也包含了耳机感应电路和一个2:1输入复用器。该系列器件采用4.5V至5.5V单电源工作,具有业界顶级的100dB电源抑制比,无需另加线性调节器就可直接使用充满噪声的电源工作。0.002%的超低THD+N确保对音频信号进行高保真放大。专有的咔嗒和噼噗声抑制技术可消除上电、断电时出现的杂音。节能方面的特性包括:低至4mV的VOS (最大限度减小了通过扬声器直流电流),消耗电源电流仅为13mA,关断模式下耗电仅10µA。MUTE (静音)功能能快速地打开或关闭输出。耳机感应电路可检测到耳机的接入,并自动将放大器配置为扬声器或耳机模式。在扬声器模式下,放大器可持续地向一个3 负载提供最高达3W的平均功率。在耳机模式下,放大器则可持续地向一个16 负载提供最高达200mW的平均功率。放大器的增益在外部设定,便于对给定负载提供最优化的输出电平。此组放大器还具有一个2:1的输入复用器,可实现多音频源之间的选择切换。还可以利用复用器,通过选择外部均衡网络,实现对扬声器有限的频响进行补偿。对各种功能的控制可以通过一个简单并行控制接口来完成。
下面是音频功放模块的电路图和PCB
MAX5406是一个立体声音频处理器它能够实现音量、均衡、音质、Ambience、静音、低音、高音、重低音、伪立体声控制。该器件具有双路32抽头对数数字电位器,用于音量控制,双路数字电位器,用于均衡控制,线性数字电位器用于音质控制。通过一个简单的去抖按钮接口控制所有功能。每一次按钮按下,MAX5406会改变其滑动端的设置。Maxim公司专有的SmartWiper™技术无需微控制器(µC)即可提高滑动端的变化速率。如果保持控制输入为低的时间大于1s,则滑动端以4Hz的速率变化,若保持4s,则滑动端的变化速率增至16Hz。内置的咔哒/噼噗声抑制功能可以消除抽头跳变时出现的杂音。 MAX5406具有亚低音输出,内部混合左右声道的信号。外置滤波电容允许客户自行调整亚低音输出的截止频率。低音提升模式增强了左右声道的低频响应性能。内置的偏置放大器可生成所需的(VDD + VSS) / 2偏置电压,无需外部运算放大器即可实现单极性工作。 MAX5406还具有ambience控制功能,可增强耳机和台式机扬声器的左右声道输出的隔离度;同时还具有伪立体声特性,可使单声信号接近立体声效果。
下面是音频处理系统电路图和PCB
下面是程序流程图
否 是
附部分源代码:
#include
#include "ir_decode.h"
void Init_CLK(void);
unsigned int start;
unsigned int end ;
unsigned char ir_code;
unsigned char ir_systemcode;
unsigned char ir_repeat_num;
unsigned int ir_repeat = 0;
unsigned int ir_enable = 0;
static unsigned char ir_count = 0;
static unsigned int ir_pulse_width;
static union ir_code
{
unsigned char data8[4];
unsigned long int data32;
}ir;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1SEL |= BIT2; //set P1.2 CCI1 input
Init_CLK(); //init clock
ir_pulse_width=end -start ;
_BIS_SR(LPM4_bits + GIE); // Enter LPM4 w/interrupt
}
void Init_CLK(void)
{
unsigned int i;
BCSCTL1 = 0X00; //将寄存器的内容清零
//XT2震荡器开启
//LFTX1工作在低频模式
//ACLK的分频因子为1
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1
BCSCTL2 = 0X00; //将寄存器的内容清零
BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
TACTL = TASSEL_2 + MC1 + ID_3 + TACLR; // SMCLK, up mode ,八分频
P1SEL =BIT2; //P1.2设置成功能模块
CCTL1 =CM0+SCS+CAP+CCIE; //上升沿捕获+同步捕获
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
switch (TAIV)
{
case 2:
if(CCTL1&CM0)
{
CCTL1=(CCTL1&(~CM0)) | CM1;
start=CCR1; //将跳变为高电平时刻的计数值记下
}
else if (CCTL1&CM1)
{
CCTL1=(CCTL1&(~CM1)) | CM0;
end=CCR1; //将跳变为低电平时刻的计数值记下
TACTL |=TACLR; //将计数器清零
}
if(ir_count > 32)
{
ir_count = 0;
return; //遥控第一次下降沿中断
}
//////////////////////////////////////////////////
if(ir_count == 0)
{
if((ir_pulse_width > (13500-RANGE)) && (ir_pulse_width < (13500+RANGE)))
{
// ir_repeat = 0;//连续码
ir_count++;
return;//成功测到红外头,加1退出中断
}
if((ir_pulse_width > (11250-RANGE)) && (ir_pulse_width < (11250+RANGE)))
{
ir_repeat = 1;//连续码
ir_succeed();
return;
}
ir_count = 33;
return;//没有测到正确红外头,清0退出中断
}
//////////////////////////////////////////////////
else
{
if((ir_pulse_width > (1125-RANGE)) && (ir_pulse_width < (1125+RANGE)))
{
ir.data32 >>= 1;
if(ir_count == 32)ir_succeed();
ir_count++;
return;//读到0退出中断
}
if((ir_pulse_width > (2250-RANGE)) && (ir_pulse_width < (2250+RANGE)))
{
ir.data32 >>= 1;
ir.data32 |= 0x80000000;
if(ir_count == 32)ir_succeed();
ir_count++;
return;//读到1退出中断
}
ir_count = 33;
return;//错误,清0退出中断
}
}
}
void ir_succeed()
{
if(1)//(IR_SYSCODE1 == *(ir.data8 + 3)) && (IR_SYSCODE2 == *(ir.data8 + 2)))
{
if(*ir.data8 == ~(*(ir.data8 + 1)))
{
ir_code = *(ir.data8 + 1);
ir_systemcode = *(ir.data8 + 3);
ir_enable = 1;
if(ir_repeat)ir_repeat = 0;
else ir_repeat_num = 0;//连续码计数清0
}
}
}
|