
摘 要
通信的根本任务是传递信息,准确地传输数字信号是数字通信的一个极其重要的环节。数字信号在传输过程中会受到各种信号的干扰,而本数字信号分析仪就是为了实现数字信号传输性能测试。本分析仪由CPLD产生数字信号,其时钟信号由MCU控制,为模拟数字信号的传输信道而制作了截止频率分别为100kHz、200kHz、500kHz的低通滤波器,同时通过CPLD产生一个伪随机信号来模拟数字信号传输中的噪声,加法器将经过滤波器滤波之后的数字信号和伪随机噪声信号相加,相加之后的信号作为数字分析电路的输入信号,然后通过数字分析电路产生输出信号和此信号的同步信号,然后用示波器显示数字信号的眼图,通过对眼图的观察,分析数字信号的传输性能。实测结果表明,本系统实现了题目基本部分的各项设计指标,扩展部分的大多数指标。
关键词:数字信号 传输 滤波 噪声 眼图
1系统方案
本系统主要由数字信号发生器模块、低通滤波器模块、伪随机信号发生器模块、信号合成模块、数字信号分析模块,下面分别论证这几个模块的选择。
1.1 数字信号发生器的论证与选择
方案一:采用数字逻辑芯片实现n级线性移位寄存器发生器和其他门电路来产生m序列。此法硬件电路简单,成本低廉,但电路连线较多,工程量大,且电路产生的数字信号效果较差;
方案二:采用matlab仿真和单片机编程实现m序列输出。利用matlab计算出m序列,然后用单片机周期性输出该序列。此法几乎不需要额外的硬件电路,但m序列的计算难度稍大;
方案三:采用基于FPGA/CPLD的模块电路实现。利用FPGA/CPLD生成n级高速线性移位寄存器发生器和辅助逻辑电路来产生m序列。这种方法实现方法简单,便于仿真和设计,可以在短时间内设计完成,优势突出;
综合以上三种方案,选择设计方案三。
1.2 低通滤波器的论证与选择
方案一:采用无源LC滤波器实现。电路结构简单,容易实现,但其实际幅频特性不理想,增益控制较难;
方案二:由RC元件与运算放大器组成低通滤波器,可用在信息处理、数据传输、抑制干扰等方面,但因受运算放大器频带,这类滤波器主要用于低频范围。具有理想幅频特性的滤波器是很难实现的,只能用实际的幅频特性去逼近理想的。一般来说,滤波器的幅频特性越好,其相频特性越差,反之亦然。滤波器的阶数越高,幅频特性衰减的速率越快,但RC网络的节数越多,元件参数计算越繁琐,电路调试越困难;
方案三:采用极低噪声、高频有源滤波器集成电路芯片,其电路具有外围电路简单,幅频特性好,精度高等优点。可选用的高频滤波芯片有LT1568、LTC6256、LTC1560等芯片,其中LT1568是一款超低噪声的高频滤波模块,采用不同电阻值可以实现截止频率100kHz到10MHz的低通滤波器;
综合以上三种方案,选择方案二。
1.3 伪随机信号发生器的论证与选择
由于此部分和数字信号发生器部分的结构相似,故选择CPLD与数字信号发生器模块同时实现,以节约资源,降级能耗。
1.4 信号合成模块的论证与选择
方案一:采用集成运放组成反相加法电路实现噪声和信号的合成
反相加法器电路容易理解,且公式简单,但是电路反相,对于后续数字信号处理,电路反相之后仍需再加一级运放再次反相;
方案二:采用集成运放组成同相加法电路实现噪声和信号的合成
同相加法器信号计算公式叫复杂,电阻匹配要求较高,通常情况下,对原有输入信号有所放大或缩小,但是输入输出信号相位没有变化,且可以通过适当选择电阻实现原输入信号的相加,而不加上放大倍数;
综合考虑采用方案二。
1.5 数字分析模块的论证与选择
方案一:由硬件电路进行时钟分离,硬件电路较复杂,调试困难;
方案二:由CPLD,MCU等用软件编程的方法实现同步信号的实现,程序有很大的发挥创新空间。
综合考虑采用方案二。
2系统理论分析与计算
2.1 m序列数字信号
2.1.1 数字信号发生器部分的m序列的产生
该信号的多项式为f1(x)=1+x2+x3+x4+x8。在通信原理中有如下定理:
若一个n次多项式满足如下条件:
(1)、f(x)是既约的
(2)、f(x)可整除1+xm,m=2n-1
(3)、f(x)除不尽xq-1,q 由本原多项式产生的序列一定是m序列。 所以多项式f1(x)为本源多项式。其产生的m序列的循环周期(长度)为P=28-1=255。 2.1.2 伪随机信号发生器部分的m序列的产生 该信号的本源多项式为f1(x)=1+x1+x4+x5+x12。其产生的m序列的循环周期(长度)为P=212-1=4095。 2.2 低通滤波器设计 2.2.1 芯片选择 本设计选用linear公司的LT1568芯片,该芯片采用单+3V电源时的中心频率可高达 10MH,采用单个电阻器阻值来设定低通截止频率(200kHz <= fC <= 5MHz),不对称的电阻器阻值可将截止频率扩展100kHz-10MHz ,采用不同的电阻器阻值可实现带或不带增益的低通转移函数 (巴特沃斯、切比雪夫或定制) ,内部有一对2阶滤波器,可采用单 3V (最小值为 2.7V) 至 ±5V 电源运作,轨至轨输入和输出电压。 2.2.2 二阶参数计算 图1 LT1568的内部结构及外部测试电路 LT1568芯片的内部结构及外部测试电路如图1,图中包含左右两个二阶低通滤波,并连接成了两个的二阶低通滤波电路,单个二阶低通滤波的低通传输特性函数为: 其中,并不是OUTA或者OUTB,且 C1、C2是内部电容,典型值为: 2.2.3 四阶参数 为了获得更好的滤波特性,可以设置一个四阶滤波电路,如图2所示,其不同截止频率巴特罗斯低通滤波参数可在该芯片的datasheet中查到,如表1。 图2 四阶滤波器接法 表1 四阶滤波器参数设计 采用STM32单片机对传输的数字信号进行程序处理操作,从而提取处同步信号。 2.4 眼图显示 2.4.1 眼图形成原理 屏幕上的每个信号波形通过触发点对齐,眼图通过对信号多次触发采集后叠加生成,如图3。 图3 眼图形成原理 2.4.2 眼图显示方法 本简易数字信号传输性能分析仪使用示波器来显示眼图,数字信号分析电路输出数字信号及其同步信号,将分析电路的分析信号加到示波器的Y轴,将示波器的触发源选择在外接档,并将数字信号的同步信号通过示波器的外接输入探头输入,然后调整示波器的扫描时间间隔和其触发电平,就能得到稳定的眼图,如图4。 图4 眼图形成原理 3电路与程序设计 本系统由数字信号发生器模块、伪随机信号发生器、滤波电路模块、加法器模块、数字电路分析模块,显示器模块组成,如图5所示。 图5 系统总框图 3.1 单元电路设计 3.1.1 单元框图 图6 子系统组成框图 3.1.2 信号发生器单元设计 1、m序列产生模块的电路图如图6所示。Clk输入端为同步时钟,经过线性移位寄存器后用一组门电路作为反馈函数网络。该电路采用CPLD芯片EPM7128实现。由于该CPLD资源有限,同时提供了信号发生器和伪噪声发生器所需要的的逻辑器件。所以其输入时钟控制采用了一片STM32单片机,通过单片机按键可以实现对clk时钟从10kHz到100kHz步进10kHz可调,即是数字信号发生器的数据率从10kbps到100kbps步进10kbps可调,同时,用液晶显示数据率。 图7 序列产生电路 2、曼彻斯产生电路如图8所示。其中的m_gen子模块为m序列产生模块,将m序列与对应的同步时钟信号V1_clock一起输入到一个二输入异或门就可以得到m序列的曼特斯特编码V1_m。但由于异或门的输入端信号可能同时跳变产生竞争冒险现象,故在异或门后级加一个用晶振时钟同步的D触发器,以消除竞争冒险。该模块由CPLD实现。 图8 曼彻斯特编码电路 3.1.3 伪噪声信号产生单元设计 1、伪噪声信号产生子系统系统电路图如图9所示,该模块同样由CPLD实现。其输入时钟为20MHz的晶振时钟,经过二分频后得到10MHz的时钟,将之供给线性移位寄存器。 Qout 图9 伪随机信号发生器电路图 3.1.4 滤波器单元设计 通过查看LT1568的数据手册,针对滤波器不同的截止频率计算芯片外围电路中电阻的阻值,并 用该芯片的设计软件进行了设计验证,得到100kHz,200kHz,500kHz的滤波电路图分别为图10,图11,图12。 图10 图11 图12 因为要求滤波器要在0.2-4范围内增益可调,虽然LT1568这款芯片可以通过调整外围电路电阻的比值来实现增益的调整,但是因为其供电电压为±5V,如若滤波器的输入电压为TTL电平,则不能实现4倍放大,所以滤波芯片并没有设置放大,而采用在芯片后,级联一级反相放大电路,进行放大,同时,让滤波芯片的输出信号从/OUT端引出,反相放大电路如图13。 图13 3.1.5 加法器单元设计 为实现数字信号与噪声信号的叠加,采用图14所示同相加法电路,该电路能够实现V2,V3信号的同相相加,通过电阻计算,若R25=2R25=2R28=2R30=2R29,就能够使V2A=V2+V3。 图14 加法器模块电路 3.1.6 数字信号分析单元设计 数字信号分析模块采用一片STM32单片机实现 主程序为函数初始化和等待中断,比较简单,不做赘述。中断服务程序的流程图如下所示。 图15 中断服务程序流程图 4 测试结果 4.1 测试条件与仪器 测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。 测试仪器:YB4340G模拟示波器,TDS1012泰勒数字示波器,数字万用表,QF1750-2稳压稳流直流电源,YB1602P功率函数信号发生器。 4.2 测试结果及分析 4.2.1 基本要求部分 (1)数字信号发生器 仿真波形如下: 图16数字信号发生器的m序列仿真波形 数据率测试数据为: 表2 数据率测试数据 CPLD输出的数字信号高电平为3.4V,是TTL电平,满足题目要求。 (2) 低通滤波器 对低通滤波器截至频率测试时,输入信号为峰峰值为2V的正弦波 ①100kHz低通滤波测试数据如下: 表3 100kHz低通测试数据 ②200kHz低通滤波测试数据如下: 表4 200kHz低通测试数据 ③500kHz低通滤波测试数据如下: 表5 500kHz低通测试数据 经LT1568滤波之后的信号经反相端输出,然后经过一个反相放大器放大,测试得其放大倍数范围为0.03~6倍,满足0.2~4倍的题目要求。 带外衰减测试结果:四阶滤波,带外衰减远大于40 40dB/十倍频程,实际测试其十倍频程处信号已经mV级别,达到题目要求。 (3) 伪随机信号发生器 其仿真波形如下 图17 伪随机信号发生器m序列仿真波形 数据率测得为9.98Mbps-10.02Mbps,误差绝对值为0.2%,满足题目要求 输出信号峰峰值测试结果:最低可到50mV,最大可到3V,达到TTL电平,满足题目要求。 (4) 眼图观察 用数字信号发生器产生的时钟信号V1-clock进行同步得到眼图。测试中数字信号码率为100kHz,滤波器分别为为100kHz、200kHz、500kHz时对应的眼图,如下图所示。 Fc=100kHz fc=200kHz fc=500kHz 图18 眼图测试结果 眼图的具体测试数据如下表所示。 1测试条件:100mV噪声信号,100kHz低通滤波 表6 100kHz低通滤波下的眼图幅度测试数据 表7 200kHz低通滤波下的眼图幅度测试数据 表8 500kHz低通滤波下的眼图幅度测试数据 (1) 数字信号发生器输出的V1 采用曼彻斯特编码 由CPLD做,仿真波形如下: 图19 m序列和曼彻斯特编码仿真波形 (2) 用单片机提取同步信号和数字信号仪器输入到示波器得到眼图。 滤波器截止频率为100kHz时的眼图结果 提取的同步信号与m序列的clock信号周期相同;同步信号不是标准方波,而是一个负脉冲,但是当眼图显示的外部触发源已经足够;两个信号有一点点的相位差,但是在眼图的显示时,只需稍加调节触发电平就可以很好的显示眼图。 Fc=100kHz fc=200kHz fc=500kHz 图20 眼图测试结果 (3) 伪随机信号发生器输出信号 V3 幅度可调,V3 的峰峰值范围为100mV~TTL电平 此项已在基本要求数据测试中达到要求并说明 (4) 高噪声下的眼图(噪声的Vpp=2.4V) 图21 200kHz低通滤波后的眼图 图22 500kHz低通滤波后的眼图 4.2.3 测试分析与结论 根据上述测试数据和测试现象,由此可以得出以下结论: 1、滤波器截止频率较高时,能更好的对数字信号进行滤波,也就是传输性能更好;当滤波器截止频率较低时,数字信号的边缘被平缓话,对信号的传输造成较大影响。 2、通过对眼图的观察,可以了解数字信号的失真量,信号幅度等信息。 由于系统架构设计合理,功能电路实现较好,系统性能优良、稳定。 综上所述,本设计达到设计要求。 参考文献 [1] 杨素行.模拟电子技术基础.高等教育出版社.2006年. [2] 孙延鹏.VHDL与可编程逻辑器件.航空工业出版社.2006年. [3] 彭刚.基于ARM Cortex-M3的stm32系列嵌入式控制器应用实践.电子工业出版社.2010年. [2] 黄志伟.常用电路模块制作.北京航空航天大学出版社.2011年. 附录1:电路原理图 附录2:源程序 主程序: //头文件申明 #include "stm32f10x.h" #include "fsmc_sram.h" #include "stm32f10x.h" //结构体申明 ErrorStatus HSEStartUpStatus; TIM_TimeBaseInitTypeDef TIM8_TimeBaseStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseInitTypeDef TIM1_TimeBaseStructure; TIM_OCInitTypeDef TIM8_OCInitStructure; TIM_OCInitTypeDef TIM1_OCInitStructure; TIM_BDTRInitTypeDef TIM8_BDTRInitStructure; //子程序的申明 void EXTI_Configuration(void); void NVIC_Configuration(void); void RCC_Configuration(void); void GPIO_Configuration(void); void TIM_Config(int aa); void TIM_Configuration(int aa); void TIM1_Configuration(int aa); void TIM2_Configuration(void); void LCD_Input1(void); void lcd_rst(void); extern void LCD_Init(void); void LCD_displaychar(u16 Line,u16 Row,u8 Num); void LCD_displayABC(u16 Line,u16 Row,u8 Num); void Delay(__IO uint32_t nCount); int main(void) { #ifdef DEBUG debug(); #endif //初始化 RCC_Configuration(); EXTI_Configuration(); NVIC_Configuration(); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); GPIO_Configuration(); GPIO_SetBits(GPIOC, GPIO_Pin_7); FSMC_LCD_Init(); LCD_Init(); LCD_Input1(); TIM2_Configuration(); TIM_Cmd(TIM8,DISABLE); TIM_Config(7200); LCD_displayABC(150,224,1); LCD_displayABC(150,208,0); LCD_displayABC(150,192,46); LCD_displayABC(150,176,37); LCD_displayABC(150,160,51); LCD_displayABC(150,144,54); while (1) { } } //按键引脚的中断配置 void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource2); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource4); EXTI_ClearITPendingBit(EXTI_Line0); EXTI_ClearITPendingBit(EXTI_Line2); EXTI_ClearITPendingBit(EXTI_Line4); EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line2 | EXTI_Line4; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } //按键中断的NVIC配置 void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } //系统时钟配置 void RCC_Configuration(void) { RCC_DeInit(); //时钟控制寄存器全部恢复默认值 RCC_HSEConfig(RCC_HSE_ON); //外部高速时钟源开启(8M晶振) HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部时钟就绪 if(HSEStartUpStatus == SUCCESS) //如果时钟启动成功 { RCC_HCLKConfig(RCC_SYSCLK_Div1); //定义AHB设备时钟为系统时钟1分频 RCC_PCLK2Config(RCC_HCLK_Div1); //定义AHB2设备时钟为HCLK时钟1分频 RCC_PCLK1Config(RCC_HCLK_Div2); //定义AHB1设备时钟为HCLK时钟2分频 FLASH_SetLatency(FLASH_Latency_2); //设定内部FLASH的的延时周期为2周期 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能FLASH预存取缓冲区 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟为外部高速时钟的9倍频,8MHz * 9 = 72 MHz RCC_PLLCmd(ENABLE); //使能PLL时钟 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟设置完成准备就绪 { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //使用PLL时钟作为系统时钟源 while(RCC_GetSYSCLKSource() != 0x08) //返回系统所用时钟源确认为外部高速晶振,8M晶振。 { } } RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* TIM2 clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO| RCC_APB2Periph_TIM8| RCC_APB2Periph_TIM1, ENABLE); } //引脚配置 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //LCD所用引脚的配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //LCD-RST GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //LCD-RST GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_SetBits(GPIOD, GPIO_Pin_7); //CS=1 GPIO_SetBits(GPIOD, GPIO_Pin_14| GPIO_Pin_15 |GPIO_Pin_0 | GPIO_Pin_1); GPIO_SetBits(GPIOE, GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10); GPIO_ResetBits(GPIOE, GPIO_Pin_1); //RESET=0 GPIO_SetBits(GPIOD, GPIO_Pin_4); //RD=1 GPIO_SetBits(GPIOD, GPIO_Pin_5); //WR=1 GPIO_SetBits(GPIOD, GPIO_Pin_13); //按键引脚的GPIO配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //TIM8通道3的PWM输出引脚配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //端口模式为复用推拉输出方式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //翻转速度为50M GPIO_Init(GPIOC, &GPIO_InitStructure); //用以上几个参数初始化PC口 //TIM1通道1的PWM输出引脚配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //端口模式为复用推拉输出方式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //翻转速度为50M GPIO_Init(GPIOA, &GPIO_InitStructure); //用以上几个参数初始化PA口 } //定时器输出PWM的配置 void TIM_Config(int aa) { TIM_DeInit(TIM8); //复位定时器8所有寄存器 /* Time Base configuration */ TIM8_TimeBaseStructure.TIM_Prescaler = 0; //预分频数为0,不分频 TIM8_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计娄方式为顺序计数模式,增大型 TIM8_TimeBaseStructure.TIM_Period =aa-1; TIM8_TimeBaseStructure.TIM_ClockDivision = 0x00; //配置时钟分隔值 TIM8_TimeBaseStructure.TIM_RepetitionCounter = 0x0; //循环计数次数值 TIM_TimeBaseInit(TIM8,&TIM8_TimeBaseStructure); //用以上参数初始化定时器时间基础模块 /* Channel 1 Configuration in PWM mode */ TIM8_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //输出方式为PWM模式1 TIM8_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出比较状态 TIM8_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //使能定时器互补输出 TIM8_OCInitStructure.TIM_Pulse =(int)(aa/2); //设置脉宽 TIM8_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出比较极性为低 TIM8_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //打开空闲状态选择关闭 /* 初始化TM8通道1*/ TIM_OC3Init(TIM8,&TIM8_OCInitStructure); //用以上参数初始化TIM8的通道1 /* TIM8 counter enable */ TIM_Cmd(TIM8,ENABLE); //使能定时器8 /* Main Output Enable */ TIM_CtrlPWMOutputs(TIM8,ENABLE); //使能定时器8的PWM输出 TIM_DeInit(TIM1); //复位定时器8所有寄存器 /* Time Base configuration */ TIM1_TimeBaseStructure.TIM_Prescaler = 0; //预分频数为0,不分频 TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计娄方式为顺序计数模式,增大型 TIM1_TimeBaseStructure.TIM_Period =aa-1; TIM1_TimeBaseStructure.TIM_ClockDivision = 0x00; //配置时钟分隔值 TIM1_TimeBaseStructure.TIM_RepetitionCounter = 0x0; //循环计数次数值 TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseStructure); //用以上参数初始化定时器时间基础模块 /* Channel 1 Configuration in PWM mode */ TIM8_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //输出方式为PWM模式1 TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出比较状态 TIM1_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //使能定时器互补输出 TIM1_OCInitStructure.TIM_Pulse =(int)(aa/2); //设置脉宽 TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出比较极性为低 TIM1_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //打开空闲状态选择关闭 /* 初始化TM8通道1*/ TIM_OC1Init(TIM1,&TIM1_OCInitStructure); //用以上参数初始化TIM8的通道1 /* TIM8 counter enable */ TIM_Cmd(TIM1,ENABLE); //使能定时器8 /* Main Output Enable */ TIM_CtrlPWMOutputs(TIM1,ENABLE); //使能定时器8的PWM输出 } void TIM_Configuration(int aa) { TIM8_TimeBaseStructure.TIM_Period =aa-1; TIM_TimeBaseInit(TIM8,&TIM8_TimeBaseStructure); //用以上参数初始化定时器时间基础模块 TIM8_OCInitStructure.TIM_Pulse =(int)(aa/2); //设置脉宽 /* 初始化TM8通道1*/ TIM_OC3Init(TIM8,&TIM8_OCInitStructure); //用以上参数初始化TIM8的通道1 /* TIM8 counter enable */ TIM_Cmd(TIM8,ENABLE); //使能定时器8 /* Main Output Enable */ TIM_CtrlPWMOutputs(TIM8,ENABLE); //使能定时器8的PWM输出 } void TIM1_Configuration(int aa) { TIM1_TimeBaseStructure.TIM_Period =aa-1; TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseStructure); //用以上参数初始化定时器时间基础模块 TIM1_OCInitStructure.TIM_Pulse =(int)(aa/2); //设置脉宽 /* 初始化TM8通道1*/ TIM_OC1Init(TIM1,&TIM1_OCInitStructure); //用以上参数初始化TIM8的通道1 /* TIM8 counter enable */ TIM_Cmd(TIM1,ENABLE); //使能定时器8 /* Main Output Enable */ TIM_CtrlPWMOutputs(TIM1,ENABLE); //使能定时器8的PWM输出 } //计数器TIM2的配置 void TIM2_Configuration(void) { TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0x00; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base configuration TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); TIM_SetCounter(TIM2, 0); TIM_Cmd(TIM2, ENABLE); } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file, uint32_t line) { while (1) { } } #endif 中断服务程序 //中断处理程序 #include "stm32f10x_it.h" void LCD_displayABC(u16 Line,u16 Row,u8 Num); void LCD_displaychar(u16 Line,u16 Row,u8 Num); void TIM_Configuration(int aa); void TIM1_Configuration(int aa); void Delay(__IO uint32_t nCount); int a[10]={7200,3600,2400,1800,1440,1200,1028,900,800,720}; volatile int i=0; volatile int flag=20; volatile int counter=0; //外部按键中断的中断处理程序 void EXTI0_IRQHandler(void) { Delay(120000);//消除抖动 if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)) while(1) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)) goto label2; } label2: Delay(2200000); if(i==9) i==9; else i+=1; if(i==9) { //在LCD上显示相应的信息 LCD_displayABC(150,224,1); LCD_displayABC(150,208,0); LCD_displayABC(150,192,0); LCD_displayABC(150,176,46); LCD_displayABC(150,160,37); LCD_displayABC(150,144,51); LCD_displayABC(150,128,54); } else { //在LCD上显示相应的信息 LCD_displayABC(150,224,(i+1)); LCD_displayABC(150,208,0); LCD_displayABC(150,192,46); LCD_displayABC(150,176,37); LCD_displayABC(150,160,51); LCD_displayABC(150,144,54); } //输出时钟 TIM_Cmd(TIM8,DISABLE); TIM_Configuration(a[i]); EXTI_ClearITPendingBit(EXTI_Line0); } //曼彻斯上升沿中断处理程序 void EXTI2_IRQHandler(void) { counter = TIM_GetCounter(TIM2); TIM_Cmd(TIM2, DISABLE); TIM_SetCounter(TIM2, 0); TIM_Cmd(TIM2, ENABLE); if(counter<=(flag+20)) { flag=counter; TIM_Cmd(TIM1,DISABLE); TIM1_Configuration(flag); //输出同步信号 } EXTI_ClearITPendingBit(EXTI_Line2); } //外部按键中断的中断处理程序 void EXTI4_IRQHandler(void) { Delay(120000); if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)) while(1) { if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)) goto label1; } label1: Delay(2200000); if(i==0) i=0; else i-=1; //输出时钟 TIM_Cmd(TIM8,DISABLE); TIM_Configuration(a[i]); //在LCD上显示相应的信息 LCD_displaychar(150,128,36); LCD_displayABC(150,224,(i+1)); LCD_displayABC(150,208,0); LCD_displayABC(150,192,46); LCD_displayABC(150,176,37); LCD_displayABC(150,160,51); LCD_displayABC(150,144,54); EXTI_ClearITPendingBit(EXTI_Line4); }
2.3 同步信号提取 截止频率(kHz) R11,R21 R31 R12,R22 R32 100 10.5k 15.8k 18.2k 8.87k 200 5.23k 7.87k 9.31k 4.42k 500 2.1k 3.16k 3.74k 1.78k
数据率误差均不大于0.25%,小于1%,满足题目要求。理论数据率(kbps) 10 20 30 40 50 测试值(kbps) 10.00 20.00 29.94 40.00 50.00 误差 0 0 0.200% 0 0 理论数据率(kbps) 60 70 80 90 100 测试值(kbps) 59.90 70.10 80.20 90.05 100 误差 0.167% 0.143% 0.250% 0.005% 0
测得其截止频率为101k,误差为1%信号频率(kHz) 10 30 50 70 80 90 输出电压p-p(V) 2.00 2.00 2.00 1.96 1.84 1.68 信号频率(kHz) 100 150 200 输出电压p-p(V) 1.42 400mV 250mV
测得其截止频率为191k,误差为4.5%信号频率(kHz) 10 30 50 70 90 110 输出电压p-p(V) 2.00 2.00 1.98 2.00 2.00 1.96 信号频率(kHz) 130 150 170 180 190 200 输出电压p-p(V) 1.93 1.90 1.76 1.52 1.42 1.30 信号频率(kHz) 250 400 输出电压p-p(V) 760 mV 190 mV
测得其截止频率为494k,误差为1.2%信号频率(kHz) 50 100 150 200 250 300 输出电压p-p(V) 2.00 2.00 1.96 1.96 1.96 1.92 信号频率(kHz) 350 400 450 500 700 1000 输出电压p-p(V) 1.88 1.76 1.62 1.36 440mV 128mV 信号频率(kHz) 1500 2000 输出电压p-p(V) 30mV 17.2mV
2测试条件:100mV噪声信号,200kHz低通滤波数据率/kbps 10 20 30 40 50 60 70 80 90 100 眼幅度/V 3.4 3.4 3.4 3.4 3.4 3.4 3.4 3.4 3.4 3.5
3测试条件:100mV噪声信号,500kHz低通滤波数据率/kbps 10 20 30 40 50 60 70 80 90 100 眼幅度/V 3.4 3.3 3.4 3.4 3.4 3.35 3.4 3.5 3.5 3.4
4.2.2 发挥部分数据率/kbps 10 20 30 40 50 60 70 80 90 100 眼幅度/V 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2 3.2
