今天是: <%response.write formatdatetime(date(),1)%> 电子制作天地网站欢迎您的光临,欢迎提出宝贵意见或建议。本站信息产业部备案: 粤ICP备05114582号
 
低功耗红外音频功率放大器
Low-power infrared remote control Audio Amplifier

时间:2011-3-2 22:25:11 来源:互联网 作者:不详 编辑: 【关闭


作者:mtheory

摘要
本系统采用TI的MSP430F2013超低功耗单片机为控制核心,主要是用来作为红外信号的解码和对音频处理芯片的控制。音频处理和功放是采用maxim公司的MAX5406和MAX9763,能够实现对音量、均衡、低音和高音控制。同时系统具有温度保护功能,在芯片温度达到135摄氏度或以上,会自动关机,保护芯片不被烧坏
 
方案比较设计论证
方案一
采用TDA2030芯片,这种方案耗电大,功能少,故不采用。
方案二
采用MSP430,MAX5406,MAX9763三个芯片,以MSP430超低功耗单片机为控制核心,对MAX5406芯片进行控制,可以实现对系统音量,均衡,低高音,静音,开关机等控制。
实现功能不仅很多,而且系统也保持着非常低的功耗。
 
系统设计
低功耗红外音频功率放大器Low-power infrared remote control Audio Amplifier
系统框图如上
 
各芯片功能介绍
MSP430F2013是TI公司MSP430系列的一款超低功耗微控制器,它具有以下结构特点:16位的RISC CPU、16位的寄存器和常数发生器,可以获得很高的代码效率;五种低功耗模式,在便携式的测量应用中可以延长电池的使用寿命;数控振荡器(DCO)使得从低功耗模式切换到正常模式只要不到1μs;一个16位的定时器;WATCHDOG;10个I/O口;具备同步通信协议(SPI或者I2C);一个16位的Σ-Δ ADC。
低功耗红外音频功率放大器Low-power infrared remote control Audio Amplifier
 
 
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
低功耗红外音频功率放大器Low-power infrared remote control Audio Amplifier
 
低功耗红外音频功率放大器Low-power infrared remote control Audio Amplifier
MAX5406是一个立体声音频处理器它能够实现音量、均衡、音质、Ambience、静音、低音、高音、重低音、伪立体声控制。该器件具有双路32抽头对数数字电位器,用于音量控制,双路数字电位器,用于均衡控制,线性数字电位器用于音质控制。通过一个简单的去抖按钮接口控制所有功能。每一次按钮按下,MAX5406会改变其滑动端的设置。Maxim公司专有的SmartWiper™技术无需微控制器(µC)即可提高滑动端的变化速率。如果保持控制输入为低的时间大于1s,则滑动端以4Hz的速率变化,若保持4s,则滑动端的变化速率增至16Hz。内置的咔哒/噼噗声抑制功能可以消除抽头跳变时出现的杂音。 MAX5406具有亚低音输出,内部混合左右声道的信号。外置滤波电容允许客户自行调整亚低音输出的截止频率。低音提升模式增强了左右声道的低频响应性能。内置的偏置放大器可生成所需的(VDD + VSS) / 2偏置电压,无需外部运算放大器即可实现单极性工作。 MAX5406还具有ambience控制功能,可增强耳机和台式机扬声器的左右声道输出的隔离度;同时还具有伪立体声特性,可使单声信号接近立体声效果。
下面是音频处理系统电路图和PCB
低功耗红外音频功率放大器Low-power infrared remote control Audio Amplifier
 
低功耗红外音频功率放大器Low-power infrared remote control Audio Amplifier
下面是程序流程图

低功耗红外音频功率放大器Low-power infrared remote control Audio Amplifier

开始

进入睡眠LPM模式

接收到红外信号

I/O口实现相应反转

解码,判断编码是否正确
 

 
 

否                                 是 
附部分源代码:
 
#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
              }
       }
}
 
 

◆相关文章◆
◆ 编辑推荐 ◆
用户:
更多评论
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。60个字以内
留言:
验证码:
 
 
 

免责声明:
●本站所有内容均来自网络,以学习为目的,如果侵犯了您的利益,请来信告知,立即删除,站长邮件为"diy+dzdiy.com",请将"+"变更为"@"
●电子制作存在风险,请注意人身安全,如果您在根据本站电路进行制作过程中发生伤害,本站不负任何责任。

版权所有:www.dzdiy.com © 2001-2019 本站信息产业部备案: 粤ICP备05114582号