AD9910使用过程

jiui0 Lv2

引脚说明

引脚 描述
I/O_UPDATE 数字输入(上升沿有效)
SDIO 串行数据输入/输出,支持单向和双向两种模式
SDO 串行数据输出,此引脚仅对单向串行数据模式有效,用于数据输出
SCK 串行数据时钟,数字时钟
CS 芯片选择,低电平有效
I/O_RESET 输入/输出复位,高电平有效
PF0 & PF1&PF2 Profile Select Pins.文件配置选择引脚,对应有8个配置文件寄存器,根据引脚的状态进行选择
EXT_PWR_DWN 不使用接逻辑0
DRCTL 不使用接逻辑0,如果需要DRG正斜率,则为逻辑1
DRHOLD 不使用接逻辑0,释放斜坡累加器,1则是驻留斜坡累加器

工作模式

  • 单频调制模式

DDS信号控制参数由编程寄存器直接提供,对应寄存器:profile,profile一共有八个,利用profile的三个外部引脚控制选择模块(3bit,001代表1,范围0~7),改变选择后在下一个SCLK的上升沿更新。

好处:操作简单。

对应引脚:PF3,PF2,PF1

  • RAM调制模式

RAM调制模式,由RA。M使能位和I/O_UPDATE引脚激活,DDS信号控制参数由RAM提供。

好处:在RAM调制模式中,可生成随时间变化的振幅、相位或频率信号,从而实现对任意DDS载波信号控制参数调制的功能。另外,利用极化调制格式还能将RAM样本分成振幅分量和相位分量;相位分量精度为16位,振幅分量精度为14位。

  • 数字斜坡调制模式
  • 并行数据端口调制模式

如何控制和更改频率,相位,幅度

单频调制模式

内部结构

image-20230317012928164

内部DDS模块产生信号,信号的频率由控制输入信号决定,注意图中的位数

频率

计算公式:

FTW:介于0~2^32的整数,利用此公式算出FTW

相位

计算公式:

振幅

计算公式

RAM控制模式

内部结构

image-20230316232230036)

对应寄存器

寄存器地址及其对应功能

1)

2)

3

4
5

食用方法

用下面函数,通过SPI协议进行传输,从而设置寄存器的值,值要根据上面表格寻找自己要设置的模式,后面会给出配置RAM调制模式的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 通过SPI接口向AD9910写入控制寄存器值
void AD9910_WriteReg(uint8_t regAddr, uint32_t regVal)
{
uint32_t txData = ((uint32_t)regAddr << 24) | regVal;

// 将SPI_CS_PIN拉低,使能SPI传输
HAL_GPIO_WritePin(SPI_GPIO_PORT, SPI_CS_PIN, GPIO_PIN_RESET);

// 发送数据,用的是硬件SPI5
HAL_SPI_Transmit(&hspi5, (uint8_t *)&txData, 4, HAL_MAX_DELAY);

// 将SPI_CS_PIN拉高,禁用SPI传输
HAL_GPIO_WritePin(SPI_GPIO_PORT, SPI_CS_PIN, GPIO_PIN_SET);

// 发送IO_UPDATE信号,更新寄存器值
HAL_GPIO_WritePin(SPI_GPIO_PORT, IO_UPDATE_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SPI_GPIO_PORT, IO_UPDATE_PIN, GPIO_PIN_SET);
}

食用例子

  1. 确定自己的SPI脚,接好线
    STM32AD AD9910
    SCK SCLK
    MOSI SDIO
    CS CSB
    IO_UPDATE IO_UPDATE
  2. 通过AD9910的官方提供的软件进行寄存器的配置

    image-20230318095201106

  3. 配置SPI,了解SPI传参函数,写发送函数

    本例子使用的是SPI5,因为引脚接近,但是要注意,H74的SPI1-3和SPI4-6是不一样的,传参位数后者最大是16bit,前者是32bit。

    关于SPI的传输函数

    1
    2
    3
    HAL_SPI_Transmit(&hspi5, (uint8_t *)&txData, 4, HAL_MAX_DELAY);
    //hspi是所开启的spi
    //txData是传入的数据,后面的8是指总共有4个字节,4个字节有32位

    根据手册中的时序图,写出发送函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    void AD9910_WriteReg(uint8_t regAddr, uint32_t regVal)
    {
    uint32_t txData = ((uint32_t)regAddr << 24) | regVal;

    // 将SPI_CS_PIN拉低,使能SPI传输
    HAL_GPIO_WritePin(SPI_GPIO_PORT, SPI_CS_PIN, GPIO_PIN_RESET);

    // 发送数据
    HAL_SPI_Transmit(&hspi5, (uint8_t *)&txData, 4, HAL_MAX_DELAY);

    // 将SPI_CS_PIN拉高,禁用SPI传输
    HAL_GPIO_WritePin(SPI_GPIO_PORT, SPI_CS_PIN, GPIO_PIN_SET);

    // 发送IO_UPDATE信号,更新寄存器值
    HAL_GPIO_WritePin(SPI_GPIO_PORT, IO_UPDATE_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(SPI_GPIO_PORT, IO_UPDATE_PIN, GPIO_PIN_SET);
    }
    /*注意位数的选择*/
    // 通过SPI接口向AD9910写入控制寄存器值 64位
    void AD9910_WriteReg_x64(uint8_t regAddr, uint64_t regVal)
    {
    uint32_t txData = ((uint32_t)regAddr << 24) | regVal;

    // 将SPI_CS_PIN拉低,使能SPI传输
    HAL_GPIO_WritePin(SPI_GPIO_PORT, SPI_CS_PIN, GPIO_PIN_RESET);

    // 发送数据
    HAL_SPI_Transmit(&hspi5, (uint8_t *)&txData, 8, HAL_MAX_DELAY);

    // 将SPI_CS_PIN拉高,禁用SPI传输
    HAL_GPIO_WritePin(SPI_GPIO_PORT, SPI_CS_PIN, GPIO_PIN_SET);

    // 发送IO_UPDATE信号,更新寄存器值
    HAL_GPIO_WritePin(SPI_GPIO_PORT, IO_UPDATE_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(SPI_GPIO_PORT, IO_UPDATE_PIN, GPIO_PIN_SET);
    }

  4. 传输配置寄存器

    本例子采用单频调制模式输出正弦波

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #define CFR1_REG_ADDR 0x00
    #define CFR2_REG_ADDR 0x01
    #define CFR3_REG_ADDR 0x02
    #define AUX_DAC_REG_ADDR 0x03
    #define IO_UPADATE_RATE_ADDR 0x04
    #define IO_UPDATE_REG_ADDR 0x0E
    #define FREQ_TUNING_WORD_REG_ADDR 0x04
    #define PHASE_OFFSET_REG_ADDR 0x05
    #define AMPLITUDE_SCALE_REG_ADDR 0x06
    #define PROFILE_1_ADDR 0x0f
    // 定义AD9910控制寄存器值
    #define CFR1_VAL 0x00000000 // 1kHz输出,使用外部参考时钟
    #define CFR2_VAL 0x00400820 // 频率转换器控制字设置
    #define CFR3_VAL 0x1f3fc000 // 禁用上拉电阻和低功耗模式
    #define AUX_DAC_VAL 0x00007f7f // 禁用AUX DAC输出
    #define IO_UPADATE_RATE_VAL 0xffffffff
    #define IO_UPDATE_VAL 0x00000001 // 使能IO_UPDATE信号
    #define AMPLITUDE_SCALE_VAL 0x00800000 // 幅度控制字,20mV峰峰值对应的幅度比例因子


    void AD9910_Init(void)
    {
    // 配置AD9910控制寄存器,设置为单频调制模式,运用Profile进行设置
    AD9910_WriteReg(CFR1_REG_ADDR, CFR1_VAL);
    AD9910_WriteReg(CFR2_REG_ADDR, CFR2_VAL);
    AD9910_WriteReg(CFR3_REG_ADDR, CFR3_VAL);
    AD9910_WriteReg(AUX_DAC_REG_ADDR, AUX_DAC_VAL);
    AD9910_WriteReg(IO_UPADATE_RATE_ADDR, IO_UPADATE_RATE_VAL);
    AD9910_WriteReg_x64(PROFILE_1_ADDR,0x095a0000000010c7);//传输8个字节的函数
    }
  5. 开跑(待测试)

如何进行扫频

使用DRG进行扫频

需要配置的部分:9个控制寄存器位,3个外部引脚,2个64位寄存器,一个32位寄存器

1、总使能:数字斜坡使能位:CFR2[19]

2、数字斜坡目的位:CFR2[21:20]

00:频率 31:0 32位频率参数

01:相位 31:16 16位相位参数

1x:振幅 31:18 4位振幅参数

3、控制斜坡方向DRCTL

1:正斜坡,0:负斜坡

4、控制斜坡斜率(连续更新时间间隔)

  • 横轴的步进

p位保存在32位数字斜坡率寄存器(0x0d,31:16,负斜率,15:0正斜率)的一个16位数值,控制步进间隔

  • 纵轴(频率)的步进

M采用32位数值,由64位数字斜坡步长寄存器(0x0c,63:32递减步长,31:0递增步长)编程控制

注意单位保持一致

5、DRG限值控制

控制上下边界,由64位数字斜坡限值寄存器控制,注意上限值要大于下限值

数字斜坡上限值0x0B,63:32

数字斜坡下限值0x0B,31:0

  • タイトル: AD9910使用过程
  • 作者: jiui0
  • で作成されました : 2023-03-17 00:43:26
  • で更新されました : 2023-04-06 21:10:34
  • リンク: https://github.com/JIU10/2023/03/17/AD9910使用过程/
  • 著作権宣言: この文章は CC BY-NC-SA 4.0 を使用して許可します。
 コメント