使用STM32调试FMSDR模块及解调FM电台(2)

3. 调试8027使其发出单音fm信号3.1 输出24mhz和验证i2c接口
硬件连接
将fm_sdr板卡和stm32h750开发板连接。
本文中所有例子中我们都仅给msi001使用天线,因为qn8027离得很近,发射端不需要使用天线
本程序中操作的管脚如下描述:
2. pwm输出24mhzqn8027芯片需要输入24mhz的时钟作为参考信号,在这里通过stm32h750的timer2产生24m的方波,提供给qn8027作为输入参考信号。
pwm信号的关键参数是频率和占空比,我们分别看一下如何设定tim2来确定输出pwm的频率和占空比:
pwm的输出频率=计数器计数频率/(计数器的计数上限+1),计数器计数频率在上图中是ck_cnt,它由时钟和触发控制模块输出的ck_psc经过psc分频器得到,因此我们在初始化tim1的时候选择时钟源为ck_int,预分频器比为1(寄存器中写入为0),这样我们的ck_cnt是240mhz;而计数器的计数上限就是自动重载寄存器apr的值,设定为9;
pwm的占空比,由比较寄存器(ccr1-4的值)和计数器计数上限(apr的值)决定,设定ccr1为4的话,pwm1的占空比即为(4+1)/(9+1)= 50%。
具体timer输出pwm方法介绍,可以回顾基础实验“实验六tim1输出pwm”:
3. 硬件iic接口配置芯片的控制接口是i2c协议,要使芯片正常工作,首先i2c接口的操作要正常。这里利用qn8027的i2c支持可读可写,写入0x00寄存器一个值,再读出来。如果读出和写入的一致,说明i2c操作正常,芯片可以被控。这样进行后续调试才有初步把握。
需要配置stm32h750的硬件i2c,然后发出控制字操作8027芯片,确认板卡和芯片正常工作。i2c工作速度设为100k.
也可以使用gpio模拟i2c时序,可以回顾基础实验“实验十五 矩阵键盘和数码管显示—模拟iic”。
4. 编写代码在main中使能pwm输出,和读写qn8027寄存器
int main(void){ hal_init(); systemclock_config(); mx_gpio_init(); mx_tim2_init(); mx_i2c2_init(); hal_tim_pwm_start(&htim2,tim_channel_1);//tim2开启pwm,输出24mhzqn8027_writeonebyte(0x00, 0x31); //向寄存器0x00写入值0x31hal_delay(100); //延时100msqn8027_read_byte = qn8027_readonebyte(0x00); //读取寄存器0x00的值 while (1) { }}添加qn8027驱动代码
#include qn8027/qn8027.hi2c_handletypedef *qn8027 = &hi2c2; //初始化qn8027寄存器,设为98.5m输出uint8_t qn8027_98_5m_reg_tbl[][2]={ 0x00, 0x31, 0x01, 0xc2, 0x02, 0xb9, 0x03, 0x80, 0x04, 0xb2, 0x10, 0x32, 0x11, 0x81, };//在qn8027指定地址读出一个数据//writeaddr :写入数据的目的地址 //datatowrite:要写入的数据uint8_t qn8027_readonebyte(uint8_t readaddr){ uint8_t temp=0; hal_i2c_mem_read(qn8027,qn8027_read,readaddr,1,&temp,1,20); return temp;}//在qn8027指定地址写入一个数据//writeaddr :写入数据的目的地址 //datatowrite:要写入的数据hal_statustypedef qn8027_writeonebyte(uint8_t writeaddr,uint8_t datatowrite){ hal_statustypedef errorcode = hal_ok; errorcode = hal_i2c_mem_write(qn8027,qn8027_write,writeaddr,1,&datatowrite,1,20); return errorcode;}//qn8027初始化,初始化成98.5m,改变寄存器参数配置不同频率hal_statustypedef qn8027_init(void){ uint32_t i=0; hal_statustypedef errorcode = hal_ok; //设置:输出98.5m for(i=0;i< (sizeof(qn8027_98_5m_reg_tbl)/2);i++) { errorcode = qn8027_writeonebyte(qn8027_98_5m_reg_tbl[i][0],qn8027_98_5m_reg_tbl[i][1]); } return errorcode;}5. pwm测试输出如果有条件,可以使用示波器测试qn8027_refclk管脚,观测有无24m的波形。
6. qn8027读写测试在keil中用debug单步调试,先向寄存器0x00写入值0x31,再读取寄存器0x00的值,通过watch窗口观察变量qn8027_read_byte值为0x31.说明i2c读写正确。
如果读出的值和写入的值一致,说明i2c时序和8027硬件都没有问题。那么我们就可以继续下一步配置。
注意,i2c时序写入这一步看上去虽然简单,却是最经常出问题的步骤。如果遇到8027没有反应,建议用如下方法排查:
电源测试:8027供电是否正常;io通断测试:使用io输出高低电平,通过测量确定pcb焊接正确,且插对了孔位;i2c时序测试:确定i2c的上拉电阻正确,使用示波器或逻辑分析仪捕获发出的i2c时序,判断是否i2c配置寄存器有错误;fpga写的i2c程序,则要特别留意是否有代码bug。8027如果没有应答,观察是否有虚焊等情况(开发板发货前经过测试,基本上可以排除电源和8027的焊接问题)。3.2 将h750内部dac输出的1khz正弦波调制到98.5mhz下面,我们将使用单片机的pa4管脚发出单音(正弦波),频率1khz,峰峰值1600mvpp,直流偏置1.65v。接入fmsdr开发板的调制信号管脚dac_l。单片机管脚pa15发出24mhz的pwm信号,提供芯片的参考时钟。通过i2c接口控制qn8027芯片。
1. 硬件连接将fm_sdr板卡和stm32h750开发板连接。
程序中操作的管脚如下描述:
dac输出1khz正弦波
stm32h750开发板输出1khz的正弦波,通过timer6产生25k频率的触发事件,dac配置为外部timer6触发中断。正弦波表长度为25字长,每次timer6触发事件发送,在中断服务程序中一直循环发送波表。
也可以使用timer事件触发dma输出波形方法,可以回顾基础实验“实验二十八 dac应用定时器触发实现dma输出波形”。
dac驱动设计
定时器触发dac做dma数据传输的实现思路 实现思路框图如下:
qn8027设置输出频率为98.5mhz
在qn8027.c文件中,添加如下代码,配置qn8027寄存器如下,第一行是寄存器地址,第二行是写入寄存器值。(下表对应98.5m的频点)。寄存器取值参考前面调试文档。
i2c配置和操作在前一小节已经讲解,可以回顾前一小节查看。
编写代码
在main中使能pwm输出,初始化正弦波码表,开启tim6和dac。初始化qn8027频率为98.5m.在tim6_dac_irqhandler中断中更新dac值。
1khz正弦波输出测试
用示波器测量dac输出(pa4管脚),和经过滤波后波形。ch1(黄色)是dac发出的1khz正弦波,ch2(蓝色)是经过硬件滤波后qn8027输入管脚的波形。
测试点如下图(滤波前波形测量r45下侧,滤波后波形测量r8左右都行):
98.5mhz fm信号测试
配置好qn8027后,1khz的正弦波单音就被调制在98.5mhz上,用fm收音机调到98.5mhz频点上就可以听到这个1khz的“嘟”声。 注意:如果当地98.5mhz上有电台,可以换一个空白的频点,避开已有的电台。
成品收音机的功能是已知的,用已知来调试未知,是调试的基本思路。
除了使用成品收音机来验证98.5m上fm调制的1khz信号之外,我们也可以用m302的频谱仪来验证,因为m302的带宽有50mhz,输入的100mhz信号虽然有衰减,但是在频域上还是能看见的。
这里涉及到欠采样理论。欠采样理论不在这里讲解,以图示来说明。
以98m的频点为例,用100m采样。信号是周期连续波,采样脉冲是δ函数。采样过程就相当于时域相乘,对应频域卷积。就是把信号的正负频谱进行搬移。图中画出0附近的几个搬移,-200m,-100m,0,100m,200m。为了看清楚,每对之间的高度画的不一样,便于区分。可以看到,在100m位置的搬移上,-98m落在2m位置。
同样的,如果以10m采样率采样,经过多个奈奎斯特域的翻折,98m的信号也会落到2m位置上。
我们将ain1连接到fm输出端口,开启fft功能:
选择打开fft功能
选择5m带宽(采样率10msps),可以看到混叠到1.5mhz的fm信号和4mhz上的时钟信号。如下图。
暂停后将频率轴展宽到1.4m - 1.6m,可以清晰看到混叠到1.5mhz的fm信号:
从实验过程可以看到,欠采样会出现频谱翻折,谐波翻折,混频翻折,会有多个频谱线。所以实际中如果要利用欠采样来采样高频信号,需要添加滤波器。这里只是利用了欠采样来查看qn8027是否发出了设置的频点。
使用成品收音机或者使用频谱仪,确认qn8027发出正确的单音fm信号后,我们就可以使用这个“已知的单音fm信号”来调试msi001了。单音比直接收电台的音频更简单直观的看到msi001的采集、解调和滤波各个步骤的波形,并和已知正确波形进行对比。

ECM 与 MEMS 麦克风:新意味着更好吗?
智能无线体重秤:硬件与APP的完美结合
多参数监测智能服饰系统
油烟传感器在餐饮业的应用
“币应”(inChat)被指抄袭微信,海淀法院要求其停止运营,目前已经下线
使用STM32调试FMSDR模块及解调FM电台(2)
赛灵思战略转型,成为全可编程解决方案提供商
高度集成的非接触读写芯片-DP1332 应用引脚信息以及特性
2020年的信息安全:人工智能对各种信息安全系统的重要性
2018世界机器人大会热闹非凡,国产机器人的供需矛盾原因还得从自身找起
摩托罗拉BB机拆解:经典电路再现
实现高速ADC采样与数据远端存储、本地存储解决方案
小马智行计划为商用自动驾驶出租车项目研发和测试车队维护解决方案
基于ADSP-TS201与FPGA的信号处理系统实现及优化设计
PIC单片机驱动LCD段驱动器的设计
如何使用示波器解决I2C通信开发中遇到的问题
Jeep智能全境界腕表评测 可作为化繁为简的运动装备带来更无拘无束的运动感受
CES|艾睿电子推出首个采用ADI的3D飞行时间技术针对健康护理产品的概念验证设计
防水连接器的优点及注意事项
炬佑智能新品发布