备赛2023:关于信号发生器DDS的学习

备赛2023:关于信号发生器DDS的学习

本文仅做学习使用,为备战23电赛所写总结

一、AD9959

1.特性参数
模块供电:5V
模块驱动电流:400mA(MAX)
模块带宽:200MHz
模块输出波形:正弦波
模块频率最小步进:1Hz
模块最大输出幅值:500mVPP左右(正弦波,可调,频率越高,最大输出电压越低);
AD9959模块资料链接
2.代码例程分析
①AD9959含有四个通道CH0、CH1、CH2、CH3(AD9959.c)

void Init_AD9959(void) //AD9959 初始化
void Intserve(void) //IO 口初始化
//引AD9959.c文件时,由于没有task-manage.c,以下三个函数可直接加入main.c中使用出波
void Write_frequence(u8 Channel,u32 Freq) //设置通道输出频率,Channel 输出通道,Freq输出频率
void Write_Amplitude(u8 Channel, u16Ampli) //设置通道输出幅度,Channel 输出通道,Ampli 输出幅度
void Write_Phase(u8 Channel,u16 Phase) //设置通道输出相位,Channel 输出通道,Phase输出相位

② 调频,调幅,调相(task-manage.c)

//task-manage.c
u32 SinFre[5] = {50, 50, 50, 50}; //四通道输出频率设置
u32 SinAmp[5] = {1023, 1023, 1023, 1023}; //四通道输出幅度设置
u32 SinPhr[5] = {0, 4095, 4095*3, 4095*2}; //四通道输出相位设置
//扫频设置
u32 SweepMinFre = 1000;//扫频最小频率
u32 SweepMaxFre = 10000;//扫频最大频率
u32 SweepStepFre = 100;//扫频的步进值
u16 SweepTime = 1;//扫频时间ms
void Set_PointFre(u32 Key_Value, u8* Task_ID)//可自焊按键调频率幅值加减
{
	//按键判断
	switch(Key_Value)
	{
		case K_4_S: fre_buf[P_Index]++;break;
		case K_4_L: fre_buf[P_Index]++;break;
		case K_5_L: P_Index++;break;
		case K_5_S: P_Index++;break;
		case K_1_L: P_Index--;break;
		case K_1_S: P_Index--;break;
		case K_3_S: fre_buf[P_Index]--;break;
		case K_3_L: fre_buf[P_Index]--;break;
		case K_2_S: Param_Mode++;break;
	}
}

③自焊DDS调频、调值按键配置,引脚配置:
要注意引脚的修改是否可以,我在做另一个题时修改了按键的引脚发现按键根本不起作用,猜测可能是按键的GPIO口并不能随意修改。

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	GPIOStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIOStructure.GPIO_Pin =GPIO_Pin_11 + GPIO_Pin_12 + GPIO_Pin_13 + GPIO_Pin_14 + GPIO_Pin_15;
	GPIOStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOB, &GPIOStructure);

④定时器中断服务函数里配置了扫频
task.c里的扫频函数是对应按键控制的,此处扫频为扫频时间的设置

if(SweepFlag)
		{
			count++;
			if(count>=10*SweepTime)
			{
				count=0;
				count1++;
				NowFre = SweepMinFre+SweepStepFre*count1;//当前扫频频率
				if(NowFre>SweepMaxFre) count1 = 0;
				//写数据 
				AD9954_SETFRE(NowFre);
				Write_frequence(3,NowFre);
				Write_frequence(0,NowFre); 
				Write_frequence(1,NowFre);
				Write_frequence(2,NowFre);
			}
		}

二、AD9854

1.特性参数
模块供电:7~9V
模块驱动电流:600mA左右
模块带宽:150MHz(两路加120MHz低通滤波器)
模块输出波形:正弦波,方波
模块频率最小步进:1Hz
模块默认接口:并行可编程接口
模块最大输出幅值:500mVPP左右(正弦波,可调,频率越高,最大输出电压越低);4.5VPP左右(方波,不可调)
2.代码例程分析
AD9854有通道 1 和通道 4 为低通滤波器输出,通道 2 和通道 3 为直接输出。

//AD9854只需一个函数就可实现频率、幅值、相位改变,main.c直接引用
voidAD9854_Init(void)//AD9854 初始化
voidAD9854_SetSine(ulong Freq,uint Shape)// Freq 频率设置,取值范围为 0~(1/2)*SYSCLK
// Shape 幅度设置,为 12bit,取值范围为(0~4095),取值越大,幅度越大

其余与AD9959基本一致

三、AD9910

1.特性参数
模块供电:5V
模块带宽:400MHz
模块输出波形:正弦波
该模块尚未研究透彻,待更新
2.代码例程分析

//AD9910初始化,频率、幅值的改变
void Init_ad9910(void);
void Freq_convert(ulong Freq)
{
	  ulong Temp;            
	  Temp=(ulong)Freq*4.294967296;	   //将输入频率因子分为四个字节  主频1GHz,32位相位累加器,故每Hz在的控制字增量 delta =  4.294967296 = (2^32)/1000000000
	  profile11[7]=(uchar)Temp;
	  profile11[6]=(uchar)(Temp>>8);
	  profile11[5]=(uchar)(Temp>>16);
	  profile11[4]=(uchar)(Temp>>24);
	  Txfrc();
}
void AD9910_AmpWrite(uint16_t Amp)
{
		profile11[0] = (Amp%16384)>>8;
		profile11[1] = (Amp%16384)&0xff;
	  Txfrc();
}

其余扫频等配置与AD9959基本一致。

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值