在今天上午博文信标的调频发送给出了制作QN8027实验板的过程。下面就对该实验板进行功能测试。

一、实验硬件模块

1. I2C总结单片机实验板

由于QN8027需要使用I2C总线进行控制,所使用的STM32F030的I2C总线控制板与在小型化RDA5807调频收音模块实验板博文中所使用的I2C总线控制板是相同的。I2C实验板在博文“RDA5807 FM收音机模块”中进行了介绍。

I2C 控制电路板

SPIF030 Hardware:

  1. SPIF030 原理图:

SPIF030 原理图

  1. SPIF030 PCB和电路板

SPIF030 PCB和电路板

  1. SPIF030 Firmware:
    D:\zhuoqing\window\ARM\IAR\STM32\Application\Test\2020\GeneralFSPIF030
    该软件是一个通用软件测试平台。其中包括有多个项目所遗留下来的代码片段。

2. 搭建面包板上的实验电路

QN8027实验板接口

下图显示了QN8027的实验接口。

QN8027实验板接口

在面包板上搭建实验电路板,将AN8027的I2C总线与SPIF030的I2C总结连接起来。在面包板上,从左到右的模块分别是:

1 名称 功能
1 3.3V稳压 将5V工作电源转换成3.3V
2 STM32单片机 编程产生I2C总线控制命令
3 QN8027 QN8027实验转接板

实验电路板

二、软件调试

1. 测试软件

测试软件所在目录:
D:\zhuoqing\window\ARM\IAR\STM32\Application\Test\2020\GeneralFSPIF030\Src\main.c

2. QN8027 I2C protocl

(1) QN8027 I2C Address: 0x2C
0x58: Writing Address;
0x59: Reading Address;

(2) I2C Data

QN8027 I2C Protocl

Notes:

  1. The default IC address is 0x2C.
  2. “0x58” for a WRITE operation, “0x59” for a READ operation.

3. QN8027所有控制寄存器地址和功能描述:

QN8027 Control Register Description

(1) System : 0x00

System Control Register

(2) Channel Setting(0x01)

Low eight bits of the channel setting index

注:高2位发送频道设置位在System(0x00)寄存器的底2位。

(3) GPLT (0x02)

GPLT Register

(4) REG_XTL (0x03)

XTL Control Register

(5) REG_VGA (0x04)

VGA Control Register

(6) Chip ID (0x05)

ID of Chip Register

(7) Chip ID 2 (0x06)

ID of Chip Register

(8) Status Register (0x07)

Status Register

4. I2C 初步读写实验

(1)修改 I2C控制板 Genral FSPIF030的I2C配置文件。

修改I2C配置文件

(2)读写Chip register:

产生QN8027.H, QN8027.C 两个文件,其中集成了如下底层函数来读写QN8027内部寄存器。

/*
**==============================================================================
** QN8027.H:            -- by Dr. ZhuoQing, 2020-03-07
**
**  Description:
**
**==============================================================================
*/
#ifndef __QN8027__
#define __QN8027__
//------------------------------------------------------------------------------
#ifdef QN8027_GLOBALS#define QN8027_EXT
#else#define QN8027_EXT extern
#endif // QN8027_GLOBALS
//------------------------------------------------------------------------------
//==============================================================================//------------------------------------------------------------------------------#define QN8027_I2C_ADD          0x58void QN8027I2CWrite(uint8_t * pucData, int nLength);
void QN8027I2CRead(uint8_t * pucData, int nLength);
void QN8027ReadRegister(unsigned char ucAddress, unsigned char * pucReg);
void QN8027WriteRegister(unsigned char ucAddress, unsigned char ucReg);
void QN8027ReadRegisterDim(unsigned char ucAddress, unsigned char * pucReg, unsigned char ucNumber);//==============================================================================
//             END OF THE FILE : QN8027.H
//------------------------------------------------------------------------------
#endif // __QN8027__
/*
**==============================================================================
** QN8027.C:             -- by Dr. ZhuoQing, 2020-03-07
**
**==============================================================================
*///------------------------------------------------------------------------------
#include "stm32f0xx_hal.h"
#include "stm32f0xxa.h"#define QN8027_GLOBALS        1              // Define the global variables
#include "QN8027.H"//------------------------------------------------------------------------------//------------------------------------------------------------------------------
extern I2C_HandleTypeDef hi2c1;void QN8027I2CWrite(uint8_t * pucData, int nLength) {HAL_I2C_Master_Transmit(&hi2c1, QN8027_I2C_ADD, pucData, nLength, 10);
}void QN8027I2CRead(uint8_t * pucData, int nLength) {HAL_I2C_Master_Receive(&hi2c1, QN8027_I2C_ADD, pucData, nLength, 10);
}//------------------------------------------------------------------------------
void QN8027ReadReigster(unsigned char ucAddress, unsigned char * pucReg) {QN8027I2CWrite(&ucAddress, 1);QN8027I2CRead(pucReg, 1);
}void QN8027ReadRegisterDim(unsigned char ucAddress, unsigned char * pucReg, unsigned char ucNumber) {QN8027I2CWrite(&ucAddress, 1);QN8027I2CRead(pucReg, ucNumber);
}void QN8027WriteRegister(unsigned char ucAddress, unsigned char ucReg) {unsigned char ucWrite[2];ucWrite[0] = ucAddress;ucWrite[1] = ucReg;QN8027I2CWrite(ucWrite, 2);
}
//==============================================================================
//                END OF THE FILE : QN8027.C
//------------------------------------------------------------------------------

在主程序读取所有寄存器的内容:

    if(++nShowCount >= 500) {nShowCount = 0;unsigned char ucReg[19];QN8027ReadRegisterDim(0x0, ucReg, 19);int i;for(i = 0; i < 19; i ++) printf("%02x ", ucReg[i]);printf("\r\n");}

读取的QN8027的内部19个寄存机的值为:

01 00 a9 10 b2 41 44 02 00 00 00 00 00 00 00 00 7f 81 06

其中0x5,0x6对应的是QN8027的CHIP ID,它们分别是:0x41, 0x44。

QN8027性能测试

1. 初始话程序

//------------------------------------------------------------------------------
void QN8027Init(void) {QN8027WriteRegister(0x00, 0x81);        // Set the All the register to default valuesWaitTime(20);                           // Delay 20MSQN8027WriteRegister(0x03, 0x10);        // Using the default settingQN8027WriteRegister(0x04, 0x33);        // Set the OSC frequency : 12MHzQN8027WriteRegister(0x00, 0x41);QN8027WriteRegister(0x00, 0x1);WaitTime(20);QN8027WriteRegister(0x01, 0x7e);QN8027WriteRegister(0x02, 0xb9);QN8027WriteRegister(0x00, 0x22);
}

读出的寄存器值:

22 7e b9 10 33 41 44 55 00....7f 81 06

寄存器00,01所对应的发送频道设定值CH=027e。根据手册中计算输出频率的公式:

FRF=(76+0.05CH)F_{RF} = \left( {76 + 0.05CH} \right)FRF​=(76+0.05CH)
根据上面数值,此时输出频率应该为:107.9MHz.

2. 输出频谱

使用DSA815频谱仪测量QN8027天线输出信号。

DSA815频谱仪测量QN8027天线输出

测试实际输出频谱,如下图所示,对应的峰值在108Mhz,与前面所设置的位置基本相同。

QN8027 输出频谱

3. 设置QN8027的频谱

使用如下的代码来修改输出的频率。

//------------------------------------------------------------------------------
void QN8027SetFrequency(float fMHz) {unsigned int nChannel = (unsigned int)(fMHz - 76) * 20;unsigned char uc00 = (unsigned char)(nChannel >> 8) | 0x20;unsigned char uc01 = (unsigned char)(nChannel & 0xff);unsigned char ucDim[2];ucDim[0] = uc00;ucDim[1] = uc01;QN8027WriteRegisterDim(0x00, ucDim, 2);}

在主程序初始化之后,使用QN8027SetFrequency设置输出频谱为90MHz。测量所得到的输出频谱为:

设置输出频谱为90Mhz之后的输出信号频谱

这说明对于QN8027输出频谱设置功能正确。

通过收音机接收发射信号

使用一台TECSUM收音机接收信号,分别使用不同的调制波形,查看收音机输出的波形。

(1)接收的不同调制信号波形

正弦调制(400Hz)收音机接收到的波形

方波调制(400Hz)收音机接收到的波形

三角波调制(400Hz)收音机接收到的波形

锯齿波调制(400Hz)收音机接收到的波形

(2)最大调制信号幅值

通过改变调制信号的幅值,检查接收信号的失真情况。发现当输入信号的峰峰值小于1.2V的时候,输出的波形基本上没有失真。当输入信号的峰峰值超过1.2V时,输出信号开始有失真。

下面波形是输入调制信号的峰峰值等于1.5V时,接收到的正弦波开始了顶部有了饱和失真。

调制正弦波峰峰值1.5V

(3)发送与接收信号之间的延时

下面使用频率为3kHz的信号进行调制,对比发送和接收信号之间的相位,可以看到发送和接收信号中之间有了明显的相位延迟。经过波形参数估计,延迟相位大约是67.5°。

发送信号与接收信号之间的延迟

参考文献

  1. 小型化RDA5807调频收音模块实验板

  2. 信标的调频发送

  3. 使用AD9833谐波发送调频广播

  4. 单片调频收音机

  5. RDA5807 FM收音机模块

QN8027性能调试相关推荐

  1. ue4场景没阴影_UE4性能调试分析常用方法

    UE4性能调试分析常用方法 本文将介绍使用UE4开发项目常用到的性能分析的命令 UE4使用命令的方式是在游戏运行的时候按~键就可以输入命令了 显示CPU和GPU端执行耗时命令: stat UNIT 这 ...

  2. WPF性能调试系列 – 内存监测

    原文:WPF性能调试系列 – 内存监测 WPF性能调试系列文章: WPF页面渲染优化:Application Timeline WPF页面业务加载优化:Ants Performance Profile ...

  3. 使用CoreProfiler/NanoProfiler实现跨平台amp;应用的整合性能调试

    NanoProfiler是一个开源.NET性能调试类库,CoreProfiler是其.NET Core版本的实现.在之前的一些文章中,我曾介绍过NanoProfiler的主要使用方式,以及如何为生产环 ...

  4. UE3 性能调试:动态光照环境

    性能调试:动态光照环境 点击这里返回到性能调试页面. 动态光照环境 问题: 动态光照环境更新的性能消耗显示为非常昂贵. 解决方案: 默认情况下所有的 InterpActors (也就是 Movers) ...

  5. 前端-页面性能调试:Hiper

    前端-页面性能调试:Hiper 我们写单页面应用,想看页面修改后性能变更其实挺繁琐的.有时想知道是「正优化」还是「负优化」只能靠手动刷新查看network.而Hiper很好解决了这一痛点(其实Hipe ...

  6. JAVA性能调试+JProfiler使用相关

    一.JProfiler下载.安装与激活 1.1 下载 直接官网下载(https://www.ej-technologies.com/download/jprofiler/files) 建议下载9.X系 ...

  7. Instruments--CoreAnimation页面性能调试

    Instruments是什么 我的理解就是一个调试工具集,常用来调试性能优化,页面优化,fps响应,检查内存性能等.完整介绍与操作[你看] Xcode打开方式: Xcode 11中的Instrumen ...

  8. 【腾讯WeTest干货分享】高并发性能调试经验分享

    本文由腾讯WeTest授权发布 作者:helloworlds 链接:https://zhuanlan.zhihu.com/p/21348220 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权 ...

  9. app GPU性能调试笔记

    简介 本文是主要是记录作者调优app的过程记录,旨在记录,不在文采 调试界面是否存在过度绘制? 过度绘制就是一个像素点重复绘制的次数太多,比如你的App登录视图有View1.View2.View3-, ...

最新文章

  1. 基于OpenGL的三种直线生成算法
  2. C#:统计字符串中每个字符的个数
  3. cross validation交叉验证
  4. 爱快--虚拟机单网卡(带机上网)
  5. 32岁了 学python 来的及吗-32岁的程序员去了国企工作, 晒出年薪, 网友: 我没看错吧...
  6. Pannellum:实例之自定义热点信息
  7. c语言谭浩强简介,大一C语言谭浩强总结(到数组)简介.ppt
  8. Idea导入MySQL驱动包
  9. 报名 | AI产品经理闭门会_第13期_北京_4场主题分享_本周六(2月19日)
  10. windows 10和windows server 2016系统AD的administrator密码修改
  11. shell编程三大神器之awk
  12. linux xv命令什么意思,Linux部分命令解释(命令缩写代表什么意思)
  13. 码农慌不慌?只因写了一段爬虫,大数据公司200多人被抓!
  14. C# 之 概率随机数
  15. 作业提交试题下载网站
  16. open cv轮廓周围绘制圆形和矩形
  17. 我从外包公司离职了(一定要看 防坑指南)!
  18. 星座查询-python
  19. navicat for mysql注册码,各种版本都有
  20. day09【字节流、字符流】

热门文章

  1. hibernate三级缓存概括
  2. 联想 k2450 温度、耗电试验
  3. ASP.NET代码对页面输出进行清理
  4. 「镁客早报」阿里巴巴与Office Depot合作,服务美国小企业;HTC与印厂商谈品牌许可协议,或退出手机市场...
  5. Hive导出复杂数据到csv文件
  6. logback:用slf4j+logback实现多功能日志解决方案
  7. Jquery滚动监听和附加导航
  8. 利用Python进行数据分析 Note 1
  9. Windows Azure Platform Introduction (2) 云计算的分类和服务层次
  10. java远程调用笔记