基于STM32控制AD9833输出波形

本文介绍了使用STM32F103C8微控制器控制AD9833模块产生不同频率的DDS波形(如方波、正弦波或三角波),并通过I2C连接OLED屏幕实时显示频率和占空比。展示了如何编写主函数来初始化设备并进行数据交换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过STM32控制AD9833模块输出相应频率的DDS波形,(方波或正弦波或三角波),并将频率显示在OLED屏幕上。

实验设备:1.STM32F103C8 ,2.AD9833模块,3.OLED,4.示波器

OLED和STM32F103C8之间是I2C通讯,AD9833和STM32F103C8之间是SPI通讯,实验了20kHz的方波输出,实物连线图如下:

示波器实测如下:

代码:

主函数:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD9833.h"
#include "IC.h"


int main(void)
{
  AD9833_Init();		  	//³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
	AD9833_WaveSeting(20000.0,0,SQU_WAVE,0 );//20KHz,	ƵÂʼĴæÆ÷0£¬ÕýÏÒ²¨Êä³ö ,³õÏàλ0 
  	
	IC_Init();
	
	OLED_Init();
	OLED_ShowString(1, 1, "Freq:00000Hz");
	OLED_ShowString(2, 1, "Duty:00%");	
		
	while (1)
	{
		Delay_ms(100);
		OLED_ShowNum(1, 6, IC_GetFreq(), 5);
		OLED_ShowNum(2, 6, IC_GetDuty(), 2);
		OLED_ShowNum(3, 2, TIM_GetCapture1(TIM3)+1, 6);
		OLED_ShowNum(4, 2, TIM_GetCapture2(TIM3)+1, 6);
	}
}

2)AD9833

#ifndef __AD9833_H
#define __AD9833_H	 
#include "stm32f10x.h"                  // Device header



#define TRI_WAVE 	0  		//Êä³öÈý½Ç²¨
#define SIN_WAVE 	1		//Êä³öÕýÏÒ²¨
#define SQU_WAVE 	2		//Êä³ö·½²¨

void AD9833_Init(void);
void AD9833_WaveSeting(double frequence,unsigned int frequence_SFR,unsigned int WaveMode,unsigned int Phase );
void AD9833_Init_GPIO(void);
void AD9833_AmpSet(unsigned char amp);		 				    
#endif

#include "AD9833.h"
#include "Delay.h"

#define		FSYNC_1()     	GPIO_SetBits(GPIOB,GPIO_Pin_15)//Êä³ö¸ß
#define		FSYNC_0()   	GPIO_ResetBits(GPIOB,GPIO_Pin_15)//Êä³öµÍ
#define     SCK_1()			GPIO_SetBits(GPIOB,GPIO_Pin_14)//Êä³ö¸ß
#define 	SCK_0()			GPIO_ResetBits(GPIOB,GPIO_Pin_14)//Êä³öµÍ
#define 	DAT_1()			GPIO_SetBits(GPIOB,GPIO_Pin_13)//Êä³ö¸ß
#define 	DAT_0()			GPIO_ResetBits(GPIOB,GPIO_Pin_13)//Êä³öµÍ
#define 	CS_1()			GPIO_SetBits(GPIOB,GPIO_Pin_12)//Êä³ö¸ß
#define 	CS_0()			GPIO_ResetBits(GPIOB,GPIO_Pin_12)//Êä³öµÍ

void AD9833_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //ʹÄÜPB,PE¶Ë¿ÚʱÖÓ
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;				
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //ÍÆÍìÊä³ö
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO¿ÚËÙ¶ÈΪ50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOB.5
 GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);						 //PB.5 Êä³ö¸ß

}
 

/*
*********************************************************************************************************
*	º¯ Êý Ãû: AD9833_Write
*	¹¦ÄÜ˵Ã÷: ÏòSPI×ÜÏß·¢ËÍ16¸öbitÊý¾Ý
*	ÐÎ    ²Î: TxData : Êý¾Ý
*	·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
void AD9833_Write(unsigned int TxData)
{
	uint8_t i;
	
	SCK_0();
	Delay_us(2);
	SCK_1();
	Delay_us(2);
	FSYNC_1();
	Delay_us(2);
	FSYNC_0();
	Delay_us(2);
	for(i = 0; i < 16; i++)
	{
		if(TxData&0x8000)
			DAT_1();
		else
			DAT_0();

			

		Delay_us(2);
		SCK_0();
		Delay_us(2);	
		SCK_1();
		
		TxData <<= 1;
	}
	FSYNC_1();
	
} 



/*
*********************************************************************************************************
*	º¯ Êý Ãû: AD9833_AmpSet
*	¹¦ÄÜ˵Ã÷: ¸Ä±äÊä³öÐźŷù¶ÈÖµ
*	ÐÎ    ²Î: 1.amp £º·ù¶ÈÖµ  0- 255
*	·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/ 


void AD9833_AmpSet(unsigned char amp)
{
	unsigned char i;
	unsigned int temp;
   	
	CS_0();
	temp =0x1100|amp;
	for(i=0;i<16;i++)
	{
	    SCK_0();	
	   if(temp&0x8000)
	   	DAT_1();
	   else
		DAT_0();
		temp<<=1;
	    SCK_1();
	   Delay_us(2);
	}
	
   	CS_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 : ²¨ÐεijõÏàλ
*	·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/ 
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); 

}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值