ad9833如何接STM32

2025-10-16 06:46:49

1、这是原理图

ad9833如何接STM32

2、这是程序

/*

******************************************************************************

                        程序参考ADI,仅供参考交流和学习

******************************************************************************

*/

#include "ad9833.h"

#include "common.h"

//***************************

//                Pin assign                  

//                STM32                        AD9833

//                GPIOB_Pin_15                 ---> FSYNC

//                GPIOB_Pin_14                 ---> SCK

//                GPIOB_Pin_13                 ---> DAT

//***************************       

        /*端口定义 */

        #define PORT_FSYNC        GPIOB

        #define PIN_FSYNC        GPIO_Pin_15

        #define PORT_SCK        GPIOB

        #define PIN_SCK                GPIO_Pin_14

        #define PORT_DAT        GPIOB

        #define PIN_DAT                GPIO_Pin_13

//****************************************************************

        #define FSYNC_0()                GPIO_ResetBits(PORT_FSYNC, PIN_FSYNC)

        #define FSYNC_1()                GPIO_SetBits(PORT_FSYNC, PIN_FSYNC)

        #define SCK_0()                GPIO_ResetBits(PORT_SCK, PIN_SCK)

        #define SCK_1()                GPIO_SetBits(PORT_SCK, PIN_SCK)

        #define DAT_0()                GPIO_ResetBits(PORT_DAT, PIN_DAT)

        #define DAT_1()                GPIO_SetBits(PORT_DAT, PIN_DAT)       

//初始化AD9833 GPIO

void AD9833_Init_GPIO()

{

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_InitStructure.GPIO_Pin = PIN_FSYNC|PIN_SCK|PIN_DAT;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(PORT_SCK, &GPIO_InitStructure);

}

/*

*********************************************************************************************************

*        函 数 名: AD9833_Delay

*        功能说明: 时钟延时

*        形    参: 无

*        返 回 值: 无

*********************************************************************************************************

*/

static void AD9833_Delay(void)

{

        uint16_t i;

        for (i = 0; i < 1; i++);

}

/*

*********************************************************************************************************

*        函 数 名: AD9833_Write

*        功能说明: 向SPI总线发送16个bit数据

*        形    参: TxData : 数据

*        返 回 值: 无

*********************************************************************************************************

*/

void AD9833_Write(unsigned int TxData)

{

        unsigned char i;

        SCK_1();

        //AD9833_Delay();

        FSYNC_1();

        //AD9833_Delay();

        FSYNC_0();

        //AD9833_Delay();

        for(i = 0; i < 16; i++)

        {

                if (TxData & 0x8000)

                        DAT_1();

                else

                        DAT_0();

               

                AD9833_Delay();

                SCK_0();

                AD9833_Delay();               

                SCK_1();

               

                TxData <<= 1;

        }

        FSYNC_1();

       

}

/*

*********************************************************************************************************

*        函 数 名: AD9833_WaveSeting

*        功能说明: 向SPI总线发送16个bit数据

*        形    参: 1.Freq: 频率值, 0.1 hz - 12Mhz

                          2.Freq_SFR: 0 或 1

                          3.WaveMode: TRI_WAVE(三角波),SIN_WAVE(正弦波),SQU_WAVE(方波)

                          4.Phase : 波形的初相位

*        返 回 值: 无

*********************************************************************************************************

*/

void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase )

{

                int frequence_LSB,frequence_MSB,Phs_data;

                double   frequence_mid,frequence_DATA;

                long int frequence_hex;

                /*********************************计算频率的16进制值***********************************/

                frequence_mid=268435456/25;//适合25M晶振

                //如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz

                frequence_DATA=Freq;

                frequence_DATA=frequence_DATA/1000000;

                frequence_DATA=frequence_DATA*frequence_mid;

                frequence_hex=frequence_DATA;  //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处理;

                frequence_LSB=frequence_hex; //frequence_hex低16位送给frequence_LSB

                frequence_LSB=frequence_LSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位

                frequence_MSB=frequence_hex>>14; //frequence_hex高16位送给frequence_HSB

                frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位

                Phs_data=Phase|0xC000;        //相位值

                AD9833_Write(0x0100); //复位AD9833,即RESET位为1

                AD9833_Write(0x2100); //选择数据一次写入,B28位和RESET位为1

                if(Freq_SFR==0)                                  //把数据设置到设置频率寄存器0

                {

                         frequence_LSB=frequence_LSB|0x4000;

                         frequence_MSB=frequence_MSB|0x4000;

                         //使用频率寄存器0输出波形

                        AD9833_Write(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入

                        AD9833_Write(frequence_MSB); //H14 频率寄存器的高14位数据输入

                        AD9833_Write(Phs_data);        //设置相位

                        //AD9833_Write(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/

            }

                if(Freq_SFR==1)                                //把数据设置到设置频率寄存器1

                {

                         frequence_LSB=frequence_LSB|0x8000;

                         frequence_MSB=frequence_MSB|0x8000;

                        //使用频率寄存器1输出波形

                        AD9833_Write(frequence_LSB); //L14,选择频率寄存器1的低14位输入

                        AD9833_Write(frequence_MSB); //H14 频率寄存器1为

                        AD9833_Write(Phs_data);        //设置相位

                        //AD9833_Write(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/

                }

                if(WaveMode==TRI_WAVE) //输出三角波波形

                         AD9833_Write(0x2002);

                if(WaveMode==SQU_WAVE)        //输出方波波形

                        AD9833_Write(0x2028);

                if(WaveMode==SIN_WAVE)        //输出正弦波形

                        AD9833_Write(0x2000);

}

ad9833如何接STM32

3、的是有源晶振

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢