Advertisement

卫星导航接收机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,够用了。
在这里插入图片描述
![在这里插入图片描述](
在这里插入图片描述
捕获的6颗卫星信号。

总结

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

全部评论 (0)

还没有任何评论哟~