0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用STM32调试FMSDR模块及解调FM电台(2)

冬至子 来源:硬木课堂 作者:硬木课堂 2023-07-06 10:54 次阅读

3. 调试8027使其发出单音FM信号

3.1 输出24Mhz和验证I2C接口

  1. 硬件连接

    将FM_SDR板卡和STM32H750开发板连接。

本文中所有例子中我们都仅给MSI001使用天线,因为QN8027离得很近,发射端不需要使用天线

本程序中操作的管脚如下描述:

1.jpg

2. PWM输出24MHz

QN8027芯片需要输入24MHz的时钟作为参考信号,在这里通过STM32H750的TIMER2产生24M的方波,提供给QN8027作为输入参考信号。

PWM信号的关键参数是频率和占空比,我们分别看一下如何设定TIM2来确定输出PWM的频率和占空比:

PWM的输出频率=计数器计数频率/(计数器的计数上限+1),计数器计数频率在上图中是CK_CNT,它由时钟和触发控制模块输出的CK_PSC经过PSC分频器得到,因此我们在初始化TIM1的时候选择时钟源为CK_INT,预分频器比为1(寄存器中写入为0),这样我们的CK_CNT是240MHz;而计数器的计数上限就是自动重载寄存器APR的值,设定为9;

PWM的占空比,由比较寄存器(CCR1-4的值)和计数器计数上限(APR的值)决定,设定CCR1为4的话,PWM1的占空比即为(4+1)/(9+1)= 50%。

具体TIMER输出PWM方法介绍,可以回顾基础实验“实验六TIM1输出PWM”:

3. 硬件IIC接口配置

芯片的控制接口是I2C协议,要使芯片正常工作,首先I2C接口的操作要正常。这里利用QN8027的I2C支持可读可写,写入0x00寄存器一个值,再读出来。如果读出和写入的一致,说明I2C操作正常,芯片可以被控。这样进行后续调试才有初步把握。

需要配置STM32H750的硬件I2C,然后发出控制字操作8027芯片,确认板卡和芯片正常工作。I2C工作速度设为100K.

也可以使用GPIO模拟I2C时序,可以回顾基础实验“实验十五 矩阵键盘和数码管显示—模拟IIC”。

4. 编写代码

在main中使能PWM输出,和读写QN8027寄存器

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_I2C2_Init();
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//tim2开启pwm,输出24Mhz
QN8027_WriteOneByte(0x00, 0x31);	//向寄存器0x00写入值0x31
HAL_Delay(100);		//延时100ms
qn8027_read_byte = QN8027_ReadOneByte(0x00);	//读取寄存器0x00的值
  while (1)
  {
  }
}

添加QN8027驱动代码

#include "qn8027/qn8027.h"

I2C_HandleTypeDef *qn8027 = &hi2c2; 

//初始化QN8027寄存器,设为98.5M输出
uint8_t qn8027_98_5M_reg_tbl[][2]=
{
	0x00, 0x31, 
	0x01, 0xC2,
	0x02, 0xB9,
	0x03, 0x80,
	0x04, 0xB2,
	0x10, 0x32,
	0x11, 0x81, 
};

//在QN8027指定地址读出一个数据
//WriteAddr  :写入数据的目的地址    
//DataToWrite:要写入的数据
uint8_t QN8027_ReadOneByte(uint8_t ReadAddr)
{				  
	uint8_t temp=0;		  

	HAL_I2C_Mem_Read(qn8027,QN8027_READ,ReadAddr,1,&temp,1,20);

	return temp;
}
//在QN8027指定地址写入一个数据
//WriteAddr  :写入数据的目的地址    
//DataToWrite:要写入的数据
HAL_StatusTypeDef QN8027_WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite)
{		
	HAL_StatusTypeDef errorcode = HAL_OK;

	errorcode = HAL_I2C_Mem_Write(qn8027,QN8027_WRITE,WriteAddr,1,&DataToWrite,1,20);
	return errorcode;
}

//Qn8027初始化,初始化成98.5M,改变寄存器参数配置不同频率
HAL_StatusTypeDef Qn8027_Init(void)
{
	uint32_t i=0;
	HAL_StatusTypeDef errorcode = HAL_OK;

	//设置:输出98.5M
	for(i=0;i< (sizeof(qn8027_98_5M_reg_tbl)/2);i++)
	{
		errorcode = QN8027_WriteOneByte(qn8027_98_5M_reg_tbl[i][0],qn8027_98_5M_reg_tbl[i][1]);  
	}
	return errorcode;
}

5. PWM测试输出

如果有条件,可以使用示波器测试QN8027_REFCLK管脚,观测有无24M的波形。

6. Qn8027读写测试

keil中用debug单步调试,先向寄存器0x00写入值0x31,再读取寄存器0x00的值,通过Watch窗口观察变量qn8027_read_byte值为0X31.说明I2C读写正确。

如果读出的值和写入的值一致,说明I2C时序和8027硬件都没有问题。那么我们就可以继续下一步配置。

注意,I2C时序写入这一步看上去虽然简单,却是最经常出问题的步骤。如果遇到8027没有反应,建议用如下方法排查:

  1. 电源测试:8027供电是否正常;
  2. IO通断测试:使用IO输出高低电平,通过测量确定PCB焊接正确,且插对了孔位;
  3. I2C时序测试:确定I2C的上拉电阻正确,使用示波器或逻辑分析仪捕获发出的I2C时序,判断是否I2C配置寄存器有错误;FPGA写的I2C程序,则要特别留意是否有代码bug。
  4. 8027如果没有应答,观察是否有虚焊等情况(开发板发货前经过测试,基本上可以排除电源和8027的焊接问题)。

3.2 将H750内部DAC输出的1KHz正弦波调制到98.5MHz

下面,我们将使用单片机的PA4管脚发出单音(正弦波),频率1KHz,峰峰值1600mVpp,直流偏置1.65V。接入FMSDR开发板的调制信号管脚DAC_L。单片机管脚PA15发出24MHz的PWM信号,提供芯片的参考时钟。通过I2C接口控制QN8027芯片。

1. 硬件连接

将FM_SDR板卡和STM32H750开发板连接。

程序中操作的管脚如下描述:

1.jpg

  1. DAC输出1kHz正弦波

    STM32H750开发板输出1kHz的正弦波,通过Timer6产生25k频率的触发事件,DAC配置为外部timer6触发中断。正弦波表长度为25字长,每次timer6触发事件发送,在中断服务程序中一直循环发送波表。

也可以使用TIMER事件触发DMA输出波形方法,可以回顾基础实验“实验二十八 DAC应用定时器触发实现DMA输出波形”。

DAC驱动设计

定时器触发DAC做DMA数据传输的实现思路 实现思路框图如下:

image.png

  1. QN8027设置输出频率为98.5MHZ

    在qn8027.c文件中,添加如下代码,配置qn8027寄存器如下,第一行是寄存器地址,第二行是写入寄存器值。(下表对应98.5M的频点)。寄存器取值参考前面调试文档。

I2C配置和操作在前一小节已经讲解,可以回顾前一小节查看。

  1. 编写代码

    在main中使能PWM输出,初始化正弦波码表,开启TIM6和DAC。初始化qn8027频率为98.5M.在TIM6_DAC_IRQHandler中断中更新DAC值。

  2. 1khz正弦波输出测试

    用示波器测量DAC输出(PA4管脚),和经过滤波后波形。CH1(黄色)是DAC发出的1Khz正弦波,CH2(蓝色)是经过硬件滤波后qn8027输入管脚的波形。

测试点如下图(滤波前波形测量R45下侧,滤波后波形测量R8左右都行):

  1. 98.5MHz FM信号测试

    配置好QN8027后,1KHz的正弦波单音就被调制在98.5MHz上,用FM收音机调到98.5MHz频点上就可以听到这个1KHz的“嘟”声。 注意:如果当地98.5MHz上有电台,可以换一个空白的频点,避开已有的电台。

成品收音机的功能是已知的,用已知来调试未知,是调试的基本思路。

除了使用成品收音机来验证98.5M上FM调制的1KHz信号之外,我们也可以用m302的频谱仪来验证,因为m302的带宽有50MHz,输入的100MHz信号虽然有衰减,但是在频域上还是能看见的。

这里涉及到欠采样理论。欠采样理论不在这里讲解,以图示来说明。

以98M的频点为例,用100M采样。信号是周期连续波,采样脉冲是δ函数。采样过程就相当于时域相乘,对应频域卷积。就是把信号的正负频谱进行搬移。图中画出0附近的几个搬移,-200M,-100M,0,100M,200M。为了看清楚,每对之间的高度画的不一样,便于区分。可以看到,在100M位置的搬移上,-98M落在2M位置。

同样的,如果以10M采样率采样,经过多个奈奎斯特域的翻折,98M的信号也会落到2M位置上。

我们将AIN1连接到FM输出端口,开启FFT功能:

选择打开FFT功能

选择5M带宽(采样率10MSPS),可以看到混叠到1.5MHz的FM信号和4MHz上的时钟信号。如下图。

暂停后将频率轴展宽到1.4M - 1.6M,可以清晰看到混叠到1.5MHz的FM信号:

从实验过程可以看到,欠采样会出现频谱翻折,谐波翻折,混频翻折,会有多个频谱线。所以实际中如果要利用欠采样来采样高频信号,需要添加滤波器。这里只是利用了欠采样来查看QN8027是否发出了设置的频点。

使用成品收音机或者使用频谱仪,确认QN8027发出正确的单音FM信号后,我们就可以使用这个“已知的单音FM信号”来调试MSi001了。单音比直接收电台的音频更简单直观的看到MSi001的采集、解调和滤波各个步骤的波形,并和已知正确波形进行对比。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5037

    浏览量

    117765
  • 数码管
    +关注

    关注

    31

    文章

    1827

    浏览量

    89951
  • PWM波
    +关注

    关注

    0

    文章

    98

    浏览量

    16706
  • 预分频器
    +关注

    关注

    0

    文章

    17

    浏览量

    7990
  • STM32H750
    +关注

    关注

    1

    文章

    16

    浏览量

    1456
收藏 人收藏

    评论

    相关推荐

    使用STM32调试FMSDR模块解调FM电台(1)

    示波器:本实验我们使用硬木课堂的口袋仪器产品进行测量
    的头像 发表于 10-13 15:52 2284次阅读
    使用<b class='flag-5'>STM32</b><b class='flag-5'>调试</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模块</b>及<b class='flag-5'>解调</b><b class='flag-5'>FM</b><b class='flag-5'>电台</b>(1)

    使用STM32调试FMSDR模块解调FM电台(3)

    QN8027芯片需要输入24MHz的时钟作为参考信号,在这里通过STM32H750的TIMER2产生24M的方波,提供给QN8027作为输入参考信号。
    的头像 发表于 10-13 16:04 4130次阅读
    使用<b class='flag-5'>STM32</b><b class='flag-5'>调试</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模块</b>及<b class='flag-5'>解调</b><b class='flag-5'>FM</b><b class='flag-5'>电台</b>(3)

    教你最简单做一个随身FM电台!X各种使用方法#电台

    电台FM
    Dimsmary
    发布于 :2022年07月12日 14:29:14

    FM解调器电路

    几种FM解调器电路
    发表于 04-21 11:49 1774次阅读
    <b class='flag-5'>FM</b><b class='flag-5'>解调</b>器电路

    FM解调器A电路

    FM解调器A电路
    发表于 03-21 19:00 765次阅读
    <b class='flag-5'>FM</b><b class='flag-5'>解调</b>器A电路

    FM解调器B电路

    FM解调器B电路
    发表于 03-21 19:01 729次阅读
    <b class='flag-5'>FM</b><b class='flag-5'>解调</b>器B电路

    FM解调器C电路

    FM解调器C电路
    发表于 03-21 19:02 953次阅读
    <b class='flag-5'>FM</b><b class='flag-5'>解调</b>器C电路

    线性FM解调器电路

    线性FM解调器电路
    发表于 03-21 19:14 907次阅读
    线性<b class='flag-5'>FM</b><b class='flag-5'>解调</b>器电路

    FM解调电路图

    FM解调电路图
    发表于 07-15 16:47 983次阅读
    <b class='flag-5'>FM</b><b class='flag-5'>解调</b>电路图

    FM解调

    FM解调器 LM311
    发表于 09-15 10:28 1423次阅读
    <b class='flag-5'>FM</b><b class='flag-5'>解调</b>器

    455KHz FM解调

    455KHz FM解调
    发表于 09-15 11:04 1053次阅读
    455KHz <b class='flag-5'>FM</b><b class='flag-5'>解调</b>器

    使用STM32调试FMSDR模块解调FM电台(2)

    当我们使用FPGA或者STM32模块配合FMSDR模块使用的时候,需要从零开始调试这个电路,逐步完成:硬件好坏判断、8027和MSI001寄
    的头像 发表于 10-13 15:56 3314次阅读
    使用<b class='flag-5'>STM32</b><b class='flag-5'>调试</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模块</b>及<b class='flag-5'>解调</b><b class='flag-5'>FM</b><b class='flag-5'>电台</b>(2)

    使用STM32调试FMSDR模块解调FM电台(1)

    当我们使用FPGA或者STM32模块配合FMSDR模块使用的时候,需要从零开始调试这个电路,逐步完成:硬件好坏判断、8027和MSI001寄
    的头像 发表于 07-06 10:50 1309次阅读
    使用<b class='flag-5'>STM32</b><b class='flag-5'>调试</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模块</b>及<b class='flag-5'>解调</b><b class='flag-5'>FM</b><b class='flag-5'>电台</b>(1)

    使用STM32调试FMSDR模块解调FM电台(3)

    MSI001芯片需要输入24MHz的时钟作为参考信号,在这里使用专门的时钟产生单元RCC产生24M的方波,提供给MSI001作为输入参考信号。
    的头像 发表于 07-06 11:00 2816次阅读
    使用<b class='flag-5'>STM32</b><b class='flag-5'>调试</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模块</b>及<b class='flag-5'>解调</b><b class='flag-5'>FM</b><b class='flag-5'>电台</b>(3)

    使用STM32调试FMSDR模块解调FM电台(4)

    本实验是在配置MSI001的频点为101.7Mhz已知交通广播电台,观察喇叭是否能听到交通广播声音,再调整MSI001的输出幅度。
    的头像 发表于 07-06 11:05 619次阅读
    使用<b class='flag-5'>STM32</b><b class='flag-5'>调试</b><b class='flag-5'>FMSDR</b><b class='flag-5'>模块</b>及<b class='flag-5'>解调</b><b class='flag-5'>FM</b><b class='flag-5'>电台</b>(4)