24年电赛C题-无线传输信号模拟系统

  • 1、赛题回顾
  • 2、系统软件介绍
  • 3、硬件部分说明
  • 3.1、放大模块电路
  • 3.2、乘法器
  • 4、系统程序设计
  • 4.1、系统初始化
  • 4.2、AD9834驱动程序
  • 5、资料下载

1、赛题回顾

2024年全国大学生电子设计竞赛C题-无线传输信号模拟系统_CLR


2024年全国大学生电子设计竞赛C题-无线传输信号模拟系统_#c语言_02

2024年全国大学生电子设计竞赛C题-无线传输信号模拟系统_CLR_03


2024年全国大学生电子设计竞赛C题-无线传输信号模拟系统_#c语言_04


2024年全国大学生电子设计竞赛C题-无线传输信号模拟系统_#c语言_05

2024年全国大学生电子设计竞赛C题-无线传输信号模拟系统_乘法器_06

2、系统软件介绍

  • 按键通过中断触发,STM32F103 使用 SPI 协议向 AD9959 DDS 信号发生器发送 4 路可变幅值、频率和相位的正弦信号。按键还能用来实时修改这些幅值、频率和相位参数,并通过 SPI 将设置值传给 AD9959。除此之外,STM32F103 还控制继电器闭合状态,以选择输出的是 AM 信号还是 CW 信号。

系统流程图:

2024年全国大学生电子设计竞赛C题-无线传输信号模拟系统_乘法器_07

3、硬件部分说明

  • 核心控制电路:STM32F103,Cortex-M3内核,最高频率72MHz,Flash存储器64KB或128KB,SRAM存储器20KB,支持模拟转换,包括12位ADC和12位DAC。
  • DDS信号发生器电路:AD9959,4个同步DDS通道,正好可以发送两个载波和调制波,通道间独立的频率/相位/幅度控制,可以同时设置两个不同的频率/相位/幅度,频率/相位/幅度变化的延迟匹配。
  • OPA847,是一款宽带、超低失真、超低噪声的电 压反馈型运算放大器。模块支持最高正负6.5V供电、高达3.9G的增益带宽积、 950V/us 的压摆率、高达75mA的输出驱动电流,可广泛的应用于ADC前端放 大、宽带高增益放大器以及低噪声差动放大器等场合。同时模块预留了接线端子 的信号输入输出接口,方便客户在低频应用时,可选择端子连接。

3.1、放大模块电路

  • OPA690提供了高输出功率能力与宽带,单位增益稳定电压反馈运放的卓越组合,使用新的高转换率输入级。输入级提供非常高的转换率(1800 V/us),同时消耗相对较低的静态电流(5.5 mA)。

电路:

2024年全国大学生电子设计竞赛C题-无线传输信号模拟系统_初始化_08

3.2、乘法器

  • 采用PDIP-8或者SOIC-8封装,能够完成W-XY十2功能,X和Y输入信号范围为-1~+1V,带宽为250MHz,在20ns内可稳定到满刻度的±0.1%,乘法器噪声为50nV/根号Hz,差分乘法器输入X和y、求和输入Z具有高的输入匪抗,输出引脚端W具有低的输出阻抗,输出电压范围为-2.5~+2.5V,可驱动负载电阻为25Q。其电源电压为±5V,电流消耗为25mA;工作温度范围为-40~+85℃。

电路:

2024年全国大学生电子设计竞赛C题-无线传输信号模拟系统_初始化_09

4、系统程序设计

4.1、系统初始化

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);MYDMA1_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)¤tadc,1);Usart1_Init();delay_init();LED_Init();EXTIX_Init();LCD_Init();Adc_Init();BEEP_Init();KEY_Init();TIM2_PWM_Init(T-1,pre-1);TIM4_Int_Init(72,10000); LCD_Clear(BLACK);LCD_Display_Dir(0);window();MySPI_Init();Digres_Set1(26);Digres_Set2(170);LCD_ShowNum(1,1,0,8,16);ad9959_gpio_init();ad9959_set_signal_out(1,30000000,0,491*0.9);ad9959_set_signal_out(0,2000000,0,1023); ad9959_set_signal_out(3,2000000,0,1000);ad9959_set_signal_out(2,39000000,0,700);jidianqi_Init();Key_Init();

4.2、AD9834驱动程序

/**************************************************************** 函数名称: AD9834_Write_16Bits 功    能: 向AD9834写入16为数据 参    数: data --  要写入的16位数据 返回值  : 无 *****************************************************************/ void AD9834_Write_16Bits(unsigned int data) 
{ unsigned char i = 0 ; AD9834_SCLK_SET ; AD9834_FSYNC_CLR ; for(i=0 ;i<16 ;i++)      { if(data & 0x8000) AD9834_SDATA_SET ; else AD9834_SDATA_CLR ; AD9834_SCLK_CLR ; data <<= 1 ; AD9834_SCLK_SET ; } AD9834_SDATA_SET ; AD9834_FSYNC_SET ; 
} /*********************************************************************************** 函数名称:AD9834_Select_Wave 功    能:软件为控制, -------------------------------------------------- IOUT正弦波 ,SIGNBITOUT方波 ,写FREQREG0 ,写PHASE0 ad9834_write_16bit(0x2028)   一次性写FREQREG0 ad9834_write_16bit(0x0038)   单独改写FREQREG0的LSB ad9834_write_16bit(0x1038)   单独改写FREQREG0的MSB -------------------------------------------------- IOUT三角波 ,写PHASE0 ad9834_write_16bit(0x2002)   一次性写FREQREG0 ad9834_write_16bit(0x0002)   单独改写FREQREG0的LSB ad9834_write_16bit(0x1008)   单独改写FREQREG0的MSB 参    数:initdata -- 要输入的命令 返回值  :无 ************************************************************************************/ 
void AD9834_Select_Wave(unsigned int initdata) { AD9834_FSYNC_SET; AD9834_SCLK_SET; AD9834_RESET_SET; AD9834_RESET_SET; AD9834_RESET_CLR;AD9834_Write_16Bits(initdata); } /**************************************************************** 函数名称: Init_AD9834 功    能: 初始化AD9834控制引脚 参    数: 无 返回值  : 无 *****************************************************************/ 
// B6 FS  B5 PS    B7 FSY   B8 SCK   B9 SDA B10 RST void AD9834_Init() {GPIO_InitTypeDef GPIO_InitStructure ; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);	 //使能PB,PE端口时钟GPIO_InitStructure.GPIO_Pin = AD9834_FSYNC | AD9834_SCLK | AD9834_SDATA | AD9834_RESET|AD9834_FS|AD9834_PS ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; GPIO_Init(AD9834_Control_Port ,&GPIO_InitStructure) ; GPIO_ResetBits(GPIOB, AD9834_FS);GPIO_ResetBits(GPIOB, AD9834_PS);AD9834_Write_16Bits(0x2100);AD9834_Write_16Bits(0x2038);AD9834_Write_16Bits(0XC000);AD9834_Write_16Bits(0x2100);
} /**************************************************************** 函数名称: AD9834_Set_Freq 功    能: 设置频率值 参    数: freq_number -- 要写入的平率寄存器(FREQ_0或FREQ_1) freq -- 频率值 (Freq_value(value)=Freq_data(data)*FCLK/2^28) 返回值  : 无 *****************************************************************/ 
void AD9834_Set_Freq(unsigned char freq_number, unsigned long freq) 
{unsigned long FREQREG = (unsigned long)(268435456.0/AD9834_SYSTEM_COLCK*freq); unsigned int FREQREG_LSB_14BIT = (unsigned int)FREQREG; unsigned int FREQREG_MSB_14BIT = (unsigned int)(FREQREG>>14); if(freq_number == FREQ_0) { FREQREG_LSB_14BIT &= ~(1U<<15); FREQREG_LSB_14BIT |= 1<<14; FREQREG_MSB_14BIT &= ~(1U<<15); FREQREG_MSB_14BIT |= 1<<14; }else{FREQREG_LSB_14BIT &= ~(1<<14); FREQREG_LSB_14BIT |= 1U<<15; FREQREG_MSB_14BIT &= ~(1<<14); FREQREG_MSB_14BIT |= 1U<<15; } AD9834_Write_16Bits(FREQREG_LSB_14BIT); AD9834_Write_16Bits(FREQREG_MSB_14BIT);      
}