论文部分内容阅读
(接上期)
完成了上面那些基本设计以后,我们就开始了电路结构的设计,首先要做的部分就是有关CS3310芯片的周边电路:根据PDF文档,画出这一部分的原理图:
简单的介绍一下原理图中各个元件的用途:电容主要用于电源滤波,大容量的电容用于减少电源产生的交流声,而小容量电容用于屏蔽机箱内部的高频干扰。10omh电阻用于过零检测,防止CS3310内部的电阻改变的时候发生咔嗒声。1k的电阻用于上拉电阻,使 CS3310的MUTE引脚始终处于高电平状态,只有打开接地开关后,该引脚才能处于低电平(也就是禁音状态,根据PDF文档,该引脚低电平的时候,系统处于禁音状态)。两头的两个连接器用来串联下一个CS3310或输入控制信号。根据这一部分的电路,我们就可以开始布线做出电路板的设计:
电路板的左边是数字电路部分,所以使用了比较细的连接线,减少高频信号的辐射。而电路板的右边是模拟部分,所以线路比较粗,可以改善声音信号的传送质量。用于过滤高频干扰信号的小电容离CS3310主芯片都非常的近,这一点相当重要,否则电流在流入CS3310之前会受到严重的高频污染,产生不必要的高频噪音。所以在可能的情况下,这些小电容越接近CS3310越好。布线的时候还需要注意的事情就是,模拟部分的两个通道(平衡输入的冷端和热端或者是左右通道)的线路长度和零件分布最好完全相同,否则会出现两个通道不对称的问题(例如左右声道的信噪比不相同)。
由于是模块化设计:所以单片机控制部分和CS3310不在同一块电路板上,这样可以有效的避免数字部分的高频电路干扰模拟部分(如果发生了这样的干扰,一般特点是高频有嘶嘶声。RMAA测试曲线会上翘)。
数字部分的电路如上图:可见设计一个数字设备,在电路结构本身上是非常简单的。主要复杂的部分是程序设计。其他非主要部分和原理图和电路板布局由于篇幅的关系就省略了。
等工厂按照你的设计方案把电路实际制作出来后,就可以开始着手数字设备的灵魂部分,程序的设计:先来看CS3310的时序图:
可见是使用串行信号:当片选择引脚处与低电平的时候,系统输入有效。这个时候就可以输入16位的控制信号,前8位控制左声道,后8位控制右声道。具体的控制关系可以参看PDF文件。有了这些资料,就可以把控制部分的核心程序写出来:
/*包含头文件*/
#include
#include
#include
/* 宏定义 */
sbit CS3310_CS = P1^0; /*CS3310 3-wire接口的片选信号 */
sbit CS3310_SCLK = P1^1; /*CS3310 3-wire接口的时钟信号 */
sbit CS3310_SDAI = P1^2; /*CS3310 3-wire接口的数据输入信号 */
sbit CS3310_SDAO = P1^3; /*CS3310 3-wire接口的数据输出信号 */
***********************************************************
CS3310 range of 127dB, in 0.5 dB steps
2通道
下表参见datasheet的第6页
输入代码 增益或衰减(dB)
(左通道或右通道)
1111 1111+31.8
1111 1110+31.0
.
.
1100 00000
.
0000 0010-95.0
0000 0001-95.5
0000 0000Software Mute
***********************************************************/
void CS3310_write(unsigned int DATA_IN_R, unsigned int DATA_IN_L)
{
unsigned int i;
unsigned int temp;
unsigned int k;
CS3310_CS = 0;
k = 5;
while(k--);
CS3310_SCLK = 0;
k = 5;
while(k--);//输入低电平给CS3310的片选择引脚,使芯片做好接受数据的准备
for(i=0; i<8; i++)//依次输入右声道的音频数据
{temp = DATA_IN_R << i;
CS3310_SDAI = temp&0x80;
k = 5;
while(k--);
CS3310_SCLK = 1;
k = 5;
while(k--);
CS3310_SCLK = 0;//模拟时钟信号的翻转。构成虚拟时钟信号
k = 5;
while(k--);
}for(i=0; i<8; i++)//依次输入右声道的音频数据
{temp = DATA_IN_L << i;
CS3310_SDAI = temp&0x80;
k = 5;
while(k--);
CS3310_SCLK = 1;
k = 5;
while(k--);
CS3310_SCLK = 0;
k = 5;
while(k--);
}//CS3310的全局变量声明
unsigned int DATA_L;
unsigned int DATA_R;
void main()
{//这里的数据你可以写入你需要的数据
DATA_L = 50;
DATA_R = 25;
//调用如下函数,即可
CS3310_write(DATA_L, DATA_R);}
有了核心程序,再完成其他的输入输出控制程序,就可以编译连接,使用编程器把做好的程序写入到芯片中去,焊接好电路板。这个时候主要的工作就已经完成了。
完成这些部分后,就可以进行最后的组装和箱体的设计工作,这一部分就需要利用手边的各种空的壳体,给你的新设备安个好的家。笔者选择的是一个铝合金机箱,安装完毕并且把机箱和电路板的接地连接好后,完全属于自己设计的监听控制器就出炉了。
完成了上面那些基本设计以后,我们就开始了电路结构的设计,首先要做的部分就是有关CS3310芯片的周边电路:根据PDF文档,画出这一部分的原理图:
简单的介绍一下原理图中各个元件的用途:电容主要用于电源滤波,大容量的电容用于减少电源产生的交流声,而小容量电容用于屏蔽机箱内部的高频干扰。10omh电阻用于过零检测,防止CS3310内部的电阻改变的时候发生咔嗒声。1k的电阻用于上拉电阻,使 CS3310的MUTE引脚始终处于高电平状态,只有打开接地开关后,该引脚才能处于低电平(也就是禁音状态,根据PDF文档,该引脚低电平的时候,系统处于禁音状态)。两头的两个连接器用来串联下一个CS3310或输入控制信号。根据这一部分的电路,我们就可以开始布线做出电路板的设计:
电路板的左边是数字电路部分,所以使用了比较细的连接线,减少高频信号的辐射。而电路板的右边是模拟部分,所以线路比较粗,可以改善声音信号的传送质量。用于过滤高频干扰信号的小电容离CS3310主芯片都非常的近,这一点相当重要,否则电流在流入CS3310之前会受到严重的高频污染,产生不必要的高频噪音。所以在可能的情况下,这些小电容越接近CS3310越好。布线的时候还需要注意的事情就是,模拟部分的两个通道(平衡输入的冷端和热端或者是左右通道)的线路长度和零件分布最好完全相同,否则会出现两个通道不对称的问题(例如左右声道的信噪比不相同)。
由于是模块化设计:所以单片机控制部分和CS3310不在同一块电路板上,这样可以有效的避免数字部分的高频电路干扰模拟部分(如果发生了这样的干扰,一般特点是高频有嘶嘶声。RMAA测试曲线会上翘)。
数字部分的电路如上图:可见设计一个数字设备,在电路结构本身上是非常简单的。主要复杂的部分是程序设计。其他非主要部分和原理图和电路板布局由于篇幅的关系就省略了。
等工厂按照你的设计方案把电路实际制作出来后,就可以开始着手数字设备的灵魂部分,程序的设计:先来看CS3310的时序图:
可见是使用串行信号:当片选择引脚处与低电平的时候,系统输入有效。这个时候就可以输入16位的控制信号,前8位控制左声道,后8位控制右声道。具体的控制关系可以参看PDF文件。有了这些资料,就可以把控制部分的核心程序写出来:
/*包含头文件*/
#include
#include
#include
/* 宏定义 */
sbit CS3310_CS = P1^0; /*CS3310 3-wire接口的片选信号 */
sbit CS3310_SCLK = P1^1; /*CS3310 3-wire接口的时钟信号 */
sbit CS3310_SDAI = P1^2; /*CS3310 3-wire接口的数据输入信号 */
sbit CS3310_SDAO = P1^3; /*CS3310 3-wire接口的数据输出信号 */
***********************************************************
CS3310 range of 127dB, in 0.5 dB steps
2通道
下表参见datasheet的第6页
输入代码 增益或衰减(dB)
(左通道或右通道)
1111 1111+31.8
1111 1110+31.0
.
.
1100 00000
.
0000 0010-95.0
0000 0001-95.5
0000 0000Software Mute
***********************************************************/
void CS3310_write(unsigned int DATA_IN_R, unsigned int DATA_IN_L)
{
unsigned int i;
unsigned int temp;
unsigned int k;
CS3310_CS = 0;
k = 5;
while(k--);
CS3310_SCLK = 0;
k = 5;
while(k--);//输入低电平给CS3310的片选择引脚,使芯片做好接受数据的准备
for(i=0; i<8; i++)//依次输入右声道的音频数据
{temp = DATA_IN_R << i;
CS3310_SDAI = temp&0x80;
k = 5;
while(k--);
CS3310_SCLK = 1;
k = 5;
while(k--);
CS3310_SCLK = 0;//模拟时钟信号的翻转。构成虚拟时钟信号
k = 5;
while(k--);
}for(i=0; i<8; i++)//依次输入右声道的音频数据
{temp = DATA_IN_L << i;
CS3310_SDAI = temp&0x80;
k = 5;
while(k--);
CS3310_SCLK = 1;
k = 5;
while(k--);
CS3310_SCLK = 0;
k = 5;
while(k--);
}//CS3310的全局变量声明
unsigned int DATA_L;
unsigned int DATA_R;
void main()
{//这里的数据你可以写入你需要的数据
DATA_L = 50;
DATA_R = 25;
//调用如下函数,即可
CS3310_write(DATA_L, DATA_R);}
有了核心程序,再完成其他的输入输出控制程序,就可以编译连接,使用编程器把做好的程序写入到芯片中去,焊接好电路板。这个时候主要的工作就已经完成了。
完成这些部分后,就可以进行最后的组装和箱体的设计工作,这一部分就需要利用手边的各种空的壳体,给你的新设备安个好的家。笔者选择的是一个铝合金机箱,安装完毕并且把机箱和电路板的接地连接好后,完全属于自己设计的监听控制器就出炉了。