历史上的今天
今天是:2024年12月19日(星期四)
2020年12月19日 | 低功耗红外音频功率放大器的设计
2020-12-19 来源:elecfans
本系统采用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


下面是程序流程图

开始 |
进入睡眠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(CCTL1CM0)
{
CCTL1=(CCTL1(~CM0)) | CM1;
start=CCR1; //将跳变为高电平时刻的计数值记下
}
else if (CCTL1CM1)
{
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
}
}
}
史海拾趣
|
VC++ --->> WinCE 的问题(对大家应该不会很难) 在VC中用到了一个类CxImage,编译和链接都没有问题,(*.lib的调用也正常)。但是把程序移植到WinCE中,在链接的时候总是出现这样的错误信息,这是什么原因呢? ximage.obj : error LNK2019: 无法解析的外部符号 \"public: void __cdecl CxImage::S ...… 查看全部问答> |
|
EVC 提示错误 one or more file from the emulator for windows ce is missing.please ret 各位大虾们,帮帮菜鸟吧 刚装EVC,新建一工程编译后没问题,但出现报错 one or more file from the emulator for windows ce is missing.please retinstall emulator for window ce and try again。是什么意思啊?我重装好几次也是这样啊,难道与 ...… 查看全部问答> |
|
怎么从/PROC/DEVICES中得到动态主设备号?脚本怎么样写,应该写在哪个文件里,怎么样在linux启动时运行这个脚本?谢谢! 怎么从/PROC/DEVICES中得到动态主设备号?脚本怎么样写,应该写在哪个文件里,怎么样在linux启动时运行这个脚本?谢谢!… 查看全部问答> |
|
主机和目标机连接不上什么原因??????????????????????????? 初学VXWORKS不太清楚是不是网卡驱动没有加载?ping也ping不通 我用ifShow显示: lo (unit number 0): Flags: (0x8069) UP LOOPBACK MULTICAST ARP RUNNING Type: SOFTWARE_LOOPBACK ...… 查看全部问答> |
|
现在重新测试,同样的板子,程序也一样。 用149一切正常, 换为2418,电流有1.3ma,而且会经常自动重启。。。 郁闷啊。。。。。。。 lierda的工程师们知道为什么吗?… 查看全部问答> |
|
最近正在做玩具智能车,不可避免的要用到单片机的捕获功能。 现想通过MC9S08QG8单片机实现单位时间捕获脉冲次数计数,来计算小车的速度。 问题卡在了捕获功能的实现上。 所用单片机:MC9S08QG8 8位机 实现功能 ...… 查看全部问答> |
|
MSP430 ADC12 使用P6.1没有反应啊!很急啊 谢谢 /********************************************************* 程序功能:将ADC对P6.1端口电压的转换结果按转换数据在液晶上显示 **********************************************************/ #include #include \"allfunc.h\" #include \" ...… 查看全部问答> |
|
箝位放大器 箝位放大器允许设计人员指定高(VCH)和低(VCL)输出箝位电压,以使输出信号箝位在特定电平。与传统的输出箝位器件相比,ADI公司独特的CLAMPIN™输入箝位架构显著改善了箝位性能,箝位区的箝位误差和失真极小。 共模线性化放大器 ...… 查看全部问答> |




