QN8027性能调试
在今天上午博文信标的调频发送给出了制作QN8027实验板的过程。下面就对该实验板进行功能测试。
一、实验硬件模块
1. I2C总结单片机实验板
由于QN8027需要使用I2C总线进行控制,所使用的STM32F030的I2C总线控制板与在小型化RDA5807调频收音模块实验板博文中所使用的I2C总线控制板是相同的。I2C实验板在博文“RDA5807 FM收音机模块”中进行了介绍。
I2C 控制电路板
SPIF030 Hardware:
- SPIF030 原理图:
SPIF030 原理图
- SPIF030 PCB和电路板
SPIF030 PCB和电路板
- 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:
- The default IC address is 0x2C.
- “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°。
发送信号与接收信号之间的延迟
参考文献
小型化RDA5807调频收音模块实验板
信标的调频发送
使用AD9833谐波发送调频广播
单片调频收音机
RDA5807 FM收音机模块
QN8027性能调试相关推荐
- ue4场景没阴影_UE4性能调试分析常用方法
UE4性能调试分析常用方法 本文将介绍使用UE4开发项目常用到的性能分析的命令 UE4使用命令的方式是在游戏运行的时候按~键就可以输入命令了 显示CPU和GPU端执行耗时命令: stat UNIT 这 ...
- WPF性能调试系列 – 内存监测
原文:WPF性能调试系列 – 内存监测 WPF性能调试系列文章: WPF页面渲染优化:Application Timeline WPF页面业务加载优化:Ants Performance Profile ...
- 使用CoreProfiler/NanoProfiler实现跨平台amp;应用的整合性能调试
NanoProfiler是一个开源.NET性能调试类库,CoreProfiler是其.NET Core版本的实现.在之前的一些文章中,我曾介绍过NanoProfiler的主要使用方式,以及如何为生产环 ...
- UE3 性能调试:动态光照环境
性能调试:动态光照环境 点击这里返回到性能调试页面. 动态光照环境 问题: 动态光照环境更新的性能消耗显示为非常昂贵. 解决方案: 默认情况下所有的 InterpActors (也就是 Movers) ...
- 前端-页面性能调试:Hiper
前端-页面性能调试:Hiper 我们写单页面应用,想看页面修改后性能变更其实挺繁琐的.有时想知道是「正优化」还是「负优化」只能靠手动刷新查看network.而Hiper很好解决了这一痛点(其实Hipe ...
- JAVA性能调试+JProfiler使用相关
一.JProfiler下载.安装与激活 1.1 下载 直接官网下载(https://www.ej-technologies.com/download/jprofiler/files) 建议下载9.X系 ...
- Instruments--CoreAnimation页面性能调试
Instruments是什么 我的理解就是一个调试工具集,常用来调试性能优化,页面优化,fps响应,检查内存性能等.完整介绍与操作[你看] Xcode打开方式: Xcode 11中的Instrumen ...
- 【腾讯WeTest干货分享】高并发性能调试经验分享
本文由腾讯WeTest授权发布 作者:helloworlds 链接:https://zhuanlan.zhihu.com/p/21348220 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权 ...
- app GPU性能调试笔记
简介 本文是主要是记录作者调优app的过程记录,旨在记录,不在文采 调试界面是否存在过度绘制? 过度绘制就是一个像素点重复绘制的次数太多,比如你的App登录视图有View1.View2.View3-, ...
最新文章
- 基于OpenGL的三种直线生成算法
- C#:统计字符串中每个字符的个数
- cross validation交叉验证
- 爱快--虚拟机单网卡(带机上网)
- 32岁了 学python 来的及吗-32岁的程序员去了国企工作, 晒出年薪, 网友: 我没看错吧...
- Pannellum:实例之自定义热点信息
- c语言谭浩强简介,大一C语言谭浩强总结(到数组)简介.ppt
- Idea导入MySQL驱动包
- 报名 | AI产品经理闭门会_第13期_北京_4场主题分享_本周六(2月19日)
- windows 10和windows server 2016系统AD的administrator密码修改
- shell编程三大神器之awk
- linux xv命令什么意思,Linux部分命令解释(命令缩写代表什么意思)
- 码农慌不慌?只因写了一段爬虫,大数据公司200多人被抓!
- C# 之 概率随机数
- 作业提交试题下载网站
- open cv轮廓周围绘制圆形和矩形
- 我从外包公司离职了(一定要看 防坑指南)!
- 星座查询-python
- navicat for mysql注册码,各种版本都有
- day09【字节流、字符流】
热门文章
- hibernate三级缓存概括
- 联想 k2450 温度、耗电试验
- ASP.NET代码对页面输出进行清理
- 「镁客早报」阿里巴巴与Office Depot合作,服务美国小企业;HTC与印厂商谈品牌许可协议,或退出手机市场...
- Hive导出复杂数据到csv文件
- logback:用slf4j+logback实现多功能日志解决方案
- Jquery滚动监听和附加导航
- 利用Python进行数据分析 Note 1
- Windows Azure Platform Introduction (2) 云计算的分类和服务层次
- java远程调用笔记