微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 实现stm32在FSK调制解调器的综合设计

实现stm32在FSK调制解调器的综合设计

时间:11-13 来源:互联网 点击:
大致要求:设计一个FSK调制解调器,基带信号码速率为2000B/s,载波速率为4khz和8khz,解调信号要能完整还原基带信号。实现方法多种多样,通信领域内调制解调器的设计大多数用的都是硬件电路,鉴于笔者对编程情有独钟(其实笔者还是懂一点电路设计知识的~),所以最终决定用stm32来设计,纯编程实现。看起来高大上,但实际做起来不难,不过有挺多东西要考虑的。

总的设计思路如下:

首先是基带信号的产生,它也是我们要调制和解调的目标。基带信号由一连串随机的码元序列构成,为了模拟随机的码元序列,笔者用定时器设计8位的PN码序列,码元速率为2000B/s。定时器3定时0.5ms,每进入一次中断,变量num加一,设置一次IO引脚电平,8位PN码只需设置8次,然后num清零。

TIM3_Init(499,71); //基带信号

u8 num=0;

void TIM3_IRQHandler(void)

{

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)

{

num++;

switch (num)

{

case 1: Base_Signal = 1; break;

case 2: Base_Signal = 0; break;

case 3: Base_Signal = 0; break;

case 4: Base_Signal = 0; break;

case 5: Base_Signal = 1; break;

case 6: Base_Signal = 0; break;

case 7: Base_Signal = 1; break;

case 8: Base_Signal = 0; break; //pn码序列

}

if(num == 8)

num = 0;

TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

}

}

接下来要产生载波,载波就是正弦波无疑。这里笔者的载波频率要求是4khz和8khz。正弦波的产生用的是stm32的DMA+DAC+TIM2。正弦波的数据用正弦波数据发生器产生,采样点数64,精度12位,保存在Sine12bit[]数组,但是传送给DMA的正弦波数据不是这些原始的数据,而是将这些数据进行了进一步的处理:

uint16_t Sine12bit[64] = {

0x7FF,0x8C8,0x98E,0xA51,0xB0F,0xBC4,0xC71,0xD12,0xDA7,0xE2E,0xEA5,0xF0D,0xF63,0xFA6,0xFD7,0xFF5

,0xFFE,0xFF5,0xFD7,0xFA6,0xF63,0xF0D,0xEA5,0xE2E,0xDA7,0xD12,0xC71,0xBC4,0xB0F,0xA51,0x98E,0x8C8

,0x7FF,0x736,0x670,0x5AD,0x4EF,0x43A,0x38D,0x2EC,0x257,0x1D0,0x159,0x0F1,0x09B,0x058,0x027,0x009

,0x000,0x009,0x027,0x058,0x09B,0x0F1,0x159,0x1D0,0x257,0x2EC,0x38D,0x43A,0x4EF,0x5AD,0x670,0x736

};

uint32_t Idx = 0;

int main(void)

{

... //省去无关代码

for (Idx = 0; Idx < 64; Idx++)

{

Sine12bit[Idx] = Sine12bit[Idx]*8/10+500; //防止出现底部失真

}

... //省去无关代码

}

为什么要这么处理呢?在讲到DAC的配置时还会再提到这一点,在这里先不做解释。经过处理后的正弦波数据可以直接传送到DMA通道,等TIM2的触发时间一到,就可以依次把数据给到DAC,转换成正弦波输出。笔者用DAC通道2(对应PA5引脚)输出波形,所以需要使能和配置DMA2通道4,DMA的配置如下:

#define DAC_DHR12R2_Address 0x40007414

void DMAx_Init(void)

{

DMA_InitTypeDef DMA_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

/* DMA1 clock enable */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

/* GPIOA Periph clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* DAC Periph clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

/* Once the DAC channel is enabled, the corresponding GPIO pin is automatically

connected to the DAC converter. In order to avoid parasitic consumption,

the GPIO pin should be configured in analog */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//配置为模拟输入,抗噪声干扰

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* DMA1 channel4 configuration */

DMA_DeInit(DMA2_Channel4);

DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R2_Address;//DAC通道2的12位右对齐寄存器地址

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

DMA_InitStructure.DMA_BufferSize = 64;//采样64点,故

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top