最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

简易数字信号传输性能分析仪论文

来源:动视网 责编:小OO 时间:2025-10-01 17:15:04
文档

简易数字信号传输性能分析仪论文

简易数字信号传输性能分析仪(E题)摘要通信的根本任务是传递信息,准确地传输数字信号是数字通信的一个极其重要的环节。数字信号在传输过程中会受到各种信号的干扰,而本数字信号分析仪就是为了实现数字信号传输性能测试。本分析仪由CPLD产生数字信号,其时钟信号由MCU控制,为模拟数字信号的传输信道而制作了截止频率分别为100kHz、200kHz、500kHz的低通滤波器,同时通过CPLD产生一个伪随机信号来模拟数字信号传输中的噪声,加法器将经过滤波器滤波之后的数字信号和伪随机噪声信号相加,相加之后的信号
推荐度:
导读简易数字信号传输性能分析仪(E题)摘要通信的根本任务是传递信息,准确地传输数字信号是数字通信的一个极其重要的环节。数字信号在传输过程中会受到各种信号的干扰,而本数字信号分析仪就是为了实现数字信号传输性能测试。本分析仪由CPLD产生数字信号,其时钟信号由MCU控制,为模拟数字信号的传输信道而制作了截止频率分别为100kHz、200kHz、500kHz的低通滤波器,同时通过CPLD产生一个伪随机信号来模拟数字信号传输中的噪声,加法器将经过滤波器滤波之后的数字信号和伪随机噪声信号相加,相加之后的信号
简易数字信号传输性能分析仪(E题)

摘  要 

通信的根本任务是传递信息,准确地传输数字信号是数字通信的一个极其重要的环节。数字信号在传输过程中会受到各种信号的干扰,而本数字信号分析仪就是为了实现数字信号传输性能测试。本分析仪由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则称f(x)为本原多项式。

由本原多项式产生的序列一定是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 四阶滤波器参数设计

截止频率(kHz)

R11,R21

R31R12,R22

R32
10010.5k15.8k18.2k8.87k
2005.23k7.87k9.31k4.42k
5002.1k3.16k3.74k1.78k
2.3 同步信号提取  

    采用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 数据率测试数据

理论数据率(kbps)

1020304050
测试值(kbps)

10.0020.0029.9440.0050.00
误差000.200%00
理论数据率(kbps)

60708090100
测试值(kbps)

59.9070.1080.2090.05100
误差0.167%0.143%0.250%0.005%0
数据率误差均不大于0.25%,小于1%,满足题目要求。

CPLD输出的数字信号高电平为3.4V,是TTL电平,满足题目要求。

(2) 低通滤波器

对低通滤波器截至频率测试时,输入信号为峰峰值为2V的正弦波

①100kHz低通滤波测试数据如下:

表3  100kHz低通测试数据

信号频率(kHz)

103050708090
输出电压p-p(V)

2.002.002.001.961.841.68
信号频率(kHz)

100150200
输出电压p-p(V)

1.42400mV250mV
测得其截止频率为101k,误差为1%

②200kHz低通滤波测试数据如下:

表4  200kHz低通测试数据

信号频率(kHz)

1030507090110
输出电压p-p(V)

2.002.001.982.002.001.96
信号频率(kHz)

130150170180190200
输出电压p-p(V)

1.931.901.761.521.421.30
信号频率(kHz)

250400
输出电压p-p(V)

760 mV190 mV
测得其截止频率为191k,误差为4.5%

③500kHz低通滤波测试数据如下:

表5  500kHz低通测试数据

信号频率(kHz)

50100150200250300
输出电压p-p(V)

2.002.001.961.961.961.92
信号频率(kHz)

3504004505007001000
输出电压p-p(V)

1.881.761.621.36440mV128mV
信号频率(kHz)

15002000
输出电压p-p(V)

30mV17.2mV
测得其截止频率为494k,误差为1.2%

经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低通滤波下的眼图幅度测试数据

数据率/kbps

102030405060708090100
眼幅度/V

3.43.43.43.43.43.43.43.43.43.5
2测试条件:100mV噪声信号,200kHz低通滤波

表7  200kHz低通滤波下的眼图幅度测试数据

数据率/kbps

102030405060708090100
眼幅度/V

3.43.33.43.43.43.353.43.53.53.4
3测试条件:100mV噪声信号,500kHz低通滤波

表8  500kHz低通滤波下的眼图幅度测试数据

数据率/kbps

102030405060708090100
眼幅度/V

3.23.23.23.23.23.23.23.23.23.2
4.2.2 发挥部分

(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);

}

文档

简易数字信号传输性能分析仪论文

简易数字信号传输性能分析仪(E题)摘要通信的根本任务是传递信息,准确地传输数字信号是数字通信的一个极其重要的环节。数字信号在传输过程中会受到各种信号的干扰,而本数字信号分析仪就是为了实现数字信号传输性能测试。本分析仪由CPLD产生数字信号,其时钟信号由MCU控制,为模拟数字信号的传输信道而制作了截止频率分别为100kHz、200kHz、500kHz的低通滤波器,同时通过CPLD产生一个伪随机信号来模拟数字信号传输中的噪声,加法器将经过滤波器滤波之后的数字信号和伪随机噪声信号相加,相加之后的信号
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top