16位音频芯片PCM1801采集数据有问题?跪求大神帮忙啊
我用stm32控制PCM1801,我的引脚设置如下(输出频率实测过,设置的应该没什么问题吧):比特时钟BCK=1.5Mhz,采样时钟LRCK=48khz,主系统时钟SCKI=12MHZ,FMT=0(左对齐),BYPAS=1(Bypass-through mode),现在的情况是输入电压一个为1.0V,一个为0V,输出数据DOUT观察有波形,可是我读出来的数据基本都在64217左右不停跳动,这个数据肯定是不对的,换了个输入电压依然如此,搞了好久,不懂啊~~?跪求大神帮帮忙。。。
Hi
你的时钟配置是否精确?PCM1801 SCLK只支持256fs,384fs和512fs,如果使用48kHz采样率,SCKI应为12.288MHz,BCLK应为1.536MHz。
另外再检查一下参考电压引脚电容连接是否正确,电路有无错误?
谢谢!
您好,谢谢您的回复,我用的是stm32内置的I2S接口直接配置的,用示波器观察对比同步波形LRCK,DOUT,BCK,我从示波器上读出的数据一直是在64220左右跳动,能用IO模拟I2S协议么?(不过我觉得这样用定时器设置出来的频率应该会更加不准),是不是只能用MCU的自带的I2S接口来操作呢?
I2S_InitStructure.I2S_Standard = I2S_Standard_MSB;//I2S_Standard_Phillips飞利浦标准I2S_Standard_MSB左高位对齐标准
I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b;//I2S_DataFormat_16bextended表示数据以32位包的形式传输
I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Enable;//打开MCLK
I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_48k;//音频采样频率为48khz
I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low;
I2S_InitStructure.I2S_Mode = I2S_Mode_MasterRx;
I2S_Init(SPI2, &I2S_InitStructure);
Hi,
推荐是使用器件自带的硬件I2S来操作,软件模拟的确会存在时钟不准的问题。STM32 I2S接收寄存器读到的值是多少?
你的示波器有I2S解码功能吗?
您好,谢谢您为我解答疑惑。
无论如何改变电压输入,STM32 I2S接收寄存器读到的值大致均在64220~64240之间跳变,我用示波器实测的STM32自带硬件I2S输出LRCK,SCKI,BCK的频率的确是有少许偏移的(时钟不精准)。会不会是我设置的问题呢?我是将STM32设置为接收主机,PCM1801设置为从机,由STM32提供LRCK,SCKI,BCK时钟给PCM1801,然后读取PCM1801输出的DOUT数据,示波器观察DOUT有波形,示波器没有解码功能,我是自己测LRCK,DOUT波形,每一个高电平LRCK含16位左通道数据,低电平LRCK含16位右通道数据,每一位数据DOUT约为1.5M,这样一个一个对应读出来的,然后和STM32接收寄存器对比,发现是一样的。应该是我的程序时序问题吧?
Hi,
你确认一下下列语句是否真的使用的标准左对齐格式而非I2S MSB在先的格式:
“ I2S_InitStructure.I2S_Standard = I2S_Standard_MSB;//I2S_Standard_Phillips飞利浦标准I2S_Standard_MSB左高位对齐标准”
另外你再改成标准I2S格式试试(FMT=H)。
您好,当我输入1khz的方波,低电平-500mv,高电平500mv,计算采集到的数据在710mv左右和-710mv左右波动;输入1khz的方波,低电平-1000mv,高电平1000mv,计算采集到的数据在1400mv左右和-1400mv左右波动......均有偏差,输入幅值越小,偏差也越小,不知道是什么问题,想请问下您,这是程序上的问题么?
Hi,
把你的PCM1801输入电路发上来看看,PCM1801是不支持负电压输入的,必须偏置到2.1V的中点电压,推荐最大输入峰峰值2.828V。
WangLu,
PCM1801的SNR为93dB,而16bits 的理想SNR为98dB左右。这意味着LSB位被噪声覆盖,2nd LSB 和3rd LSB等也会受噪声影响。所以跳动是正常的。
PCM1801是为音频设计的,它的线性误差小,但绝对精度较差。Datasheet上给的数值是+/-5% FSR (第二页DC ACCURACY一栏)。对于你的应用,感觉对绝对精度有较高要求。你可考虑TI的用于工业上的ADC,可能更能满足你的要求。
Best Regards
Frank Pan
我是完全按照数据手册上P17的电路图做的板子,不过我实测参考电压VREF1=2.093V(约为2.1V),VREF2=2.975V,两个输入的参考电压可以不一致么?
如果是误差的话,应该也不会这么大吧?这样的数据偏差应该是不正常的,2nd LSB 和3rd LSB等会受噪声影响,跳动范围也几十mv就差不多了,是程序问题么?
Hi,
两个参考电压是可以不一致的,因为它们的用途不一样,一个用于converter,一个用于确定满量程电压。你的应用是音频信号采集还是想用它来测量一般信号?
您能详细的给我说说吗?麻烦您了。
我准备应用的是音频信号采集,但是我不知道我的程序是否正确(即采集的数据是否正确),所以我现在用一般的信号作为输入(即方波)来验证程序的正确性,但是我所得的数据有问题。
Hi,
关于两个参考电压datasheet p12第二段有描述,你可以参考一下。另外你直接给PCM1801模拟输入端加大于0V小于2.828V的直流电压看看误差有多少?(去掉隔直电容)
另外我对STM32不是太了解,不确定你程序对STM32 I2S配置的是否完全正确而导致该问题。
根据datasheet给出的DC精度,增益误差最大5%满量程,2.828*0.05约为0.14V,即DC最大会有140mV的误差。
WangLu,
你量一下VinL和VinR的偏置电压,看是不是相等。如果不等,应该有问题。
正常值应该在2.1V左右。
Best Regards
Frank Pan