卫星导航接收机ZYNQ实现(二)

前言

前面提到打算用MAX2769这个片子实现射频的功能,根据参考电路做了一块小板,插到微相Z7-lite那块开发板上,用于验证射频功能。最初看这个片子目的是打算做一个简单的中频信号采集器,通过USB传到上位机,可惜看了很久总感觉无法避开FPGA,只好退而求其次,单纯的做一块射频板。
在这里插入图片描述

MAX2769简介

MAX2769是一款通用的单芯片全球导航卫星系统(GNSS)接收机,用于GPS 、GLONASS以及伽利略导航卫星系统。
MAX2769采用Maxim先进的低功率SiGe BiCMOS工艺,能够以较低的成本提供业界最高的性能和集成度。单芯片内集成了完整的接收链路,包括双输入LNA、混频器、镜频抑制滤波器、PGA、VCO、N分频频率合成器、晶体振荡器和位复用ADC。该接收器的总噪声系数低至1.4dB。

特性

  • GPS/GLONASS/伽利略接收机

  • 无需外部IF SAW或分立式滤波器

  • 可编程设置IF频率

  • 集成VCO的N分频频率合成器支持宽范围的参考时钟频率

  • 内部独立的双输入LNA分别用于无源和有源天线输入

  • 总噪声系数1.4dB

  • 内置晶体振荡器

  • 内置温度检测器

  • 内置有源天线检测器

  • 低功耗模式下电源电流为10mA

  • 供电电压为2.7V至3.3V

  • 微型28引脚、RoHS兼容、薄型QFN无铅封装(5mm x 5mm)

MAX2769功能框图

MAX2769典型电路图

MAX2769只需要简单的电阻电容就能实现,GPS信号射频到中频的转换,典型电路如下
在这里插入图片描述
在这里插入图片描述

配置方式

配置方式有两种:SPI配置和预设配置方式,预设的配置方式通过SPI三个信号的高低电平实现,仅能实现几种固有的模式。
在这里插入图片描述
最初,为图省事,我用的预设的配置方式,即上图中的STATE 3,采样率16.368MHz,中频4.092MHz,经过数天的折腾,终于用softwareGNSS实现了信号的捕获,使我看到了初步的希望。
但是16.368M的采样率存在严重的不足,仅能实现捕获,对于跟踪便显得无能为力了,因为后续需要使用MAX2769输出的始终产生本地信号,而这个时钟与我的系统时钟50M并不兼容。
第二种是SPI配置,PGM引脚拉低,就可以通过SPI写入寄存器配置芯片。
在这里插入图片描述
Verilog配置程序如下,也可以使用PL的SPI端口配置,初始化的时候写十个寄存器即可。

module max2769_spi(
output reg sclk,sdio,le,
input rst,clk,
output reg spi_ok
);
wire [3:0] lut_index=4'd9;//spi register 0~lut_index
reg [3:0] addr;
reg [4:0] state;
reg [31:0] dout_reg;
reg [6:0] shift_reg;
reg[27:0] cnt;
always @ (posedge clk or negedge rst)
if(!rst)
  begin
    sclk<=1'b0;
    le<=1'b1;
    sdio<=1'b1;
    state<=5'd0;
    addr<=4'd0;
    dout_reg<=32'd0;
    shift_reg<=7'd0;
    spi_ok<=1'b0;
    cnt   <=  0;
  end
else
  begin
    case(state)
      5'd0:
        begin
          le<=1'b1;sclk<=1'b0;sdio<=1'b1;
          if(cnt < 28'd10000) begin
              state<=5'd0;
              cnt <= cnt + 1'd1;
          end
          else
              state<=5'd1;
          
        end
      5'd1:begin le<=1'b1;sclk<=1'b0;sdio<=1'b1;state<=5'd2;end
      5'd2:begin le<=1'b1;sclk<=1'b0;sdio<=1'b1;state<=5'd3;end
      5'd3:
        begin
          le<=1'b1;sclk<=1'b0;sdio<=1'b1;state<=5'd4;
          case(addr)
            4'd0:dout_reg<={28'hA291FA3,addr};  // CONF1
            4'd1:dout_reg<={28'h8550708,addr};  // CONF2
            4'd2:dout_reg<={28'hEAFF1DC,addr};  // CONF3
            4'd3:dout_reg<={28'h9CC0008,addr};  //PLL
            4'd4:dout_reg<={28'h0C48140,addr};  //DIV   0000_0000_1001_1100_0000_0000_1000  28'h009C008
            4'd5:dout_reg<={28'h8000070,addr};  //FDIV   28'hC560470
            4'd6:dout_reg<={28'h8000000,addr};  //STRM
            4'd7:dout_reg<={28'h10061B2,addr};  //CLK
            4'd8:dout_reg<={28'h1E0F401,addr};
            4'd9:dout_reg<={28'h14C0402,addr};
          endcase
        end
      5'd4:begin le<=1'b0;sclk<=1'b0;sdio<=dout_reg[31];dout_reg<=dout_reg<<1;shift_reg<=shift_reg+1'b1;state<=5'd5;end
      5'd5:begin le<=1'b0;sclk<=1'b1;state<=5'd6;end
      5'd6:
        begin
          le<=1'b0;sclk<=1'b0;
          if(shift_reg<=7'd31)
            begin state<=5'd4;end
          else
            begin shift_reg<=7'd0;state<=5'd7;end
        end
      5'd7:begin sclk<=1'b0;le<=1'b1;state<=5'd8;end
      5'd8:
        begin
          sclk<=1'b0;le<=1'b1;
          if(addr<lut_index)
            begin addr<=addr+1'b1;state<=5'd1;end
          else
            begin addr<=4'd0;state<=5'd9;end
        end
      5'd9:begin spi_ok<=1'b1;  state<=5'd9;  end   //state<=5'd0;
    endcase
  end
endmodule

因为我手上只有40M的温补晶振,输出时钟设为1/2,所以输出为20MHz,本振为频率为1572M,中频信号为3.42MHz,但是我没有找到中频滤波器中心频率的公式,所以还是默认的4MHz,带宽2.5MHz,够用了。

在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f71af1c8af9a48d3986d6857fd88236b.png
在这里插入图片描述
捕获的6颗卫星信号。

总结

MAX2769这个片子是一款比较理想的接收机芯片,通过几个月的折腾,终于把中频信号的问题解决了,实现了接收机的第一步。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值