QN8027性能调试

举报
tsinghuazhuoqing 发表于 2021/12/27 01:20:36 2021/12/27
【摘要】 在今天上午博文信标的调频发送给出了制作QN8027实验板的过程。下面就对该实验板进行功能测试。   一、实验硬件模块   1. I2C总结单片机实验板 由于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 名称 功能
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

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__

  
 
  • 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天线输出

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);
   
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在主程序初始化之后,使用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收音机模块

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/104715873

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。