ad9910模块ram模式,输出电平不定怎么办?

用stm32驱动AD9910模块,采用ram模式输出方波,在ram存储波形不变的情况下,每次上电输出的方波,其最大值,最小值和振幅都不一样,应该怎样稳定输出信号?

img

img

img

在使用STM32驱动AD9910模块时,每次上电输出方波的最大值、最小值以及振幅不一致,可能是由于以下几个原因导致:

AD9910的DAC电压参考:如果AD9910的DAC电压参考不稳定,会导致输出信号振幅不稳定。可以通过检查AD9910的DAC电压参考电路或更换参考源来解决该问题。

RAM数据存储错误:如果RAM中存储的方波数据出现错误,会导致输出信号不稳定。可以通过检查RAM数据写入过程,或修改RAM数据存储和读取的方法来解决该问题。

时钟信号不稳定:如果AD9910的主时钟不稳定,会导致输出信号不稳定。可以通过检查时钟信号源或更换时钟信号源来解决该问题。

为了稳定输出信号,您可以尝试如下方法:

稳定AD9910的DAC参考电压,确保其参考电压源电压稳定。

检查AD9910的RAM写入过程,并确保RAM中存储的方波数据正确,同时正确设置DAC输出的幅度和偏置等参数。

使用可靠的时钟信号源,并确保主时钟信号与时钟信号源同步。

可以尝试使用AD9910的自动校准功能,校正DAC输出和时钟信号。

对AD9910进行电源和地线滤波,以降低噪声和电源纹波等问题对输出信号的干扰。

1,确保DAC的参考电压稳定
2,加一级电压跟随器增强驱动试试。

  • 这篇博客: 基于STM32HAL库 AD9959调试笔记中的 接口函数编写 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •  写的时候又犯了一个错误就是没注意运算符优先级

    	CFTWO[2] = (uint8_t)temp>>8;
    	CFTWO[2] = (uint8_t)(temp>>8);

    上面这两种写法产生的结果是不一样的

    //FTW/2^32=freq
    void Write_frequence(uint8_t channel,uint32_t freq)
    {
    	uint8_t CFTWO[4] = {0x00,0x00,0x00,0x00};
    	uint32_t temp;
    	temp=(uint32_t)freq*8.589934592;	   //将输入频率因子分为四个字节  8.589934592=(2^32)/1000000000
    	//从数组0开始发送。但实际数据是从高位到地位接收的
    	CFTWO[3] = (uint8_t)temp;
    	CFTWO[2] = (uint8_t)(temp>>8);
    	CFTWO[1] = (uint8_t)(temp>>16);
    	CFTWO[0] = (uint8_t)(temp>>24);
    	switch(channel)
    	{
    		case 1:WriteData_9959(CSR_ADDR,1,CSR_DATA0);break;//开启通道一
    		case 2:WriteData_9959(CSR_ADDR,1,CSR_DATA1);break;
    		case 3:WriteData_9959(CSR_ADDR,1,CSR_DATA2);break;
    		case 4:WriteData_9959(CSR_ADDR,1,CSR_DATA3);break;
    		default:break;
    	}
    	WriteData_9959(CFTWO_ADDR,4,CFTWO);
    }

    理解这段代码之后写幅度和相位的也很容易了

    最后产生的波形还是比较满意的 

    (2022.7.24更新,后面发现AD9959的相位在频率100khz就已经有比较大的误差了,不适于用来产生两路正交信号,但是用于100hz-100khz的扫频还是非常合适的。初始化之前最好还是RST一下,不然有概率没有信号产生)

AD9910使用心得-fanfanStudio
可以借鉴下
https://blog.csdn.net/weixin_41974812/article/details/81130526

检查一下寄存器设置是否正确,包括频率、相位、振幅、RAM地址等

借鉴文心一言:
在上电之前,将AD9910的输出寄存器清零,即写入0x00000000。
配置AD9910模块的输出寄存器,使其按照要求输出方波,这里按照您的要求是输出ram中存储的波形。
将AD9910的输出寄存器读取到STM32中,以进行后续处理。