用stm32驱动AD9910模块,采用ram模式输出方波,在ram存储波形不变的情况下,每次上电输出的方波,其最大值,最小值和振幅都不一样,应该怎样稳定输出信号?
在使用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,加一级电压跟随器增强驱动试试。
写的时候又犯了一个错误就是没注意运算符优先级
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中,以进行后续处理。