关于#AD9910#的问题,如何解决?

我使用AD9910的RAM调制模式生成方波
但是生成的波图形是方波乘以一个正弦波的样子
请问这是为什么呀

这通常是由于输出信号的采样率和输入数据的长度不匹配所致。

具体而言,RAM调制模式会基于前一个周期的RAM数据生成当前周期的输出信号。如果输出信号的采样率与输入数据的长度不恰当,则可能会导致一些数据被重复使用或被跳过,从而产生类似于方波乘以一个正弦波的效果。

为了解决这个问题,您可以检查RAM数据的长度是否与要求的输出信号采样率相匹配。如果不匹配,则需要根据实际情况进行调整,例如增加或减少RAM数据的长度。同时,您还可以尝试使用其他调制模式(如线性增量调制模式或幅度调制模式)来生成所需的波形信号。

另外,还有其他因素可能会影响生成波形信号的质量,例如DAC的精度、时钟稳定性和滤波器等。因此,建议您仔细检查整个系统的设计和实现,以确保所需的波形信号质量和稳定性。

需要在生成调制信号后使用低通滤波器滤除高频成分,使得方波信号变得更加平坦。

AD9910的RAM调制模式可以让用户通过预加载数据到RAM中动态生成一个波形序列。如果您的方波图形在高频时乘以正弦波,这可能是由于RAM数据不正确导致的。

请注意,AD9910 RAM数据的格式有一定的要求,与发送到SPI端口的数据格式略有不同。此外,请确保在设置AD9910参数之前对RAM进行初始化,并设置适当的RAM地址寄存器和RAM模式控制寄存器。

此外,在您的代码中还需要设置合适的中心频率或起始频率,以避免产生不必要的混频效应。另外,请确认您的代码中是否存在使AD9910输出幅度或相位发生变化的操作,如幅度缩放或者相位偏移等。
若检查以上问题仍无法解决,建议提供完整的 AD9910 配置以及波形数据,以便进行更深入的原因分析。

据我了解,AD9910的RAM调制模式可以用于生成方波。但是,您提到生成的波形是方波乘以正弦波的样子,这可能是由于您的AD9910配置不正确或者您的电路中存在问题,我建议您检查AD9910的配置是否正确,并检查电路中是否存在问题。

使用chatGPT-4和博主@才华横溢caozy 回答:
可能是由于在RAM调制模式下,AD9910使用插值器来平滑数字信号,插值造成了你看到的正弦波形式。这种情况可能是因为插值器的不同参数设置或运行模式造成的。你可以尝试根据AD9910的数据手册,调整插值器的参数或尝试使用其他调制模式来解决这个问题。另外,也可以检查一下AD9910的控制寄存器和外部时钟频率等设置是否正确,以确保输出是你期望的方波信号。

如果您使用AD9910的RAM调制模式生成方波,但生成的波形是方波乘以一个正弦波的样子,这可能是由于以下原因:

AD9910的DAC输出的幅度与时钟频率相关,因此需要根据时钟频率和DAC输出幅度来计算合适的幅度缩放因子,以保证输出波形幅度正确。您可以检查您使用的幅度缩放因子是否正确。

如果您在生成方波时使用了RAM调制模式,需要确保RAM中存储的数据是正确的。可能是RAM中存储的数据不正确导致了输出波形的异常。

您可以检查AD9910的相关寄存器是否正确配置。例如,您可以检查频率、相位和幅度控制寄存器的值是否正确,这些寄存器的值会影响到输出波形的频率、相位和幅度。

解决这些问题的方法如下:

检查幅度缩放因子是否正确。幅度缩放因子需要根据时钟频率和DAC输出幅度来计算,可以通过以下公式来计算:
Amplitude Scale Factor = (2^n – 1) / (Vref * DAC Gain)

其中,n为DAC输出位数,Vref为参考电压,DAC Gain为DAC的增益。确保计算出来的幅度缩放因子正确,并将其写入AD9910的相应寄存器中。

检查RAM中存储的数据是否正确。RAM中存储的数据应该是符合要求的方波数据,可以通过其他工具或软件来生成,然后将数据写入AD9910的RAM中。

检查AD9910的相关寄存器是否正确配置。可以根据AD9910的数据手册来查看寄存器的默认值和配置方式,确保寄存器的值正确设置。特别是频率、相位和幅度控制寄存器的值,需要根据具体的应用场景来进行设置。

另外,如果您使用的是AD9910的RAM调制模式生成方波,可能会受到时钟频率、RAM数据速率和DAC输出速率等因素的影响。因此,您可以尝试调整这些参数来改善输出波形的质量。例如,可以尝试增加时钟频率、降低RAM数据速率或者DAC输出速率等。

最后,建议您参考AD9910的数据手册和应用笔记,以获取更详细的信息和技巧。如果您仍然无法解决问题,您可以提供更多具体的信息,以便我给出更详细的帮助。

可以借鉴下

//===================设置频率===================//
void Freq_convert(ulong Freq)
{
    ulong Temp;
    if(Freq > 400000000)
        Freq = 400000000;
    Temp=(ulong)Freq*4.294967296; //  4.294967296=(2^32)/1000000000 
                                  //1G的内部时钟分为2^32份
    profile0[7]=(uchar)Temp;     //可以看到profile0在频率控制字一共有4个字节
    profile0[6]=(uchar)(Temp>>8);//所以分四次发送
    profile0[5]=(uchar)(Temp>>16);
    profile0[4]=(uchar)(Temp>>24);
    Txprofile();
}
 
//===================ad9910·发送profile0控制字======================
void Txprofile(void)
{
    uchar m,k;
 
    CS=0;
    txd_8bit(0x0e);    //profile0地址
    for (m=0;m<8;m++)
        txd_8bit(profile0[m]); //8次把所有的profile0数据全发送出去
    CS=1;
    for(k=0;k<10;k++);//等待
 
    UP_DAT=1;
    for(k=0;k<10;k++);//等待
    UP_DAT=0;
    delay_ms(1);
}   

AD9910芯片的RAM调制模式是通过在RAM中预存储数字信号的方式来实现频率和相位的调制。为了在AD9910中实现方波生成,需要将方波的数字信号存储到RAM中,然后将RAM的输出连接到AD9910的输出端口。如果你的方波图形是方波乘以一个正弦波的样子,可能是由于下面的原因之一引起的:

  1. RAM中存储的数字信号不是一个标准的方波信号。标准的方波信号应该是一个幅值为+1和-1的矩形波形,如果你的数字信号不是这个形状,那么可能会导致生成的波形不是标准的方波。
  2. AD9910的输出端口连接了一个幅值不为1的幅度调制器。如果你将AD9910的输出端口连接到了一个幅度调制器,那么可能会导致输出的波形不是标准的方波。你可以检查一下AD9910的输出端口是否连接到了一个幅值为1的电路中。
  3. AD9910的输出端口连接了一个带滤波器的电路。如果你将AD9910的输出端口连接到了一个带滤波器的电路中,那么可能会导致输出的波形不是标准的方波。你可以尝试连接到一个简单的放大器电路,或者将AD9910的输出端口连接到示波器进行观测,以确定是否存在带滤波器的问题。

如果你检查了以上三个方面,仍然无法解决问题,那么可能是硬件或软件设置问题。你可以检查一下AD9910的各个寄存器设置是否正确,或者考虑更换AD9910芯片进行测试。

AD9910使用RAM波形生成时,生成的波形基于RAM的数字模拟转换(DAC)输出。在DAC输出时,RAM中的数据按照一定的时间序列被读取,然后被转换成模拟电压信号输出。如果RAM中的数据不是一个完整的、连续的方波波形,那么输出的波形会被错位,看起来像是方波乘以正弦波。

AD9910的RAM波形生成需要满足以下几点:

  1. RAM中的数据必须按照 AD9910 DAC 的采样时序规律的存储方式,且数据量必须足够完整的描述一个周期。
  2. RAM中的波形数据应尽可能满足充分的频谱能量(谐波等)。
  3. 正确设置相关的寄存器,比如选择正确的DAC输出时序规律,并在输出时需要使能校准。

如果你确认RAM中存储的数据是一个完整的方波波形,并且满足上述要求,但是输出结果仍然不正常,可以尝试检查硬件连接和时序控制是否正确,或者向AD9910内部写入正确的初始化寄存器值以确保输出的准确性。

参考下
使用AD9910直接数字频率合成器的RAM

//===================设置频率===================//
void Freq_convert(ulong Freq)
{
    ulong Temp;
    if(Freq > 400000000)
        Freq = 400000000;
    Temp=(ulong)Freq*4.294967296; //  4.294967296=(2^32)/1000000000 
                                  //1G的内部时钟分为2^32份
    profile0[7]=(uchar)Temp;     //可以看到profile0在频率控制字一共有4个字节
    profile0[6]=(uchar)(Temp>>8);//所以分四次发送
    profile0[5]=(uchar)(Temp>>16);
    profile0[4]=(uchar)(Temp>>24);
    Txprofile();
}
 
//===================ad9910·发送profile0控制字======================
void Txprofile(void)
{
    uchar m,k;
 
    CS=0;
    txd_8bit(0x0e);    //profile0地址
    for (m=0;m<8;m++)
        txd_8bit(profile0[m]); //8次把所有的profile0数据全发送出去
    CS=1;
    for(k=0;k<10;k++);//等待
 
    UP_DAT=1;
    for(k=0;k<10;k++);//等待
    UP_DAT=0;
    delay_ms(1);
}   
 

该回答引用GPT与博主@晓码自在合作编写:

从您的描述,这种现象很有可能是由于 AD9910 的 RAM 调制模式下,采用正弦波作为载波,然后以此载波进行调制导致的。
AD9910 的 RAM 调制模式工作原理是:它有一个内部正弦波发生器,可以生成一个固定频率和相位的正弦载波。然后它会依据 RAM 中存入的timed data来调制这个载波的幅度,从而生成所需要的波形。
所以在这个过程中,输出波形实际上是您需要生成的波形(此处为方波)调制在正弦载波之上的效果。正弦载波的频率由 AD9910 的外部参考时钟fCLK和RAM地址的步进决定。
要消除这个正弦载波,可以尝试以下方法:

  1. 将正弦波载频设置为非常高频,超出您需要的波形频率较多。这可以使输出波形中正弦载波的影响不可见。
  2. 在AD9910的timed data RAM中写入您需要的波形数据的同时,也写入一个相位相反的波形。这可以在一定程度上抵消正弦载波,但容易产生误差。
  3. 不使用RAM调制模式,转为使用DDS调制模式。DDS模式下可以直接生成所需的波形,不需要正弦载波参与调制。
  4. AD9910输出端加一个低通滤波器,滤除正弦载波频率分量,只保留低频的需要的波形。
  5. 将AD9910的正弦波发生器禁用,采用外部信号作为载波输入。这需要对AD9910的详细 Datasheet 进行理解与配置。

除上述方法外,您也可以在原理上进一步理解 RAM 调制的工作机制,从而设法在代码或配置级进行相应调整以抑制正弦载波的影响。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
AD9910是一款高速、数字、直接数字频率合成器 (DDS)。如果在使用AD9910的RAM调制模式生成方波时,得到的波图形是方波乘以一个正弦波的样子,这是正常的现象,这种情况被称为AM调制,是由于RAM数据中的相位误差而引起的。下面是可能导致该问题的一些原因和对应的解决方法。

  1. RAM数据中的相位误差:RAM数据的相位精度决定了输出波形的相位精度。如果相位误差较大,就会出现明显的AM调制。此时建议增加RAM数据精度或采用更好的相位补偿器件来减小误差。

  2. 正弦波载频与方波载频的相位误差:如果正弦波载频与方波载频之间存在相位误差,也会引起AM调制。此时建议对正弦波和方波的载频进行校准,保证它们的相位一致。

  3. RAM数据中的幅度误差:RAM数据中的幅度误差也会引起AM调制。此时建议增加RAM数据精度或采用更好的幅度补偿器件来减小误差。

下面是使用AD9910 RAM调制模式生成方波的代码示例,你可以参考一下:

import serial
import time

# 打开串口
ser = serial.Serial(10)
ser.baudrate = 115200
ser.timeout = 1

# RAM数据配置
amplitude = int(0.5*2**14) # 幅度
phase = int(0.1*2**32) # 相位
freq = int(100e6/2**32*2**14) # 频率
data = format(amplitude, '016')+format(phase, '032')+format(freq, '016')

# 配置控制寄存器
cfr1 = '00000000000100000100011000000000' # RAM选择
cfr2 = '00000000000000000000000000000110' # RAM启用

# 写入RAM控制寄存器
ser.write(bytes.fromhex('c0010800'))
ser.write(bytes.fromhex(cfr1))
ser.write(bytes.fromhex(cfr2))

# 写入RAM数据
cmd = 'c0'+format(0, '02x')+'8001'
for i in range(0, 1024):
    ser.write(bytes.fromhex(cmd))
    ser.write(bytes.fromhex(data))

# 配置输出控制寄存器
fr1 = '00000000000000000001000000001010' # 频率控制
fr2 = '00000000000000011111000000000000' # 幅度控制
fr3 = '00000000000000000000000000000111' # 载波控制

# 写入输出控制寄存器
ser.write(bytes.fromhex('c0010820'))
ser.write(bytes.fromhex(fr1))
ser.write(bytes.fromhex(fr2))
ser.write(bytes.fromhex(fr3))

# 使能DDS输出
ser.write(bytes.fromhex('c0000402'))

# 关闭串口
ser.close()

这段代码使用串口与AD9910进行通信,配置RAM数据,然后将RAM数据写入AD9910的RAM中,并配置输出控制寄存器,使AD9910输出DDS信号。你可以根据自己的需要进行修改和扩展。
如果我的回答解决了您的问题,请采纳!

你好不太看得懂,找了两个链接给你,看看有没有帮助吧
https://ez.analog.com/dds/f/q-a/28967/ramp-wave-ad9910
https://zhidao.baidu.com/question/484279617.html

基于ChatGPT部分内容参考作答:
AD9910的RAM调制模式是通过将RAM中存储的数字序列转换为模拟信号来生成波形的。如果您的波形是方波乘以一个正弦波的样子,可能是因为您的数字序列中包含了正弦波的成分。

您可以检查一下您的数字序列是否包含了正弦波的成分,如果有的话,可以将其去除或者调整数字序列,以达到您想要的方波波形。

该回答参考ChatGPT:
这可能是由于你的参考信号频率与AD9910的内部频率不匹配导致的。建议你检查一下输入信号的频率是否正确,并且可以尝试使用更高频的参考信号来生成方波。另外,也可以检查一下输出设置,确保波形的幅度和周期在合理的范围内。