注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
idiotwu的个人空间 https://home.eeworld.com.cn/space-uid-315074.html [收藏] [复制] [分享] [RSS]
日志

基于FSK调制的无线传输(2)

已有 3788 次阅读2011-9-20 20:51 |

收发系统中,发射机相比于接收机应该算简单很多了。在我的FSK无线传输中的发射机由FSK波形产生,放大器,功放组成,直接用单片机串口传输数据,定了简单的传输协议以防止乱码。
首先我要讲的是FSK波形的产生:
产生特定频率的正弦波的方法很多,比如说晶振,锁相环等等,但是为了产生两种特定频率的波就有点麻烦,本着越简单越好的原则,我选择了DDS芯片AD9854。下面介绍一下AD9854,AD9854是一款功能强大的DDS芯片,内部时钟可以达到200M,OOK、FSK等波形可以直接由芯片产生,以上优点我就不多说了,这芯片功耗实在是太大了,如果你要用1117供电,我觉着四片应该是一个不错的选择。用它的时候我在芯片的正面和PCB板的下面都安置了散热片,但工作的时候还是烫的要死。。。FSK MODE 4倍倍频40M,在30M时,这家伙竟吃掉了600mA的电流。所以我的建议是:使用这东西时一定要加热沉,尽量使用频率高的晶振,尽量避免倍频。
 
下面看一下我画的AD9854 PCB版图:
 
 
为了减少制版费用,我不得不画成5*5cm2
 
关于AD9854的程序,我想我就不用多讲了吧,网上实在是太多了,一搜一把。。。
下面我把我用的AD9854程序贴在下面:

#include <iom16.h>

#include "delay.h"
#include "AD9854.h"

#define uchar   unsigned char
#define uint    unsigned int

#define AD9854_CON  PORTD
#define AD9854_DDR  DDRD

#define AD_SCLK_0       AD9854_CON&=0xfe
#define AD_SDIO_0       AD9854_CON&=0xfd
#define AD_CS_0         AD9854_CON&=0xfb
#define AD_M_RST_0      AD9854_CON&=0x07
#define IO_RESET_0      AD9854_CON&=0xef
#define Up_data_clk_0   AD9854_CON&=0xdf

#define AD_SCLK_1       AD9854_CON|=0x01
#define AD_SDIO_1       AD9854_CON|=0x02
#define AD_CS_1         AD9854_CON|=0x04
#define AD_M_RST_1      AD9854_CON|=0x08
#define IO_RESET_1      AD9854_CON|=0x10
#define Up_data_clk_1   AD9854_CON|=0x20

/****初始化AD9854****/
void Initial()
{
    AD9854_DDR = 0xff;
   
    AD_M_RST_1;
    delay_nm(10);
    AD_M_RST_0;
    IO_RESET_1;
    delay_m();
    IO_RESET_0;
   
    Up_data_clk_0;
    Write_instruction_byte(0x07);
    Write_One_Byte(0x14);
    //Write_One_Byte(0x66);
    Write_One_Byte(0x44);
    Write_One_Byte(0x02);
    Write_One_Byte(0x20);
    Up_data_clk_1;
    Up_data_clk_0;
}

void Write_One_Byte(unsigned char Byte)
{
    uchar i = 0;
    AD_SCLK_0;
   
    for(i=0;i<8;i++)
    {
        AD_SCLK_0;
        if((Byte&0x80)==0x80)
        {
            AD_SDIO_1;
        }
        else
        {
            AD_SDIO_0;
        }
        AD_SCLK_1;
        Byte = Byte<<1;
    }
    AD_SCLK_0;
   
}


void Write_instruction_byte(unsigned char Loc)
{  
    Write_One_Byte(Loc);   
}

void Read_instruction_byte(unsigned char Loc)
{
    Loc|=0x80;
    Write_One_Byte(Loc);
}

/****设置频率转换字 1 ****/
void Write_fre_1(unsigned long long Set_fre_1)   //FTW = (Desired Output Frequency*2N)/SYSCLK
{
    Up_data_clk_0;
    uchar A_0, A_1, A_2, A_3, A_4, A_5;
    A_0 = Set_fre_1 % 256;
    Set_fre_1 = Set_fre_1 / 256;
    A_1 = Set_fre_1 % 256;
    Set_fre_1 = Set_fre_1 / 256;
    A_2 = Set_fre_1 % 256;
    Set_fre_1 = Set_fre_1 / 256;
    A_3 = Set_fre_1 % 256;
    Set_fre_1 = Set_fre_1 / 256;
    A_4 = Set_fre_1 % 256;
    Set_fre_1 = Set_fre_1 / 256;
    A_5 = Set_fre_1 % 256;
    Write_instruction_byte(Fre_1);
    Write_One_Byte(A_5);
    Write_One_Byte(A_4);
    Write_One_Byte(A_3);
    Write_One_Byte(A_2);
    Write_One_Byte(A_1);
    Write_One_Byte(A_0);
    Up_data_clk_1;
    Up_data_clk_0;
}

/****设置频率转换字 2 ****/

void Write_fre_2(unsigned long long Set_fre_2)
{
    Up_data_clk_0;
    uchar A_0, A_1, A_2, A_3, A_4, A_5;
    A_0 = Set_fre_2 % 256;
    Set_fre_2 = Set_fre_2 / 256;
    A_1 = Set_fre_2 % 256;
    Set_fre_2 = Set_fre_2 / 256;
    A_2 = Set_fre_2 % 256;
    Set_fre_2 = Set_fre_2 / 256;
    A_3 = Set_fre_2 % 256;
    Set_fre_2 = Set_fre_2 / 256;
    A_4 = Set_fre_2 % 256;
    Set_fre_2 = Set_fre_2 / 256;
    A_5 = Set_fre_2 % 256;
    Write_instruction_byte(Fre_2);
    Write_One_Byte(A_5);
    Write_One_Byte(A_4);
    Write_One_Byte(A_3);
    Write_One_Byte(A_2);
    Write_One_Byte(A_1);
    Write_One_Byte(A_0);
    Up_data_clk_1;
    Up_data_clk_0;
}

/****设置相位转换字 1 ****/

void Write_pha_1(unsigned int Pha_1)
{
    Up_data_clk_0;
    uchar A_0, A_1;
    A_0 = Pha_1 % 256;
    Pha_1 = Pha_1 / 256;
    A_1 = Pha_1 % 256;
    Write_instruction_byte(Phase_1);
    Write_One_Byte(A_1);
    Write_One_Byte(A_0);   
    Up_data_clk_1;
    Up_data_clk_0;
}

/****设置相位转换字 2 ****/

void Write_pha_2(unsigned int Pha_2)
{
    Up_data_clk_0;
    uchar A_0, A_1;
    A_0 = Pha_2 % 256;
    Pha_2 = Pha_2 / 256;
    A_1 = Pha_2 % 256;
    Write_instruction_byte(Phase_2);
    Write_One_Byte(A_1);
    Write_One_Byte(A_0);
    Up_data_clk_1;
    Up_data_clk_0;   
}

/**********************I输出幅度 *************************
共有14bits控制输出幅度 (Bits 15, 14, 13, 12 don not care)
**********************************************************/
void Shaped_keying_mul_I(unsigned int Mul)
{
    Up_data_clk_0;
    uchar A_0, A_1;
    A_0 = Mul % 256;
    Mul = Mul / 256;
    A_1 = Mul % 256;
    Write_instruction_byte(OSK_I);
    Write_One_Byte(A_1);
    Write_One_Byte(A_0);
    Up_data_clk_1;
    Up_data_clk_0;
}

/**********************Q输出幅度 *************************
共有14bits控制输出幅度 (Bits 15, 14, 13, 12 don not care)
**********************************************************/
void Shaped_keying_mul_Q(unsigned int Mul)
{
    Up_data_clk_0;
    uchar A_0, A_1;
    A_0 = Mul % 256;
    Mul = Mul / 256;
    A_1 = Mul % 256;
    Write_instruction_byte(OSK_Q);
    Write_One_Byte(A_1);
    Write_One_Byte(A_0);
    Up_data_clk_1;
    Up_data_clk_0;
}

/**** 三角频率字 ****/
void DFW_fre(unsigned long long DFW)
{
    Up_data_clk_0;
    uchar A_0, A_1, A_2, A_3, A_4, A_5;
    A_0 = DFW % 256;
    DFW = DFW / 256;
    A_1 = DFW % 256;
    DFW = DFW / 256;
    A_2 = DFW % 256;
    DFW = DFW / 256;
    A_3 = DFW % 256;
    DFW = DFW / 256;
    A_4 = DFW % 256;
    DFW = DFW / 256;
    A_5 = DFW % 256;
    Write_instruction_byte(Del_fre);
    Write_One_Byte(A_5);
    Write_One_Byte(A_4);
    Write_One_Byte(A_3);
    Write_One_Byte(A_2);
    Write_One_Byte(A_1);
    Write_One_Byte(A_0);
    Up_data_clk_1;
    Up_data_clk_0;
}

/**** 三角频率字 ****/
void Ramp_rate_clk(unsigned long Ramp)
{
    Up_data_clk_0;
    uchar A_0, A_1, A_2;
    A_0 = Ramp % 256;
    Ramp = Ramp / 256;
    A_1 = Ramp % 256;
    Ramp = Ramp / 256;
    A_2 = Ramp % 256;
    Write_instruction_byte(Ramp_rat);
    Write_One_Byte(A_2);
    Write_One_Byte(A_1);
    Write_One_Byte(A_0);
    Up_data_clk_1;
    Up_data_clk_0;
}

/****更新时钟频率 ****/
void Update_clk(unsigned long Clk_date)
{
    Up_data_clk_0;
    uchar A_0, A_1, A_2, A_3;
    A_0 = Clk_date % 256;
    Clk_date = Clk_date / 256;
    A_1 = Clk_date % 256;
    Clk_date = Clk_date / 256;
    A_2 = Clk_date % 256;
    Clk_date = Clk_date / 256;
    A_3 = Clk_date % 256;
    Write_instruction_byte(Up_clk);
    Write_One_Byte(A_3);
    Write_One_Byte(A_2);
    Write_One_Byte(A_1);
    Write_One_Byte(A_0);
    Up_data_clk_1;
    Up_data_clk_0;
}

/********** 写AD9854控制寄存器 *******************
参数说明:MODE:0x00:  single-tone mode      
                0x01:  FSK mode
                0x02:  ramped FSK mode
                0x03:  chrip mode
                0x04:  BPSK mode
          MULT:  pll倍频器,可以设定4 ~ 20
当用pll倍频器时bit_21一定设定为'0'
          PD  : 设定 power down 模式,依照手册33页设定
                0x00:  没有省电模式
                0x10:  比较器省电
                0x14:  比较器省电,Q输出省电
                0x18:  比较器省电,全部输出省电 
          OSK_EN :  '1' 使能
          Up_clk:  外部使能 '0'
                   内部是能 '1'
**************************************************/

void Write_con_byte(unsigned char Mode, unsigned char Mult,
                    unsigned char PD, unsigned char Osk_en,
                    unsigned char Clk)
{
     Up_data_clk_0;
     Write_instruction_byte(Con_byte);
     Write_One_Byte(PD);
     if(Mult==0)
     {
         Write_One_Byte(0x64);     // 手册上默认值
     }
     else
     {
         Write_One_Byte(Mult | 0x40);
     }
     Write_One_Byte(Mode | Clk);  
//     if(Osk_en==0)
//     {
//         Write_One_Byte();
//     }
//     else
//     {
//         Write_One_Byte();
//     }
     Write_One_Byte(0x20);
     Up_data_clk_1;
     Up_data_clk_0;
}

 
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章