|
作者:sword__yang
电子音量控制实际就是一个数控的电位器。这里我们以美国DALLAS的DS1801S为例,介绍如何用MCU来控制音量。
DS1801S是一个16Pin的贴片芯片。其内部有集成了两个按对数曲线变化的双路音频控制电位器,其中每一路电位器有有65级与每级1分贝对应的阶梯电阻网络,采用三线接口和MCU的SPI总线连接,还具有信号过零切换和软件静音功能。芯片引脚和内部结构参见图II-2.0。
(原文件名:1.jpg)
(原文件名:2.jpg)
(原文件名:3.jpg)
其内部有三部分:
1)命令/控制单元:负责接收来自外部MCU的控制数据,送给16位的移位寄存器,并且根据外部/ZCEN引脚的逻辑判断是否需要做信号过零点检测(过零检测可以使得控制数据在信号过零点切入,这样音量控制不会突变)。
2)16位移位寄存器:用来对数字多工器进行控制,以切换不同的衰减阻值。
3)1~65级的数字多工器:用来切换衰减的阻值,使得数字电位器按照MCU输出的音量数据值进行衰减。
DS1801S芯片和MCU的连接:
1) /RST: 复位和片选,接到MCU的普通输出端口上(本例接到PORTC,6: Pin:17)
2) SCK: 同步时钟信号,接到MCU的SPI时钟输出口(Pin:14)
3) D: 数据输入端口,接到MCU的SPI的SDO同步串行数据输出口上(Pin:16)
数据通信波形(参见图II-2.1上面部分):
当MCU向DS1801S发送数据时,先拉高/RST的电平,选中SPI的目标芯片为这个音量控制芯片,同时SCK会输出同步时钟,数据则从MCU 的SSPBUF缓冲器逐个移位,通过SDO发给音量控制芯片的数据接收端D。
SPI要连续发送16个字节的数据给音量控制芯片,数据的格式见图II-2.1下面部分。16BIT 的数据中,BIT 14~8是用来控制电位器1的,BTI 15未用,BIT 14作为静音位控制:本位为高时,电位器1无输出(静音),其余BIT8~13是音量控制计数器,这是时下流行的衰减式设置的(请参见图II-2.2),当数值为0时,衰减为 0 dB,当数值为63时,衰减 -63 dB。BIT 6~0用来控制电位器0输出的,BIT 7未用,BIT 6是电位器0的静音控制位;BIT0~5是音量控制数值,输出对应关系与电位器1相同。
数字音量控制的发送例程如下:
【说明】:
音量控制值保存在VOLUE变量里,由于在立体声系统里,两个声道音量相等,所以把同一个音量值分别发送给电位器0,和电位器1就行了:
;===========================================
VOLUE_SEND:
BSF STATUS,RP0 ; 转到特殊寄存器页面
BSF SSPSTAT,CKE ; SPI工作方式设置
BCF STATUS,RP0 ; 转回普通寄存器页面
BCF SSPCON,CKP ; SPI工作方式设置
BSF PORTC,VOL_EN ; 拉高/RST信号
NOP
NOP ; 延时2uS
MOVF VOLUE,W ; 取出音量控制值
CALL spi_tx ; 发送给SPI总线上的DS1802S(高位:BIT 15~8)
MOVF VOLUE,W ; 第二次取数
CALL spi_tx ; 第二次发送(低位:BTI 7~0)
NOP
NOP ; 延时2uS
BCF PORTC,VOL_EN ; 发送完成,拉低/RST信号
RETURN
;================================================
spi_tx:
movwf SSPBUF ; 把数据送到SPI缓冲寄存器,开始发送
CALL SPI_WAIT ; 调用延时子程序
RETURN
;===============================================
SPI_WAIT:
MOVLW .45 ; 延时子程序(50 uS)
MOVWF SPI_DELAY
SP_1:
DECFSZ SPI_DELAY,1
GOTO SP_1
RETURN
;===============================================
由于电位器0和电位器1是两个完全独立的控制单元,我们还可以通过分别给两个音量控制寄存器送不同的值来微调左右声道的平衡。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。
如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》
|