我不知道我做错了什么。
我根据产品说明书将 INM 输入接地。
我设置了10k 阻抗。
我已经测量了 INP 输入端的信号、我可以将其设置为0和3V 直流
我设置了直流模式、禁用了 HP 滤波器。
我已经验证了来自 ALSA 驱动程序的原始值、它们处于32位范围的中间。 我看到这些值在32位的中心值周围浮动。
输入由一个串联电阻为100R、输入接地端为10nF 的 R2R 运算放大器馈电(我在其他 ADC 实现中使用过这个精确的电路)
用于初始化 ADC 的代码
//唤醒设备(第一个似乎是启动已识别的 SPI)
spiADC (FD_AUD、0x02、0x81、0);
spiADC (FD_AUD、0x02、0x81、0);
std::this_thread::sleep_for (std::chrono:::毫秒(10));
// TDM 和32位(I2S 仅支持2个通道、需要支持更多通道的 TDM)
spiADC (FD_AUD、0x07、0x30、0);//32位
//设置所有4个通道的线路输入(有些增益设置并未涉及下一个地址)(阻抗设置为10k,因为单端不支持2.5k
spiADC (FD_AUD、0x3C、0xB4、0);
spiADC (FD_AUD、0x41、0xB4、0);
spiADC (FD_AUD、0x46、0xB4、0);
spiADC (FD_AUD、0x4B、0xB4、0);
//关闭 HPF
spiADC (FD_AUD、0x6B、0x00、0);
//启用所有4个 ADC
spiADC (FD_AUD、0x73、0xF0、0);
//启用 ASI 4输出插槽(不确定我是否正确)
spiADC (FD_AUD、0x74、0xF0、0);
//加电 ADC 和 PLL (不确定它们是否正确)
spiADC (FD_AUD、0x75、0x60、0);
我用于 ALSA 的设置:
SND_PCM_HW_PARAMS_malloc (&HW_PARAMS);
SND_PCM_HW_PARAMS_ANY (CAPTURE_Handle、HW_PARAMS);
SND_PCM_HW_params_set_access (capture_handle、hw_params、SND_PCM_access_rw_interleaved);
SND_PCM_HW_PARAMS_SET_FORMAT (CAPTURE_Handle、HW_PARAMS、SND_PCM_FORMAT_S32_LE);
SND_PCM_HW_PARAMS_SET_RATE (CAPTURE_Handle、HW_PARAMS、48000、0);
SND_PCM_HW_PARAMS_SET_CHANNELS (CAPTURE_Handle、HW_PARAMS、4);
SND_PCM_HW_PARAMS (CAPTURE_Handle、HW_PARAMS);
我以前使用过此代码、但它用于 I2S 2通道 ADC。 但是、这些设置看起来是正确的。
这是我的原理图(减去输入电路)、与参考设计非常相似。
不确定这是否有用、但这是我的测试代码的输出:
第一行是我将值转换为浮点值(0->1)的地方
第二个值是驱动器外的 int32_t、未改变。 这些值浮动了一点、这让我非常怀疑。 通常、在应用零伏的情况下、不会出现任何噪声、值也不会移动。 与越过 Vrms 值末尾时一样、它也会将其绑定为高电平。
如果有人知道电路或直流设置可能存在什么问题、从而导致这些值接近 ADC 范围的中间值、
谢谢!
瑞克