电位器是一种机械设备,利用它可以根据所需值设置电阻,从而改变流过它的电流。电位计有许多应用,但大多数情况下,电位计用作音频放大器的音量控制器。
电位器不控制信号的增益,但是它形成一个分压器,这就是输入信号被衰减的原因。因此,在这个项目中,我将向您展示如何使用IC PT2258构建数字音量控制器并将其与Arduino接口以控制放大器电路的音量。您还可以在此处检查与音频相关的各种电路,包括VU表,音调控制电路等。
集成电路PT2258
正如我之前提到的,PT2258是用作6通道电子音量控制器的IC ,该IC使用专门为多通道音频视频应用设计的CMOS技术。
该IC提供I2C控制接口,衰减范围为0至-79dB,步长为1dB,采用20引脚DIP或SOP封装。
一些基本功能包括
- 6输入和输出通道(用于5.1家庭音频系统)
- 可选的I2C地址(用于菊花链应用)
- 高通道分离度(用于低噪声应用)
- 信噪比> 100dB
- 工作电压为5至9V
PT2258 IC如何工作
该IC通过SCL和SDA线从微控制器发送和接收数据。SDA和SCL构成总线接口。这些线必须通过两个4.7K电阻拉高,以确保稳定运行。
在进行实际的硬件操作之前,这里是IC的详细功能描述。如果您不想全部了解,可以跳过此部分,因为所有功能部分都由Arduino库管理。
资料验证
- 当SCL信号为高电平时,SDA线上的数据被认为是稳定的。
- 仅当SCL为LOW时,SDA线的HIGH和LOW状态才会改变。
启动和停止条件
启动条件在以下情况下被激活
- SCL设置为HIGH
- SDA从高态转换为低态。
停止条件在以下情况下被激活
- SCL设置为HIGH
- SDA从低态转换为高态
注意!该信息对于调试信号非常有用。
资料格式
传输到SDA线的每个字节都由8位组成,这些字节构成一个字节。每个字节后面必须有一个应答位。
致谢
确认可确保稳定和正确的操作。在应答时钟脉冲期间,微控制器在外围设备(音频处理器)将SDA线下拉(低电平)的这一确切时刻将SDA引脚拉高。
现在对外围设备(PT2258)进行寻址,并且必须在接收到一个字节后生成一个应答,否则,在第九个(第9个)时钟脉冲期间,SDA线将保持在高电平。如果发生这种情况,主发送器将生成STOP信息以中止传输。
这就消除了有效数据传输的必要性。
地址选择
该IC的I2C地址取决于CODE1(17号引脚)和CODE2(4号引脚)的状态。
CODE1(PIN号17) |
CODE2(PIN号4) |
十六进制地址 |
0 |
0 |
0X80 |
0 |
1个 |
0X84 |
1个 |
0 |
0X88 |
1个 |
1个 |
0X8C |
逻辑高= 1
逻辑低= 0
接口协议
接口协议包括以下内容:
- 起始位
- 芯片地址字节
- ACK =确认位
- 数据字节
- 停止位
一点家务
IC上电后,需要等待至少200ms才能传输第一个数据位,否则,数据传输可能会失败。
延迟之后,首先要做的是通过在I2C线上发送“ 0XC0”来清除寄存器,以确保正常工作。
上面的步骤清除了整个寄存器,现在我们需要为该寄存器设置一个值,否则,该寄存器会存储垃圾值,并且会产生斑点输出。
为了确保适当地调节音量,有必要依次向衰减器发送10dB的整数倍,然后发送1dB的代码,否则,IC可能会表现异常。下图进一步阐明了这一点。
以上两种方法都可以正常工作。
为确保正常运行,请确保I2C数据传输速度不超过100KHz。
这样便可以将字节发送到IC并衰减输入信号。上一节是学习IC的功能的,但是正如我之前所说,我们将使用Arduino库与管理所有硬代码的IC进行通信,我们只需要进行一些函数调用即可。
以上所有信息均摘自数据表,请参考以获取更多信息。
原理图
上图显示了基于PT2258的音量控制电路的测试原理图。它摘自数据表,并根据需要进行了修改。
为了演示,该电路借助上述原理图构建在无焊面包板上。
注意!所有组件应尽可能靠近放置,以减少寄生电容的电感和电阻。
所需组件
- PT2258 IC – 1
- Arduino Nano控制器– 1
- 通用面包板– 1
- 螺丝端子5mm x 3 – 1
- 按钮– 1
- 4.7K电阻器,5%-2
- 150K电阻器,5%-4
- 10k电阻器,5%-2
- 10uF电容器– 6
- 0.1uF电容器– 1
- 跳线-10
Arduino代码
为了简单起见,我将使用由sunrutcon制造的GitHub中的PT2258库。
这是一个写得很好的库,这就是为什么我决定使用它的原因,但是由于它很旧,所以有点bug,我们需要对其进行修复,然后才能使用它。
首先,从GitHub存储库下载并提取库。
解压缩后,您将获得上述两个文件。
#include #include
接下来,使用您喜欢的文本编辑器打开 PT2258.cpp 文件,我正在使用Notepad ++。
您可以看到线库的“ w”是小写字母,与最新的Arduino版本不兼容,并且您需要用大写的“ W”代替它。
PT2258音量控制器的完整代码可以在本节末尾找到。这里说明了程序的重要部分。
我们通过包含所有必需的库文件来开始代码。Wire库用于在Arduino和PT2258之间进行通信。PT2258库包含所有关键的I2C时序信息和确认。所述 ezButton 库用于与所述的按钮接口。
而不是使用下面的代码图像,而是从代码文件中复制所有代码实例,并像在其他项目中一样对它们进行格式化
#包括
接下来,为两个按钮和PT2258库本身创建对象。
PT2258 pt2258; ezButton button_1(2); ezButton button_2(4);
接下来,定义音量。这是该IC的默认音量级别。
整数体积= 40;
接下来,启动UART,并设置I2C总线的时钟频率。
Serial.begin(9600); Wire.setClock(100000);
设置I2C时钟非常重要,否则,该IC将无法工作,因为该IC支持的最大时钟频率为100KHz。
接下来,我们使用 if else 语句进行一些内务处理,以确保IC与I2C总线正确通信。
如果(!pt2258.init())Serial.printIn(“ PT2258成功启动”);否则Serial.printIn(“无法启动PT2258”);
接下来,我们设置按钮的去抖动延迟。
Button_1.setDebounceTime(50); Button_2.setDebounceTime(50);
最后,通过使用默认通道音量和引脚号进行设置来启动PT2258 IC。
/ *启动具有默认音量和Pin的PT * / Pt2258.setChannelVolume(volume,4); Pt2258.setChannelVolume(volume,5);
这标志着 Void Setup() 部分的结束。
在“ 循环” 部分,我们需要从按钮类调用循环函数;这是图书馆规范。
Button_1.loop(); //库规范Button_2.loop(); //图书馆规范
下面的 if 部分将减小音量。
/ *如果条件为真,则按下按钮1 * / If(button_1.ispressed()){Volume ++; //递增音量计数器。//此if语句可确保音量不超过79 If(volume> = 79){Volume = 79; } Serial.print(“ volume:“); //打印音量级别Serial.printIn(volume); / *设置PT2558 IC的PIN 9中通道4的音量* / Pt2558.setChannelVolume(volume,4); / *设置通道5的音量,通道5是PT2558 IC的PIN 10 * / Pt2558.setChannelVolume(volume,5); }
下面的 if 部分将增加音量。
//按钮2也会发生同样的情况。If(button_2.isPressed()){Volume--; //此if语句可确保音量不低于零。如果(体积<= 0)体积= 0; Serial.print(“ volume:“); Serial.printIn(volume); Pt2258.setChannelVolume(volume,4); Pt2558.setChannelVolume(volume,5); }
测试数字音频音量控制电路
为了测试电路,使用了以下设备
- 具有13-0-13抽头的变压器
- 2个4Ω20W扬声器作为负载。
- 音源(电话)
在上一篇文章中,我向您展示了如何使用TDA2050 IC制作一个简单的2x32瓦音频放大器,我还将在演示中使用它。
我弄乱了机械电位计,并用两条小的跨接电缆将两条引线短路了。
现在,借助两个按钮,可以控制放大器的音量。
进一步增强
可以进一步修改电路以改善其性能。可以对PCB等电路进行改进,以进一步消除IC数字部分产生的噪声。我们还可以添加一个额外的滤波器以抑制高频噪声。另外,请检查其他音频放大器电路和其他与音频相关的项目。
希望您喜欢本文并从中学到新东西。如有任何疑问,可以在下面的评论中提问,也可以使用我们的论坛进行详细讨论。