STM32驱动AD9833模块

前言

淘宝上买了个AD9833模块,stm32用商家的例程代码可以调频,可以调相,就是调不了幅度。换了几块不同32开发板都不行,重新以正点原子F103的工程为基础把驱动移植进去,最后实现了调幅的功能。这里把代码放上来,希望能帮助遇到相同问题的同学。

软硬件准备

一、本次使用的硬件

开发板:stm32f103c8t6核心板
请添加图片描述

模块:AD9833模块
请添加图片描述

二、代码

main.c

#include "AD9833.h"
#include "delay.h"
#include "sys.h"

 int main(void)
 {	
	delay_init();	    	 //延时函数初始化	  
	AD9833_Init();		  	//初始化与AD9833连接的硬件接口
	AD9833_WaveSeting(2000.0,0,SIN_WAVE,0 );//2KHz,	频率寄存器0,正弦波输出 ,初相位0 
    AD9833_AmpSet(80);	//设置幅值,幅值最大 255
	while(1)
	{
		
		delay_ms(100);
	}
 }


链接

工程文件的百度云盘在这里,有需要的可以自行使用。
链接:https://pan.baidu.com/s/1mKp7UMKiQmCrUPPJKJdTaA
提取码:aqdp

  • 33
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
以下是通过STM32F103驱动AD9833的基本代码,主要是SPI通信部分的代码: ```c #include "stm32f10x.h" #define AD9833_CS_LOW() GPIO_ResetBits(GPIOB, GPIO_Pin_12) #define AD9833_CS_HIGH() GPIO_SetBits(GPIOB, GPIO_Pin_12) SPI_InitTypeDef SPI_InitStructure; void AD9833_Init() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // AD9833 CS引脚初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // SPI1初始化 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); } void AD9833_Write(unsigned short value) { AD9833_CS_LOW(); // 写入控制字节 SPI1->DR = (value >> 8) | 0x40; while ((SPI1->SR & SPI_I2S_FLAG_TXE) == 0); while ((SPI1->SR & SPI_I2S_FLAG_RXNE) == 0); while ((SPI1->SR & SPI_I2S_FLAG_BSY) != 0); // 写入数据字节 SPI1->DR = value & 0xFF; while ((SPI1->SR & SPI_I2S_FLAG_TXE) == 0); while ((SPI1->SR & SPI_I2S_FLAG_RXNE) == 0); while ((SPI1->SR & SPI_I2S_FLAG_BSY) != 0); AD9833_CS_HIGH(); } ``` 以上代码中,AD9833_Init()函数用于初始化AD9833模块,包括CS引脚和SPI接口的初始化;AD9833_Write()函数用于向AD9833模块写入控制字节和数据字节,其中包括了SPI数据传输的相关代码。 需要注意的是,AD9833模块的控制字节和数据字节的格式和时序比较严格,需要根据AD9833的数据手册进行正确的配置。同时,在代码中需要保证SPI传输的正确性,以避免数据传输错误。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值