




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于STM32的FSK调制解调实验报告姓名: 学号:叶镇威 20133100167冯世杰 20133100029游锦锋 20133100112教师评语:1. 性能指标 基带信号:m序列,码率2000B 载波: FSK: f1=8000Hz, f2=4000Hz 输出正弦波采样点32个 FSK调制:输入基带信号,输出FSK正弦载波信号 FSK解调:输入FSK载波信号,输出基带信号2.基本原理:2.1.1FSK调制的基本原理用基带信号对高频载波的瞬时频率进行控制的调制方式叫做调频,在数字调制系统中则称为频移键控(FSK)。频移键控在数字通信中是使用较早的一种调制方式,这种方式实现起来比较容易,抗干扰和抗衰落的性能也较强。其缺点是占用频带较宽,频带利用串不够高,因此,额移键控主要应用于低、中速数据的传输,以及衰落信道与频带较宽的信道。2.1.2 FSK信号的表达式和波形图频移键控是利用载波的频率变化来传递数字信息。在2FSK中,载波的频率随二进制基带信号在和两个频率点间变化。故其表达式为: 假设二进制序列s(t)为l01001时,则2FSK信号的波形如图2.1.2所示图2.1.2 2FSK信号的波形从图中可以看出,一个2FSK信号可以看成是两个不同载频的2ASK信号的叠加2.1.3 FSK调制方案:2FSK信号产生的方法主要有两种,一种可以采用模拟电路来实现(即直接调频法),另一种可以采用键控法来实现。(1) 直接调频法原理所谓直接调频法,就是用数字基带信号去控制一个振荡器的某种参数而达到改变振荡频率的目的。如图2.1.3所示模 拟调 频 器图2.1.3 直接调频法原理框图(2)键控法原理该方法就是在二进制基带矩形脉冲序列的控制 下通过开关电路对两个不同的独立频率源进行选通,使其在每一个码元期间输出或两个载波之一。其原理如图1.2.2所示,它将产生二进制FSK信号。图中,数字信号控制两个独立振荡器。门电路(即开关电路)和按数字信号的变化规律通断。若门打开,则门关闭故输出为,反之则输出。这种方法的特点是转换速度快、波形好,而且频率稳定度可以做得很高。频率键控法还可以借助数字电路来实现。以上两种FSK信号的调制方法的差异在于:由直接调频法产生的2FSK信号在相邻码元之间的相位是连续变化的。而键控法产生的2FSK信号,是由电子开关在两个独立的频率源之间转换形成,故相邻码元之间的相位不一定连续。f1门电路1门电路2相加倒相f2基带信号输入图2.1.4 键控法原理框图本系统采用的调制原理:(1).m序列生成原理:本次实验采用4级的m序列发生器来产生基带信号,具体产生的原理图如下: (2).STM32的DAC原理介绍:本次实验采用8位的DAC,通过改变这8位输入的值,控制输出电压的大小,从而实现输出电压值的正弦变化,只要取样足够的密,可以近似是正弦波输出,如下图:如下图所示22.1.1,VREF+是参考电压,这里采用3.3V的电压,也就是说输出正弦波的峰峰值为3.3V。DAC_OUTx是模拟信号的输出端,对应于硬件系统采用DAC1的PA4引脚作为输出端。从图中可以看出,DAC输出受DORx寄存器控制,实现DAC输出的控制。而我们这次实验采用12位右对齐模式,先要将数据写入DAC_DHR12Rx11:0位,然后通过使能触发传至寄存器DAC_DORx,具体时钟如图22.1.22.2 FSK解调原理:2.2.1、FSK解调方法有:包络检波、鉴频法、过零检测法、相干解调法,本设计采用相干解调法,其原理框图如下:输出低通滤波器相乘器带通滤波器w1 Cosw2tCosw1tFSK解调原理框图定时脉冲抽样判决器低通滤波器相乘器带通滤波器w2 两个带通滤波器的作用同于包络检波,从带通滤波器输出的信号经过低通滤波器滤除掉二倍频信号,取出含有基带信号的低频信号,在脉冲信号到达时,抽样判决器对两个低频信号的抽样值、进行比较判决,还原出基带信号。2.2.2 过零检测法单位时间内信号经过零点的次数多少,可以用来衡量频率的高低。数字调频波的过零点数随不同载频而异,故检出过零点数可以得到关于频率的差异,这就是过零检测法的基本思想。过零检测法方框图及各点波形如图2.2.4所示。在图中,2FSK信号经限幅、微分、整流后形成与频率变化相对应的尖脉冲序列,这些尖脉冲的密集程度反映了信号的频率高低,尖脉冲的个数就是信号过零点数。把这些尖脉冲变换成较宽的矩形脉冲,以增大其直流分量,该直流分量的大小和信号频率的高低成正比。然后经低通滤波器取出此直流分量,这样就完成了频率幅度变换,从而根据直流分量幅度上的区别还原出数字信号“1”和“0”。图2.2.3过零检测法方框图及各点波形图3. 具体设计思路与方案3.1 FSK调制部分:由STM32系统时钟分频,通过系统内部逻辑产生码率为2000B的m序列作为基带信号,如果输入为“0”则通过控制DAC输出频率为f1的载波信号,如果输入为“1”则通过控制DAC输出频率为f2的载波信号。基带信号的产生:建立一个数组m15,用于存储m序列作为基带信号。m序列码率的控制:STM32的系统时钟是8MHz,而我们需要得到码率为2000B的数字信号。所以每个数字信号所包含时钟脉冲个数n:n=8MHz/2000*8Hz=500 (1B=8bits)即每隔500个时钟脉冲调用一次数组,产生一个基带信号。DAC的采样率的控制: 本次实验采用8位的DAC,所以范围是0255,也就是说将3.3V的电压分成256份,一个周期内可以产生512个采样点,完全符合实验要求的32个采样点。载波的频率控制:本次实验使用的STM32的系统时钟是8MHz,周期为T=1/8MHz。而为了得到f1=8000Hz,则周期1/f1=1/8000(s),一个周期有32个采样点,所以一个采样点的时间t=1/f1*32(s),所以每个点之间的系统时钟脉冲数n=t/T=30,即30个时钟脉冲才发送一个采样点;同理为了得到载波f2=4000Hz,每个采样点对应的时钟脉冲间隔数目为60。输出电压的计算:因为本次实验DAC的参考电压是3.3V,所以DAC的输出电压是线性的从03.3V,在12位模式下DAC输出电压与Vref+以及DORx的计算公式如下:DACx输出电压=Vref*(DORx/4095)所以我们可以通过输入的12位数字信号确定输出信号的电压,通过新建一个12位的数组用于代表由03.3V的线性16个点(采样点为32个,半个周期16个采样点)所对应的12位数字信号,然后通过线性改变这个数组所代表的数值的大小,逐个输出采样点。软件程序流程图:主要程序讲解:1. 开启PA口时钟,设置PA4为模拟输入STM32F103RCT6的DAC通道1在PA4上,所以,我们先要使能PORTA的时钟,然后设置PA4为模拟输入。DAC本身是输出,但是为什么端口要设置为模拟输入呢?因为一旦使能DACx通道之后,相应的GPIO引脚(PA4或者PA5)会自动与DAC的模拟输出相连,设置为输入,是为了避免额外的干扰。使能GPIOA时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/使能PROTA时钟设置PA1为模拟输入只需要设置初始化参数即可:GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;/模拟输入2. 使能DAC1时钟。同其他外设一样,要想使用,必须首先开启相应的时钟。STM32的DAC模拟时钟是由APB1提供的,所以我们调用函数RCC_APB1PeriphClockCmd()设置DAC模块的时钟使能。RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);/使能DAC通道时钟3初始化DAC,设置DAC的工作模式。该部分市直全部通过DAC_CR设置实现,包括:DAC通道1使能、DAC通道1输出缓存关闭、不使用触发、不使用波形发生器等设置。这里DMA初始化是通过函数DAC_Init完成的:void DAC_Init(uint32_tDAC_Channel,DAC_InitTypeDef*DAC_InitStruct)跟前面一样,首先我们来看看参数设置结构体类型DAC_InitTypeDef 的定义: typedef struct uint32_t DAC_Trigger; uint32_t DAC_WaveGeneration; uint32_t DAC_LFSRUnmask_TriangleAmplitude; uint32_t DAC_OutputBuffer; DAC_InitTypeDef;这个结构体的定义还是比较简单的,只有四个成员变量,下面我们一一讲解。 第一个参数 DAC_Trigger 用来设置是否使用触发功能,前面已经讲解过这个的含义,这里我们不是用触发功能,所以值为 DAC_Trigger_None。 第二个参数 DAC_WaveGeneratio 用来设置是否使用波形发生,这里我们前面同样讲解过不使用。所以值为 DAC_WaveGeneration_None。 第三个参数 DAC_LFSRUnmask_TriangleAmplitude 用来设置屏蔽/幅值选择器,这个变量只在使用波形发生器的时候才有用,这里我们设置为 0 即可,值为 DAC_LFSRUnmask_Bit0。 第四个参数 DAC_OutputBuffer 是用来设置输出缓存控制位,前面讲解过,我们不使用输出缓存,所以值为 DAC_OutputBuffer_Disable。到此四个参数设置完毕。看看我们的实例代码:DAC_InitTypeDef DAC_InitType; DAC_InitType.DAC_Trigger=DAC_Trigger_None; /不使用触发功能 TEN1=0 DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;/不使用波形发生 DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0; DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; /DAC1 输出缓存关闭DAC_Init(DAC_Channel_1,&DAC_InitType); /初始化 DAC 通道 14)使能 DAC转换通道 初始化 DAC 之后,理所当然要使能 DAC 转换通道,库函数方法是: DAC_Cmd(DAC_Channel_1, ENABLE); /使能 DAC1 5)设置 DAC的输出值。 通过前面 4 个步骤的设置,DAC 就可以开始工作了,我们使用 12 位右对齐数据格式,所以我们通过设置 DHR12R1,就可以在 DAC 输出引脚(PA4)得到不同的电压值了。库函数的函数是: DAC_SetChannel1Data(DAC_Align_12b_R, 0); 第一个参数设置对齐方式,可以为 12 位右对齐 DAC_Align_12b_R,12 位左对齐 DAC_Align_12b_L 以及8 位右对齐 DAC_Align_8b_R 方式。 第二个参数就是 DAC 的输入值了,这个很好理解,初始化设置为 0。 这里,还可以读出 DAC 的数值,函数是: DAC_GetDataOutputValue(DAC_Channel_1); 设置和读出一一对应很好理解,这里就不多讲解了。 最后,再提醒一下大家,MiniSTM32 开发板的参考电压直接就是 VDDA,即 3.3V。 通过以上几个步骤的设置,我们就能正常的使用 STM32 的 DAC 通道 1 来输出不同的模拟电压了。3.2 解调过程的实现:3.2.1解调系统原理框图及各部分功能整形电路高电平宽度判决解调信号调制信号整形电路:将两种频率的正弦波调制信号整形为对应的两种频率的占空比1:1的方波。高电平宽度判决:通过检测得出每个高电平的持续时间,并判断该高电平时间长度是属于哪一个频率的方波(对应调制信号正弦波的两种频率),由此输出该频率下相对应的解调信号。1.设计方案总体框图LM393比较器整形电路基于STM32高电平宽度判决和解调信号输出系统解调信号调制信号2.1 LM393比较器整形电路这一部分选用双电压比较器集成电路LM393来实现将两种频率的正弦波调制信号整形为对应的两种频率的占空比1:1的方波的要求。具体电路设计和参数设定如下。R15K5V VCCR1R2R3LM393VinVoutVref(1)参考电压设定因为STM32产生的调制信号是两种不同频率的,电压范围在03.2V左右的正弦波,为了将4K,8K正弦波转换成相应的4K,8K的占空比1:1的方波,所以将参考电压Vref设置在1.6V左右。(2)各个电阻参数的设置为了使Vref尽可能符合要求,根据正电源电压为5V,负电源电压接地,R1,R2在实际可选电阻中,选择R1=5K,R2=2K,这时Vref=2 K/(2 K+5 K)*5V1.43V这一结果接近1.6V,在误差允许范围可实现将正弦波整形为对应频率的占空比1:1的方波。因为LM393比较器是集电极开路输出,输出端处于高阻态,所以为了使其能输出高电平,需要添加上拉电阻R3,这里R3=2K。2.2基于STM32高电平宽度判决和解调信号输出系统 由LM393比较器整形电路输出得到占空比1:1的4K,8K方波,由此算出两种方波对应高电平持续的大约时间: 4K:约为1/4000/2=0.000125s=125us 8K:约为1/8000/2=0.0000625s=62.5us(1)STM32高电平宽度获得因此可以使用STM32的输入捕获相关功能来得到每个方波高电平持续的时间(这一过程大约需要延时四分之一个码元长度(125us)-因为这样获得一次高电平宽度需要延时相应宽度的时间,而4K高电平持续时间比8K长,为了使获得两种不同频率方波的高电平宽度所产生的延时一致,故取较长的高电平时间125us作为统一的延时时间。(2)高电平宽度判决并根据判决结果输出解调信号 至此得到所需要的高电平持续时间,设置判决门限时间为100us(为了降低误判的几率,把把判决的时间值设定为125us和62.5us的平均值附近的100us,经过实际调试,这一值可以区分出两种高电平持续时间)。如果高电平持续时间小于100us则判定是8K方波,延时64us后输出相应解调信号-低电平(0)。延时64us原因:这是因为上文提到的为了统一延时时间(125us62.5us这是得到相应高电平大概要延时的时间+64us)而设置的延时。如果高电平持续时间大于100us则判定是4K方波,并输出相应解调信号-高电平(1)。 不用延时64us原因:得到这一高电平持续时间的延时已经约为125us,不需要再延时。(3)程序流程图以及主要程序解释STM32高电平宽度判决和解调信号输出系统程序使用到的主要相关变量意义:TIM5_CNT:储存没有溢出正常计数值(从检测到上升沿开始1us计数一次)的变量。TIM5CH1_CAPTURE_STA各位描述如表15.3.1所示:TIM5CH1_CAPTURE_STAbit7bit6bit50捕获完成标志捕获到高电平标志捕获高电平后定时器溢出的次数上图中词语意义捕获到高电平:新的一次上升沿触发了捕获中断。捕获完成:在前一次上升沿触发捕获中断基础上,下降沿到来再次触发捕获中断TIM5CH1_CAPTURE_VAL用来记录的是捕获到下降沿时TIM5_CNT的计数值 主函数部分(实现将获得的计数值转化为高电平持续时间并进行判决后输出解调信号)主函数程序流程图开始延时函数、NVIC中断、串口、输入输出端口、中断捕获、计数频率(1Mhz计数)初始化是否已经捕获到一次高电平宽度?YN计算总的高电平时间temp(us)Temp100(us)?PE5口输出高电平YNPE5口输出低电平开启下一次捕获这部分的主要程序和注释#define LED1 PEout(5)/ PE5口extern u8 TIM5CH1_CAPTURE_STA;/输入捕获状态extern u16TIM5CH1_CAPTURE_VAL;/输入捕获值int main(void)u32 temp=0; delay_init();/延时函数初始化NVIC_Configuration(); /设置NVIC中断分组2uart_init(9600);/串口初始化波特率为9600LED_Init();/输出端口初始化TIM5_Cap_Init(0XFFFF,72-1);/以1Mhz的频率计数,就是计数一次是1uswhile(1)if(TIM5CH1_CAPTURE_STA&0X80)/成功完成捕获一次高电平temp=TIM5CH1_CAPTURE_STA&0X3F;/这里是把计数的溢出次数赋给temptemp*=65536;/溢出时间总和,计数的寄存器是16位的,溢出一次计数65536次temp+=TIM5CH1_CAPTURE_VAL;/溢出的时长加上本次下降沿到来时的计数值得到总的高电平时间if(temp100) /判断高电平时间对应哪个频率的方波并于PE5输出调信号LED1=1;if(temp100) delay_us(64);/ 因为上文提到的为了统一延时时间(125us62.5us这是得到相应高电平大概要延时的时间+64us)而设置的延时。LED1=0;TIM5CH1_CAPTURE_STA=0;/开启下一次捕获输入捕获函数部分(实现捕获高电平并获得计数值)主要程序流程图见下一页流程图中词语意义捕获到高电平:新的一次上升沿触发了捕获中断。捕获完成:在前一次上升沿触发捕获中断基础上,下降沿到来再次触发捕获中断发生中断开始执行函数发生捕获事件?还没有完成捕获?YYNN发生的是溢出中断吗?YN已经捕获到高电平?YN溢出次数超过了可记录范围?YN强制标记完成一次高电平捕获记录溢出次数+1之前已经捕获到一个上升沿?YN那么可以知道这次捕获事件是因为捕获到下降沿而发生中断的,这时可以标记完成捕获到一次高电平;并把中断设置为上升沿捕获这次捕获事件是因为第一次捕获到上升沿而产生的中断,所以此时把各种状态、计数变量清零,并标记成功捕获到上升沿(捕获到高电平)把中断设置为下升沿捕获清空中断标志位结束这部分的主要程序和注释void TIM5_IRQHandler(void) if(TIM5CH1_CAPTURE_STA&0X80)=0)/还未成功完成捕获高电平if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)/判断是否发生溢出中断,如果发生了,就执行IF里的语句if(TIM5CH1_CAPTURE_STA&0X40)/已经捕获到高电平了(表示已经发生过一次上升沿触发的中断)if(TIM5CH1_CAPTURE_STA&0X3F)=0X3F)/如果 TIM5CH1_CAPTURE_STA的bit50都为1的话就是到了最大溢出次数了,只能够强制标记完成捕获高电平一次TIM5CH1_CAPTURE_STA|=0X80;/标记成功完成捕获了一次TIM5CH1_CAPTURE_VAL=0XFFFF;/设置计数值是最大值else TIM5CH1_CAPTURE_STA+;/如果溢出次数并有达到最大,则记录溢出次数+1if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)/捕获1发生捕获事件if(TIM5CH1_CAPTURE_STA&0X40)/如果之前已经捕获到一个上升沿,括号里的数为真,那么可以知道这次捕获事件是因为捕获到下降沿而发生中断的,这时可以标记完成捕获到一次高电平TIM5CH1_CAPTURE_STA|=0X80;/标记完成捕获到一次高电平TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); /记录的是捕获到下降沿时TIM5_CNT的计数值TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); /设置为上升沿捕获else /还未开始,第一次捕获上升沿TIM5CH1_CAPTURE_STA=0;/清空各种状态变量TIM5CH1_CAPTURE_VAL=0;/清零中间传递计数值变量TIM_SetCounter(TIM5,0);/清空TIM5_CNT的计数值TIM5CH1_CAPTURE_STA|=0X40;/标记捕获到了上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);/设置为下降沿捕获TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); /清除中断标志位4实验结果及分析:4.1调制部分在STM32的PA4端口输出调制信号如下图,两个f1=4k的载波对应一个1的基带信号,四个f2=8k的载波对应一个0的基带信号,具体的实验效果图如下:4.2 解调部分(1)调整信号经过LM393电路整形输出如下图:由图可见在误差允许范围内基本实现了将两种频率的正弦波调制信号整形为对应的两种频率的占空比1:1的方波的要求。(2)通过获得高电平宽度进行判决并输出解调信号波形如下图:由图可见,结果与设计相同,可以实现正确的解调输出,每个码元统一延时大约四分之一个码元长度。(3)调制信号与解调信号对比实验中遇到的问题:预期中,使用系统内部延时时钟对输出采样点的输出频率进行控制,但因为代码运行还有机器运算需要时间,所以最后得出的载波频率与预期值相差300Hz左右。解决方案:在每个采样点的间隔采用时间脉冲计数,可以灵活地对脉冲计数个数进行控制,所以可以将误
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全培训效果评析报告课件
- HN-saponin-F-Pulsatilla-saponin-B-生命科学试剂-MCE
- 2025河北雄安新区雄县事业单位招聘89人考前自测高频考点模拟试题及答案详解(夺冠系列)
- 2025年三环集团社会招聘考前自测高频考点模拟试题及参考答案详解
- 环保产业市场现状及未来展望
- 2025年上半年四川泸州市龙马潭区人民医院、泸州市龙马潭区第二人民医院、中医院考核招聘23人模拟试卷附答案详解(模拟题)
- 大数据分析在市场营销中的应用
- G产业链趋势与未来发展研究
- 城市绿色交通发展规划与政策建议
- 2025安徽合肥市长丰县下塘镇招聘村(社区)后备干部12名模拟试卷及答案详解(夺冠)
- 2025年合肥公交集团有限公司驾驶员招聘180人笔试参考题库附带答案详解
- GB/T 46104-2025电解水制氢系统功率波动适应性测试方法
- 信贷档案管理培训课件
- 2025年网络安全监测预警体系建设实施方案评估报告
- 2025年会计继续教育网络答题真题及答案
- (2025)安全知识竞赛试题(附完整答案)
- 2025年辅警招聘考试(行政职业能力测验)复习题及答案
- 2025年海南事业单位联考笔试历年典型考题及考点剖析附带答案详解
- 2025年水发集团有限公司招聘(216人)备考练习试题及答案解析
- 试验检测资金管理办法
- 护理时政面试题库及答案
评论
0/150
提交评论