AD9833使用教程,软件模拟SPI,stm32,m0,c2000等通用
一、芯片简介与特性
1、AD9833是一款低功耗、可编程波形发生器,能够产生正弦波、三角波和方波输出。
2、AD9833通过一个三线式串行接口写入数据。该器件采用2.3 V至5.5 V电源供电。
3、AD9833可以调节相位和频率,幅值不可调。
二、引脚功能表
1、FSYNC输入是电平触发输入,用作帧同步和芯片使能。仅当FSYNC处于低电平时,才可将数据传输至器件。要开始串行数据传输,应将FSYNC拉低。
2、FSYNC变为低电平后,串行数据即会在16个时钟脉冲的SCLK下降沿移入器件的输入移位寄存器。可在SCLK的第16个下降沿后将FSYNC拉高。当FSYNC变为低电平时, SCLK都必须处于高电平。
三、寄存器配置详解
1、控制寄存器
AD9833包含一个16位控制寄存器,让用户可以配置AD9833的操作。 mode位之外的所有控制位均在MCLK的内部下降沿采样。要告知AD9833控制寄存器的内容将更新, D15和D14必须置0。
每一位的功能在下表中列出,其中写代码用到的已经高亮。
我们要先写入第一个16位控制数据,包含控制、复位和波形:
D14和D15为0,告知AD9833控制寄存器的内容将更新。
D13为1,将一个完整字通过两次连续写入载入频率寄存器。
D12在D13为1时会被忽略,这里默认为0。
D11是决定相位累加器中使用的是FREQ0寄存器还是FREQ1寄存器,,为0是FREQ0,为1是FREQ1。
D10是决定用PHASE0还是PHASE1,为0是PHASE0,为1是PHASE1。
D9、D4、D2、D0都为0.
D8是复位位,为1时将内部寄存器复位为0,复位操作不会使相位、频率或控制寄存器复位。 AD9833上电时,器件应复位。所以此处置1.
D7、D6一般用不着,默认给0。
D5、D3、D1决定输出波形,详情见下表,OPBITEN位是D15,Mode Bit是D1,DIV2是D3。
如果要输出正弦波的话,第一个十六位是0010 0001 0000 0000。
2、频率和相位寄存器
AD9833包含两个频率寄存器和两个相位寄存器,具体选择上文已经说了。
AD9833的模拟输出为:
且 ,
所以如果我们想发出一个1k的正弦波,实际上给频率寄存器写的值
freqreg=frequence*(268435456.0/25000000.0)
此信号会经过如下相位偏移处理:
2π/4096 × PHASEREG
所以给相位寄存器写的值为
phasereg=(phase/180.0*3.14)*(4096.0/6.28)
(1)写入频率寄存器
写入频率寄存器时, Bit D15和Bit D14设置频率寄存器的地址。
(2)写入相位寄存器
写入相位寄存器时, Bit D15和Bit D14设置为11。 Bit D13确定将载入的相位寄存器。
四、stm32完整代码
1、STM32Cube MX配置
(1)配置时钟
(2)选三个输出引脚,配置为上拉模式,推挽输出,输出速度高
2、代码
AD9833.h
#ifndef _AD9833_H_#define _AD9833_H_#include \"main.h\"/******************************************************************************//* AD9833 *//******************************************************************************//* 寄存器 */#define AD9833_REG_CMD(0 << 14)// 0000 0000 0000 0000#define AD9833_REG_FREQ0(1 << 14)// 0100 0000 0000 0000#define AD9833_REG_FREQ1(2 << 14)// 1000 0000 0000 0000#define AD9833_REG_PHASE0(6 << 13)// 1100 0000 0000 0000 #define AD9833_REG_PHASE1(7 << 13)// 1110 0000 0000 0000/* 命令控制位 */#define AD9833_B28(1 << 13)#define AD9833_HLB(1 << 12)#define AD9833_FSEL0(0 << 11)#define AD9833_FSEL1(1 << 11)#define AD9833_PSEL0(0 << 10)#define AD9833_PSEL1(1 << 10)#define AD9833_PIN_SW(0 << 9) //清零#define AD9833_RESET(1 << 8) //复位#define AD9833_SLEEP1(1 << 7)#define AD9833_SLEEP12(1 << 6)#define AD9833_OPBITEN(0 << 5)//#define AD9833_SIGN_PIB(0 << 4) //清零#define AD9833_DIV2(1 << 3)#define AD9833_MODE(0 << 1)//#define AD9833_OUT_SINUS((0 << 5) | (0 << 1) | (0 << 3))//正弦波 #define AD9833_OUT_TRIANGLE((0 << 5) | (1 << 1) | (0 << 3))//三角波#define AD9833_OUT_MSB((1 << 5) | (0 << 1) | (1 << 3)) //方波#define AD9833_OUT_MSB2((1 << 5) | (0 << 1) | (0 << 3))//方波2分频void AD9833_Setup(uint32_t frequence, uint16_t phase,uint16_t type);//选择频率、相位和波形类型#endif
AD9833.c
#include \"AD9833.h\"#include \"main.h\"//时钟速率为25 MHz时, 可以实现0.1 Hz的分辨率;而时钟速率为1 MHz时,则可以实现0.004 Hz的分辨率。//调整参考时钟修改此处即可。// Delay_us(1);#define FCLK 25000000//设置参考时钟25MHz,板默认板载晶振频率25Mhz。#define RealFreDat FCLK/268435456.0 //总的公式为 Freq=(25000000/268435456)*28位寄存器的值#define AD9833_FSYNC_1 HAL_GPIO_WritePin(SYKC_9833_GPIO_Port,SYKC_9833_Pin,GPIO_PIN_SET);#define AD9833_FSYNC_0 HAL_GPIO_WritePin(SYKC_9833_GPIO_Port,SYKC_9833_Pin,GPIO_PIN_RESET);#define AD9833_SCLK_1 HAL_GPIO_WritePin(CLK_9833_GPIO_Port,CLK_9833_Pin,GPIO_PIN_SET);#define AD9833_SCLK_0 HAL_GPIO_WritePin(CLK_9833_GPIO_Port,CLK_9833_Pin,GPIO_PIN_RESET);#define AD9833_SDATA_1 HAL_GPIO_WritePin(DATA_9833_GPIO_Port,DATA_9833_Pin,GPIO_PIN_SET);#define AD9833_SDATA_0 HAL_GPIO_WritePin(DATA_9833_GPIO_Port,DATA_9833_Pin,GPIO_PIN_RESET);void AD9833_Setup(uint32_t frequence, uint16_t phase,uint16_t type){uint16_t first=(AD9833_B28|type|AD9833_RESET);//初始化+波形选择unsigned long freqreg=frequence*(268435456.0/25000000.0);uint16_t freA_M=(AD9833_REG_FREQ0|((freqreg& 0x0FFFC000) >> 14)); //0011 1111 1111 1111 0000 0000 0000 0000uint16_t freA_L=(AD9833_REG_FREQ0|(freqreg& 0x3FFF)); // 0011 1111 1111 1111uint16_t phasereg=(phase/180.0*3.14)*(4096.0/6.28);uint16_t phaa0=(AD9833_REG_PHASE1|(phasereg& 0x0FFF)); //1100 1111 1111 1111uint16_t ClearReset=0x2000;unsigned char i,j; uint16_t writeData[5]={first,freA_L,freA_M,phaa0,ClearReset};AD9833_SCLK_1; AD9833_FSYNC_0 ; Delay_us(1);for(i=0 ;i<5 ;i++) { for(j=0 ;j<16 ;j++) { if(writeData[i] & 0x8000) { AD9833_SDATA_1; } else {AD9833_SDATA_0; } AD9833_SCLK_0; writeData[i] <<= 1; AD9833_SCLK_1; } } AD9833_SDATA_1; AD9833_FSYNC_1; }
以上就是AD9833的使用教程啦,如果要移植的话就改下引脚。