QN8027性能调试

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

 

一、实验硬件模块

 

1. I2C总结单片机实验板

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

I2C 控制电路板

I2C 控制电路板

SPIF030 Hardware:

  1. SPIF030 原理图:

SPIF030 原理图

SPIF030 原理图

  1. SPIF030 PCB和电路板

SPIF030 PCB和电路板

SPIF030 PCB和电路板

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

 

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

QN8027实验板接口

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

QN8027实验板接口

QN8027实验板接口

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

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

实验电路板

实验电路板

二、软件调试

 

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

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

QN8027 Control Register Description

(1) System : 0x00
System Control Register

System Control Register

(2) Channel Setting(0x01)

Low eight bits of the channel setting index

Low eight bits of the channel setting index

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

(3) GPLT (0x02)

GPLT Register

GPLT Register

(4) REG_XTL (0x03)
XTL Control Register

XTL Control Register

(5) REG_VGA (0x04)
VGA Control Register

VGA Control Register

(6) Chip ID (0x05)
ID of Chip Register

ID of Chip Register

(7) Chip ID 2 (0x06)
ID of Chip Register

ID of Chip Register

(8) Status Register (0x07)

Status Register

Status Register

4. I2C 初步读写实验

(1)修改 I2C控制板 Genral FSPIF030的I2C配置文件。
修改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__
/*
**==============================================================================
** 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 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); 
}

读出的寄存器值:

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

寄存器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天线输出

DSA815频谱仪测量QN8027天线输出

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

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之后的输出信号频谱

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

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

通过收音机接收发射信号

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

(1)接收的不同调制信号波形
正弦调制(400Hz)收音机接收到的波形

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

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

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

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

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

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

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

(2)最大调制信号幅值

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

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

调制正弦波峰峰值1.5V

调制正弦波峰峰值1.5V

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

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

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

 

参考文献

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

  2. 信标的调频发送

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

  4. 单片调频收音机

  5. RDA5807 FM收音机模块

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值