AD9910使用过程

引脚说明
引脚 | 描述 |
---|---|
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位。
- 数字斜坡调制模式
- 并行数据端口调制模式
如何控制和更改频率,相位,幅度
单频调制模式
内部结构

内部DDS模块产生信号,信号的频率由控制输入信号决定,注意图中的位数
频率
计算公式:
FTW:介于0~2^32的整数,利用此公式算出FTW
相位
计算公式:
振幅
计算公式
RAM控制模式
内部结构
)
对应寄存器
寄存器地址及其对应功能
)
)
食用方法
用下面函数,通过SPI协议进行传输,从而设置寄存器的值,值要根据上面表格寻找自己要设置的模式,后面会给出配置RAM调制模式的例子
1 | // 通过SPI接口向AD9910写入控制寄存器值 |
食用例子
确定自己的SPI脚,接好线
STM32AD AD9910 SCK SCLK MOSI SDIO CS CSB IO_UPDATE IO_UPDATE 通过AD9910的官方提供的软件进行寄存器的配置
配置SPI,了解SPI传参函数,写发送函数
本例子使用的是SPI5,因为引脚接近,但是要注意,H74的SPI1-3和SPI4-6是不一样的,传参位数后者最大是16bit,前者是32bit。
关于SPI的传输函数
1
2
3HAL_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
37void 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);
}传输配置寄存器
本例子采用单频调制模式输出正弦波
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
// 定义AD9910控制寄存器值
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个字节的函数
}开跑(待测试)
如何进行扫频
使用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 を使用して許可します。