分体式_DTS解码&卡拉OK功放的设计与制作(参赛)(4)
时间:2012-09-21 19:46 来源:hifidiy.net论坛 作者:ysd85 点击:次
喇叭保护电路需要直流12V电源,直接使用400W环形变压器附带的交流12V经过整流滤波后得到,此时要注意滤波电容不能太大(也就是说不能有太高的储能),这样关机时能马上去点,使得继电器能马上断开。由于LM3886自带了比较完善的保护功能,所以本机只在BTL放大部分加入了保护电路。 喇叭保护电路参考了论坛里三极管搭接方式,直接使用万能板制作,此处不在详细电路,各位可以搜一下相关资料,如有问题,下次再另做说明,实际按装完效果如图: ![]() 硬件电路设计制作好后,可以先对各个模块进行单独调试,此时要注意不同模块之间的电平幅度,调试时可以通过电脑输出一个额定幅度的信号,在每一级的输出端用示波器查看波形完整性以及电平幅度。如果发现过高或过低,则可以更改相应的匹配衰减电阻,最终要使得5个通道的放大倍数是一致的(这是多声到功放制作中极为重要的一点),而且要保证在DAC输出最大幅度时,最末端输出的波形不失真。 ===软件设计=== 系统采用通用C51单片机作为主控制平台,通过按键和红外遥控接收用户指令,并控制相应的功能模块进行工作。 软件设计占了系统工作量的很大一部分,由于C51单片机为单线程处理器,所以设计设计过程中最大程度的利用了中断处理环节,从另一种意义而言,相当于增加了操作线程。 本机采用了多级采单显示控制方法,这对于单片机的速度来说,具有一定的难度,所以软件处理时,对每一个菜单状态分配一个相应的ID号,而且把这些ID号与键值相联系组成一个结构体,这样只需要知道当前的ID和键值就能查询到新的ID,很大程度上简化了处理器的操作任务。 所以,系统的工作流程框图可以简化成下图所示: ![]() 和硬件设计一样,软件部分也按模块进行分类,将复杂的控制程序逐个完成;在此把整个软件按功能划分为:DTS解码控制模块,卡拉OK控制模块,音量调节模块,时钟处理模块、LCD显示控制和按键遥控器识别处理等6个部分。 虽然划分的模块较多,但其底层的通信协议却有很大的相似性,均为三线或两线串行数据传输协议,所以本文只以卡拉OK模块(M65856)的数据传输协议以及脉冲编码电位器的识别加以举例说明(为了减少篇幅,大家都不太喜欢看长篇 ![]() M65856数据通信: M65856卡拉OK混响芯片采用三线串行通信模式,分别为:Latch(加载锁定)、Clock(同步时钟)、Data(数据)三个IO口。按照规格书说明及通信时序图可知,要正确传输16位数据应该遵循的操作要点为: a. 将Latch信号置为低电平 b. 将Clock信号置为低电平,根据当前位的设置Data的电平状态,将Clock置为高电平,这样就把当前位压入寄存器缓存区,循环操作16次。 c. 将Latch信号置为高电平,执行此操作后,缓冲区中的最后16位数据将被锁存加载到M65856的控制积存器中,一个16位数据的传输完成。 ![]() 数据传输的程序段如下: #define SET_HIGH(x) x = 1 #define CLEAR_LOW(x) x = 0 ..... sbit karaOK_STB = P2^6; sbit karaOK_CLK = P0^6; sbit karaOK_DAT = P0^0; ..... void KaraOK_SendData(U16 data) { U8 icount = 0; CLEAR_LOW(karaOK_STB); for(icount=0;icount<16;icount++) { CLEAR_LOW(karaOK_CLK); karaOK_DAT = data&0x0001; SET_HIGH(karaOK_CLK); data>>=1; } SET_HIGH(karaOK_STB); } ...... 脉冲旋转电位器的识别: 现在比较通用的脉冲电位器有5个引脚:4,5两个引脚用于电位器被按下时的识别,1,2,3三个引脚则用于左右旋转的识别;识别左右旋转的方法比较多,但本质原理都是利用电位器内部长短不一的金属触片,在旋转时三个引脚内部相互接触的先后顺序不一样来进行判断。 下面是本设计中使用的方法,简单有效: 将1脚接GND,其余两脚通过上拉电阻到VCC,并作为数据接口连接到MCU,通过示波器可以得到电位器正反转时2,3脚的波形: ![]() 由波形时序,我们可以发现: 1. 向右旋转,当Pin2变为低电平时,Pin3也为低电平 2. 向左旋转,当Pin2变位低电平时,在一段时间内,Pin3仍保持为高电平 所以在程序处理时,只需要查询Pin2脚的状态作为触发标志,当Pin2出现低电平,立即检测Pin3脚状态,如果Pin3为高电平,则表示电位器左转,否则为右转。 实际编写的程序代码段如下: #define KEY_LEFT 0xf0 #define KEY_RIGHT 0x0f sbit key_A = P2^0; sbit key_B = P2^1; static unsigned char key_code =0x00; void main(void) { IT1 = 0; EX1 = 1; EA = 1; while(1) { ; /*main function*/ } } void EX1_Int1() interrupt 2 { EX1 = 0; if(key_A) { key_code = 0x00; } else { _nop(); _nop(); _nop(); if(key_B) { key_code = KEY_LEFT; } else { key_code = KEY_RIGHT; } (责任编辑:admin) |