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 0x58
void 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__
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
/*
**==============================================================================
** 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
//------------------------------------------------------------------------------
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
在主程序读取所有寄存器的内容:
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");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
读取的QN8027的内部19个寄存机的值为:
01 00 a9 10 b2 41 44 02 00 00 00 00 00 00 00 00 7f 81 06
- 1
其中0x5,0x6对应的是QN8027的CHIP ID,它们分别是:0x41, 0x44。
QN8027性能测试
1. 初始话程序
//------------------------------------------------------------------------------
void QN8027Init(void) {
QN8027WriteRegister(0x00, 0x81); // Set the All the register to default values
WaitTime(20); // Delay 20MS
QN8027WriteRegister(0x03, 0x10); // Using the default setting
QN8027WriteRegister(0x04, 0x33); // Set the OSC frequency : 12MHz
QN8027WriteRegister(0x00, 0x41);
QN8027WriteRegister(0x00, 0x1);
WaitTime(20);
QN8027WriteRegister(0x01, 0x7e);
QN8027WriteRegister(0x02, 0xb9);
QN8027WriteRegister(0x00, 0x22);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
读出的寄存器值:
22 7e b9 10 33 41 44 55 00....7f 81 06
- 1
寄存器00,01所对应的发送频道设定值CH=027e。根据手册中计算输出频率的公式:
F R F = ( 76 + 0.05 C H ) 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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
在主程序初始化之后,使用QN8027SetFrequency设置输出频谱为90MHz。测量所得到的输出频谱为:
设置输出频谱为90Mhz之后的输出信号频谱
这说明对于QN8027输出频谱设置功能正确。
通过收音机接收发射信号
使用一台TECSUM收音机接收信号,分别使用不同的调制波形,查看收音机输出的波形。
(1)接收的不同调制信号波形
正弦调制(400Hz)收音机接收到的波形
方波调制(400Hz)收音机接收到的波形
三角波调制(400Hz)收音机接收到的波形
锯齿波调制(400Hz)收音机接收到的波形
(2)最大调制信号幅值
通过改变调制信号的幅值,检查接收信号的失真情况。发现当输入信号的峰峰值小于1.2V的时候,输出的波形基本上没有失真。当输入信号的峰峰值超过1.2V时,输出信号开始有失真。
下面波形是输入调制信号的峰峰值等于1.5V时,接收到的正弦波开始了顶部有了饱和失真。
调制正弦波峰峰值1.5V
(3)发送与接收信号之间的延时
下面使用频率为3kHz的信号进行调制,对比发送和接收信号之间的相位,可以看到发送和接收信号中之间有了明显的相位延迟。经过波形参数估计,延迟相位大约是67.5°。
发送信号与接收信号之间的延迟
参考文献
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/104715873
- 点赞
- 收藏
- 关注作者
评论(0)