集成A/D转换器品种繁多,选用时应综合考虑各种因素选取集成芯片。一般逐次比较型A/D转换器用的比较多,ADC0804就是这类单片集成A/D转换器。ADC0804是一款8位、单通道、低价格A/D转换器,主要特点是:模数转换时间大约100us;方便TTL或CMOS标准接口;可以满足差分电压输入;具有参考电压输入端;内含时钟发生器;单电源工作时(0~5)V输入电压范围是0~5V;不需要调零等等。ADC0804是一款早期的AD转换器,而且因其价格低廉而在要求不高的场合得到广泛应用。
芯片参数
——工作电压:+5V,即VCC=+5V。
——模拟转换电压范围:0~+5V,即0≤Vin≤+5V。
——分辨率:8位,即分辨率为1/28=1/256,转换值介于0~255之间。
——转换时间:100us(fCK=640KHz时)。
——转换误差:±1LSB。
——参考电压:2.5V,即Vref/2=2.5V。
各引脚的作用
——Vin(+)、Vin(-):两个模拟信号输入端,可以接收单极性、双极性和差模输入信号。
——DB0-DB7:具有三态特性数字信号输出端,输出结果为八位二进制结果。
——CLKIN:时钟信号输入端。
——CLKR:内部时钟发生器的外接电阻端,与CLK端配合可由芯片自身产生时钟脉冲,其频率计算方式是:fck=1/(1.1RC)。
——CS:片选信号输入端,低电平有效。
——WR:写信号输入端,低电平启动AD转换。
——RD:读信号输入端,低电平输出端有效。
——INTR:转换完毕中断提供端,AD转换结束后,低电平表示本次转换已完成。
——VREF/2:参考电平输入,决定量化单位。
——VCC:芯片电源5V输入。
——AGND:模拟电源地线。
——DGND:数字电源地线。
#include"ADC0804.h"
void ADC0804_Delay100us(void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=43;a>0;a--);
}
/************************************
* 函数名称:ADC0804_Start()
* 函数功能:启动ADC0804转换
* 输入参数:无
* 返回参数:无
************************************/
void ADC0804_Start()
{
ADC0804_CS_L;
ADC0804_WR_L;
ADC0804_Delay;
ADC0804_WR_H;
while(ADC0804_INT);
ADC0804_CS_H;
}
/************************************
* 函数名称:ADC0804_ReadData()
* 函数功能:读取ADC0804数据
* 输入参数:无
* 返回参数:电压原始数据值
************************************/
uchar ADC0804_ReadData()
{
uchar temp_data;
ADC0804_DATA=0xFF;
ADC0804_CS_L;
ADC0804_RD_L;
ADC0804_Delay;
temp_data=ADC0804_DATA;
ADC0804_RD_H;
ADC0804_CS_H;
return(temp_data);
}
/************************************
* 函数名称:ADC0804_GetVoltage(uchar V)
* 函数功能:获取ADC0804的采集的电压
* 输入参数:参考电压
* 返回参数:电压值*10
************************************/
uint ADC0804_GetVoltage(uchar V)
{
uint temp_V,dat;
ADC0804_Start();
dat=ADC0804_ReadData()*10;
temp_V=dat/(0xFF/V);
return(temp_V);
}
ADC0804.h
#ifndef _ADC0804_H_
#define _ADC0804_H_
#include
#define uchar unsigned char
#define uint unsigned int
sbit ADC0804_CS=P2^3;
sbit ADC0804_RD=P2^4;
sbit ADC0804_WR=P2^5;
sbit ADC0804_INT=P2^6;
#define ADC0804_CS_H ADC0804_CS=1
#define ADC0804_CS_L ADC0804_CS=0
#define ADC0804_RD_H ADC0804_RD=1
#define ADC0804_RD_L ADC0804_RD=0
#define ADC0804_WR_H ADC0804_WR=1
#define ADC0804_WR_L ADC0804_WR=0
#define ADC0804_DATA P1
#define ADC0804_Delay ADC0804_Delay100us()
void ADC0804_Start();
uchar ADC0804_ReadData();
uint ADC0804_GetVoltage(uchar V);
#endif
LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。
LCD1602.c
/******************************************
通用型1602液晶显示函数
************************************************/
#include "LCD1602.H"
#define LCD1602_DATA P0
sbit LCD1602_RS=P2^0; //数据命令选择端(4):L为命令;H为数据
sbit LCD1602_RW=P2^1; //读写选择端(5):L为写模式;H为读模式
sbit LCD1602_EN=P2^2; //使能信号(6):高脉冲完成数据指令读写
#define LCD1602_RS_L LCD1602_RS=0
#define LCD1602_RS_H LCD1602_RS=1
#define LCD1602_RW_L LCD1602_RW=0
#define LCD1602_RW_H LCD1602_RW=1
#define LCD1602_EN_L LCD1602_EN=0
#define LCD1602_EN_H LCD1602_EN=1
/*********************************
延时50微妙
********************************/
void LCD1602_Delayus()
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=22;a>0;a--);
}
/********************************
延时10毫秒
********************************/
void LCD1602_Delayms()
{
unsigned int i,j;
for(i=10;i>0;i--)
for(j=113;j>0;j--);
}
/******************************
1602写命令函数
*****************************/
void LCD1602_WriteCmd(uchar cmd)
{
LCD1602_DATA=cmd;
LCD1602_RW_L;
LCD1602_RS_L;//RS拉低,选择写命令
LCD1602_EN_H;//恢复初始化
LCD1602_Delayus(); //短暂延时
LCD1602_EN_L;//使能端上升沿完成操作
LCD1602_Delayus(); //短暂延时
}
void LCD1602_MoveCursor(uchar dir)
{
uchar temp_dir;
temp_dir=0x10+dir*4;
LCD1602_WriteCmd(temp_dir);
}
void LCD1602_MoveScreen(uchar dir)
{
uchar temp_dir;
temp_dir=0x18+dir*4;
LCD1602_WriteCmd(temp_dir);
}
/*****************************
1602写数据函数
*****************************/
void LCD1602_WriteData(uchar dat)
{
LCD1602_DATA=dat;
LCD1602_RW_L;
LCD1602_RS_H; //RS拉高选择写数据
LCD1602_EN_H; //使能端上升沿完成操作
LCD1602_Delayus() ;
LCD1602_EN_L; //使能端恢复初始化
}
/*****************************
1602写数据函数
*****************************/
uchar LCD1602_ReadStatus()
{
LCD1602_DATA=0xFF;
LCD1602_RS_L; //RS拉高选择写数据
LCD1602_RW_H; //使能端上升沿完成操作
LCD1602_Delayus() ;
LCD1602_EN_H;
LCD1602_EN_L; //使能端恢复初始化
LCD1602_Delayus() ;
while(LCD1602_DATA&0x80);
return(LCD1602_DATA);
}
/*****************************
1602写数据函数
*****************************/
uchar LCD1602_ReadData()
{
LCD1602_RS_H; //RS拉高选择写数据
LCD1602_RW_H; //使能端上升沿完成操作
LCD1602_Delayus() ;
LCD1602_EN_H;
LCD1602_EN_L; //使能端恢复初始化
LCD1602_Delayus() ;
return(LCD1602_DATA);
}
/*********************************
1602 液晶初始化函数
********************************/
void LCD1602_Init(uchar d,uchar c,uchar b)
{
uchar temp_cmd;
temp_cmd=0x08+d*4+c*2+b;
LCD1602_EN_L;//拉低使能信号端
LCD1602_Delayms();
LCD1602_WriteCmd(0x38);//显示模式设置:设置16x2显示,5x7点阵,8位数据接口
LCD1602_Delayms();
LCD1602_WriteCmd(0x38);
LCD1602_Delayms();
LCD1602_WriteCmd(0x38);
LCD1602_Delayms();
LCD1602_WriteCmd(0x38);
LCD1602_WriteCmd(temp_cmd);/*0 0 0 0 1 D C B
D=1开显示、D=0关显示
C=1显光标、C=0关光标
B=1开闪烁、B=0关闪烁*/
LCD1602_WriteCmd(0x06);//写一个字符后地址指针自动加1
LCD1602_WriteCmd(0x01);//显示清屏
}
/********************************************************************
* 名称 : LCD1602_DisplayChar(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b"
调用该函数如LCD1602_DisplayCharI(1,5,b的ascii码)
或LCD1602_DisplayChar(1,5,'b')
* 输入 : 行列坐标和需要显示字符的ASCII码值
* 输出 : 无
***********************************************************************/
void LCD1602_DisplayChar(uchar hang,uchar lie,uchar ascii)
{
uchar temp_addr=0;
if(hang == 1) temp_addr = 0x80; //第一行开始地址
if(hang == 2) temp_addr = 0xc0; //第二行开始地址
temp_addr = temp_addr + lie - 1;
LCD1602_WriteCmd(temp_addr); //写入地址命令
LCD1602_WriteData(ascii); //写入数据
}
/********************************************************************
* 名称 : LCD1602_DisplayString(uchar hang,uchar lie,uchar *sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,
调用该函数如LCD1602_DisplayString(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void LCD1602_DisplayString(uchar hang,uchar lie,uchar *str)
{
uchar temp_addr=0;
if(hang == 1) temp_addr = 0x80;//第一行开始地址
if(hang == 2) temp_addr = 0xc0;//第二行开始地址
temp_addr = temp_addr + lie - 1;
LCD1602_WriteCmd(temp_addr); //写入开始位地址
while(1)
{
if(*str == '\0')break; //检测到空字符时跳出循环
LCD1602_WriteData(*str);//写入数据
str++; //指针变量自加
}
}
void LCD1602_PrintHZ(unsigned char sta,unsigned char *hz)
{
unsigned char i,tempH,tempL,temp_addr;
tempH=0;
for(i=0;i<8;i++)
{
tempH=hz[i*2]>>5;
tempL=hz[i*2]&0x1f;
LCD1602_WriteCmd(0x40+i);
LCD1602_WriteData(tempH);
LCD1602_WriteCmd(0x48+i);
LCD1602_WriteData(tempL);
tempH=hz[i*2+1]>>5;
tempL=hz[i*2+1]&0x1f;
LCD1602_WriteCmd(0x56+i);
LCD1602_WriteData(tempH);
LCD1602_WriteCmd(0x64+i);
LCD1602_WriteData(tempL);
}
for(i=8;i<16;i++)
{
tempH=hz[i*2]>>5;
tempL=hz[i*2]&0x1f;
LCD1602_WriteCmd(0x72+i);
LCD1602_WriteData(tempH);
LCD1602_WriteCmd(0x80+i);
LCD1602_WriteData(tempL);
tempH=hz[i*2+1]>>5;
tempL=hz[i*2+1]&0x1f;
LCD1602_WriteCmd(0x88+i);
LCD1602_WriteData(tempH);
LCD1602_WriteCmd(0x92+i);
LCD1602_WriteData(tempL);
}
LCD1602_DisplayChar(1,sta,0x00);
LCD1602_DisplayChar(1,sta+1,0x01); //固定位置 单引号内可以写任意的数字或字母
LCD1602_DisplayChar(1,sta+2,0x02);
LCD1602_DisplayChar(1,sta+3,0x03);
LCD1602_DisplayChar(2,sta,0x04);
LCD1602_DisplayChar(2,sta+1,0x05); //固定位置 单引号内可以写任意的数字或字母
LCD1602_DisplayChar(2,sta+2,0x06);
LCD1602_DisplayChar(2,sta+3,0x07);
}
void LCD1602_DefineCGRAM(uchar *sign)
{
uchar i,j,k,temp_addr;
k=0;temp_addr=0x40;
for(j=0;j<8;j++)
{ for(i=0;i<8;i++)
{
LCD1602_WriteCmd(temp_addr+i);
LCD1602_WriteData(sign[k]);
k++;
}
temp_addr=temp_addr+8;
}
}
LCD1602.h
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include
#define uchar unsigned char
#define uint unsigned int
extern void LCD1602_WriteCmd(uchar cmd);
extern void LCD1602_WriteData(uchar dat);
extern void LCD1602_Init(uchar d,uchar c,uchar b);
extern uchar LCD1602_ReadStatus();
extern uchar LCD1602_ReadData();
extern void LCD1602_DefineCGRAM(uchar *sign);
extern void LCD1602_MoveScreen(uchar dir);
extern void LCD1602_MoveCursor(uchar dir);
extern void LCD1602_DisplayChar(uchar hang,uchar lie,uchar ascii);
extern void LCD1602_DisplayString(uchar hang,uchar lie,uchar *str);
extern void LCD1602_PrintHZ(unsigned char sta,unsigned char *hz);
#endif
AD9854数字合成器是高集成度的器件,它采用先进的DDS技术,片内整合了两路高速、高性能正交D/A转换器通过数字化编程可以输出I、Q两路合成信号。在高稳定度时钟的驱动下,AD9854将产生一高稳定的频率、相位、幅度可编程的正弦和余弦信号,作为本振用于通信,雷达等方面。AD9854的DDS核具有48位的频率分辨率(在300M系统时钟下,频率分辨率可达1uHZ)。输出17位相位截断保证了良好的无杂散动态范围指标。AD9854允许输出的信号频率高达150MHZ,而数字调制输出频率可达100MHZ。通过内部高速比较器正弦波转换为方波输出,可用作方便的时钟发生器。
8051版AD9854.c
#include
#include
#include
#include
//**********************以下为系统时钟以及其相关变量设置**************************/
/*
此处根据自己的需要设置系统时钟以及与其相关的因子,一次需且只需开启一个
CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ
Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型
*/
// #define CLK_Set 7
// const ulong Freq_mult_ulong = 1340357;
// const double Freq_mult_doulle = 1340357.032;
//#define CLK_Set 9
//const ulong Freq_mult_ulong = 1042500;
//const double Freq_mult_doulle = 1042499.9137431;
// #define CLK_Set 8
// const ulong Freq_mult_ulong = 1172812;
// const double Freq_mult_doulle = 2932031.403;
#define CLK_Set 10
const ulong Freq_mult_ulong = 938250;
const double Freq_mult_doulle = 938249.9224;
uchar FreqWord[6]; //6个字节频率控制字
//**************************修改硬件时要修改的部分********************************/
#define AD9854_DataBus P3
#define AD9854_AdrBus P1
sbit AD9854_RST = P2^0; //控制信号引脚
sbit AD9854_SP = P2^1;
sbit AD9854_OSK = P2^2; //osk
sbit AD9854_UDCLK = P2^4;
sbit AD9854_WR = P1^6;
sbit AD9854_FDATA = P2^6; //fsk/bpsk/hold
sbit AD9854_RD = P2^7;
//====================================================================================
//函数名称:void AD9854_WR_Byte(uchar addr,uchar dat)
//函数功能:AD9854并行口写入数据
//入口参数:addr 6位地址
// dat 写入的数据
//出口参数:无
//====================================================================================
void AD9854_WR_Byte(uchar addr,uchar dat)
{
AD9854_AdrBus = (addr&0x3f) | (P1&0xc0);
AD9854_DataBus = dat;
AD9854_WR = 0;
AD9854_WR = 1;
}
//====================================================================================
//函数名称:void AD9854_Init(void)
//函数功能:AD9854初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_Init(void)
{
AD9854_WR=1;//将读、写控制端口设为无效
AD9854_RD=1;
AD9854_UDCLK=0;
AD9854_RST=1; //复位AD9854
DelayMs(10);
AD9854_RST=0;
AD9854_SP = 1;
//AD9854_WR_Byte(0x1d,0x10); //关闭比较器
AD9854_WR_Byte(0x1d,0x00); //开启比较器
AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频
AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更新
AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿
AD9854_UDCLK=1; //更新AD9854输出
AD9854_UDCLK=0;
}
//====================================================================================
//函数名称:void Freq_convert(long Freq)
//函数功能:正弦信号频率数据转换
//入口参数:Freq 需要转换的频率,取值从0~SYSCLK/2
//出口参数:无 但是影响全局变量FreqWord[6]的值
//说明: 该算法位多字节相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK
// 得到该算法,其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK
// 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
//====================================================================================
void Freq_convert(long Freq)
{
ulong FreqBuf;
ulong Temp=Freq_mult_ulong;
uchar Array_Freq[4]; //将输入频率因子分为四个字节
Array_Freq[0]=(uchar)Freq;
Array_Freq[1]=(uchar)(Freq>>8);
Array_Freq[2]=(uchar)(Freq>>16);
Array_Freq[3]=(uchar)(Freq>>24);
FreqBuf=Temp*Array_Freq[0];
FreqWord[0]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[1]);
FreqWord[1]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[2]);
FreqWord[2]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[3]);
FreqWord[3]=FreqBuf;
FreqBuf>>=8;
FreqWord[4]=FreqBuf;
FreqWord[5]=FreqBuf>>8;
}
//====================================================================================
//函数名称:void AD9854_SetSine(ulong Freq,uint Shape)
//函数功能:AD9854正弦波产生程序
//入口参数:Freq 频率设置,取值范围为0~(1/2)*SYSCLK
// Shape 幅度设置. 为12 Bit,取值范围为(0~4095) ,取值越大,幅度越大
//出口参数:无
//====================================================================================
void AD9854_SetSine(ulong Freq,uint Shape)
{
uchar count;
uchar Adress;
Adress = 0x04; //选择频率控制字地址的初值
Freq_convert(Freq); //频率转换
for(count=6;count>0;) //写入6字节的频率控制字
{
AD9854_WR_Byte(Adress++,FreqWord[--count]);
}
AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度
AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度
AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));
AD9854_UDCLK=1; //更新AD9854输出
AD9854_UDCLK=0;
}
8051版AD9854.h
#ifndef AD9854_H
#define AD9854_H
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
void AD9854_WR_Byte(uchar addr,uchar dat);
void AD9854_Init(void);
void Freq_convert(long Freq);
void AD9854_SetSine(ulong Freq,uint Shape);
#endif
stm32核心板AD9854.c
#include
#include "AD9854.h"
#include "Delay.h"
//**********************以下为系统时钟以及其相关变量设置**************************/
/*
此处根据自己的需要设置系统时钟以及与其相关的因子,一次需且只需开启一个
CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ
Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型
*/
//#define CLK_Set 7
//const u32 Freq_mult_ulong = 1340357;
//const double Freq_mult_doulle = 1340357.032;
//#define CLK_Set 9
//const u32 Freq_mult_ulong = 1042500;
//const double Freq_mult_doulle = 1042499.9137431;
// #define CLK_Set 8
// const u32 Freq_mult_ulong = 1172812;
// const double Freq_mult_doulle = 1172812.403;
#define CLK_Set 10
const u32 Freq_mult_ulong = 938250;
const double Freq_mult_doulle = 938249.9224;
u8 FreqWord[6]; //6个字节频率控制字
//====================================================================================
// 初始化程序区
//====================================================================================
//====================================================================================
// void GPIO_AD9854_Configuration(void)
// 函数功能: AD9854引脚配置函数
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块: RCC_APB2PeriphClockCmd(); GPIO_Init();
// 注意事项: 无
//====================================================================================
void GPIO_AD9854_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能IO口时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC |
RCC_APB2Periph_GPIOB, ENABLE);
// 地址端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
| GPIO_Pin_4 | GPIO_Pin_5 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;; // 推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 数据端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;; // 推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 控制端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;; // 推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//====================================================================================
// AD9854驱动区
//====================================================================================
//====================================================================================
//函数名称:void AD9854_WR_Byte(uchar addr,uchar dat)
//函数功能:AD9854并行口写入数据
//入口参数:addr 6位地址
// dat 写入的数据
//出口参数:无
//====================================================================================
void AD9854_WR_Byte(u8 addr,u8 dat)
{
u16 Tmp;
Tmp = GPIO_ReadOutputData(GPIOA);
GPIO_Write(GPIOA, (u16)(addr&0x3f) | (Tmp & 0xFFC0)); // ADDER
Tmp = GPIO_ReadOutputData(GPIOB);
GPIO_Write(GPIOB, (u16)(dat<<8) | (Tmp & 0x00FF)); // DATA
AD9854_WR_Clr;
AD9854_WR_Set;
}
//====================================================================================
//函数名称:void AD9854_Init(void)
//函数功能:AD9854初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_Init(void)
{
AD9854_WR_Set; // 将读、写控制端口设为无效
AD9854_RD_Set;
AD9854_UDCLK_Clr;
AD9854_RST_Set; // 复位AD9854
Delay_10us (10);
AD9854_RST_Clr;
AD9854_SP_Set;
// AD9854_WR_Byte(0x1d,0x10); // 关闭比较器
AD9854_WR_Byte(0x1d,0x00); // 开启比较器
AD9854_WR_Byte(0x1e,CLK_Set); // 设置系统时钟倍频
AD9854_WR_Byte(0x1f,0x01); // 设置系统为模式0,由外部更新
AD9854_WR_Byte(0x20,0x60); // 设置为可调节幅度,取消插值补偿,关闭Sinc效应
AD9854_UDCLK_Set; // 更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void Freq_convert(long Freq)
//函数功能:正弦信号频率数据转换
//入口参数:Freq 需要转换的频率,取值从0~SYSCLK/2
//出口参数:无 但是影响全局变量FreqWord[6]的值
//说明: 该算法位多字节相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK
// 得到该算法,其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK
// 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
//====================================================================================
void Freq_convert(long Freq)
{
u32 FreqBuf;
u32 Temp=Freq_mult_ulong;
u8 Array_Freq[4]; //将输入频率因子分为四个字节
Array_Freq[0]=(u8) Freq;
Array_Freq[1]=(u8)(Freq>>8);
Array_Freq[2]=(u8)(Freq>>16);
Array_Freq[3]=(u8)(Freq>>24);
FreqBuf=Temp*Array_Freq[0];
FreqWord[0]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[1]);
FreqWord[1]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[2]);
FreqWord[2]=FreqBuf;
FreqBuf>>=8;
FreqBuf+=(Temp*Array_Freq[3]);
FreqWord[3]=FreqBuf;
FreqBuf>>=8;
FreqWord[4]=FreqBuf;
FreqWord[5]=FreqBuf>>8;
}
//====================================================================================
//函数名称:void AD9854_SetSine(ulong Freq,uint Shape)
//函数功能:AD9854正弦波产生程序
//入口参数:Freq 频率设置,取值范围为0~(1/2)*SYSCLK
// Shape 幅度设置. 为12 Bit,取值范围为(0~4095) ,取值越大,幅度越大
//出口参数:无
//====================================================================================
void AD9854_SetSine(u32 Freq,u16 Shape)
{
u8 count;
u8 Adress;
Adress = 0x04; //选择频率控制字地址的初值
Freq_convert(Freq); //频率转换
for(count=6;count>0;) //写入6字节的频率控制字
{
AD9854_WR_Byte(Adress++,FreqWord[--count]);
}
AD9854_WR_Byte(0x21,(Shape>>8) & 0x00FF); //设置I通道幅度
AD9854_WR_Byte(0x22,(Shape&0x00ff));
AD9854_WR_Byte(0x23,(Shape>>8) & 0x00FF); //设置Q通道幅度
AD9854_WR_Byte(0x24,(Shape&0x00ff));
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void Freq_doublt_convert(double Freq)
//函数功能:正弦信号频率数据转换
//入口参数:Freq 需要转换的频率,取值从0~SYSCLK/2
//出口参数:无 但是影响全局变量FreqWord[6]的值
//说明: 有公式FTW = (Desired Output Frequency × 2N)/SYSCLK得到该函数,
// 其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK
// 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
//注意: 该函数与上面函数的区别为该函数的入口参数为double,可使信号的频率更精确
// 谷雨建议在100HZ以下用本函数,在高于100HZ的情况下用函数void Freq_convert(long Freq)
//====================================================================================
//void Freq_double_convert(double Freq)
//{
// u32 Low32;
// u16 High16;
// double Temp=Freq_mult_doulle; //23ca99为2的48次方除以120M
// Freq*=(double)(Temp);
1 0000 0000 0000 0000 0000 0000 0000 0000 = 4294967295
// High16 = (int)(Freq/4294967295); //2^32 = 4294967295
// Freq -= (double)High16*4294967295;
// Low32 = (u32)Freq;
// FreqWord[0]=Low32;
// FreqWord[1]=Low32>>8;
// FreqWord[2]=Low32>>16;
// FreqWord[3]=Low32>>24;
// FreqWord[4]=High16;
// FreqWord[5]=High16>>8;
//}
//====================================================================================
//函数名称:void AD9854_SetSine_double(double Freq,uint Shape)
//函数功能:AD9854正弦波产生程序
//入口参数:Freq 频率设置,取值范围为0~1/2*SYSCLK
// Shape 幅度设置. 为12 Bit,取值范围为(0~4095)
//出口参数:无
//====================================================================================
//void AD9854_SetSine_double(double Freq,u16 Shape)
//{
// u8 count=0;
// u8 Adress;
// Adress=0x04; //选择频率控制字1地址的初值
// Freq_double_convert(Freq); //频率转换
//
// for(count=6;count>0;) //写入6字节的频率控制字
// {
// AD9854_WR_Byte(Adress++,FreqWord[--count]);
// }
//
// AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度
// AD9854_WR_Byte(0x22,(u8)(Shape&0xff));
//
// AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度
// AD9854_WR_Byte(0x24,(u8)(Shape&0xff));
// AD9854_UDCLK_Set; //更新AD9854输出
// AD9854_UDCLK_Clr;
//}
//====================================================================================
//函数名称:void AD9854_InitFSK(void)
//函数功能:AD9854的FSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
//void AD9854_InitFSK(void)
//{
// AD9854_WR_Set; //将读、写控制端口设为无效
// AD9854_RD_Clr;
// AD9854_UDCLK_Clr;
// AD9854_RST_Set; //复位AD9854
// Delay_1ms(1);
// AD9854_RST_Clr;
// AD9854_SP_Set;
// AD9854_WR_Byte(0x1d,0x10); //关闭比较器
// AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频
// AD9854_WR_Byte(0x1f,0x02); //设置系统为模式1,由外部更新
// AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿
// AD9854_UDCLK_Set; //更新AD9854输出
// AD9854_UDCLK_Clr;
//}
//====================================================================================
//函数名称:void AD9854_SetFSK(ulong Freq1,ulong Freq2)
//函数功能:AD9854的FSK设置
//入口参数:Freq1 FSK频率1
// Freq2 FSK频率2
//出口参数:无
//====================================================================================
//void AD9854_SetFSK(u32 Freq1,u32 Freq2)
//{
// u8 count=6;
// u8 Adress1,Adress2;
// const u16 Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095)
//
// Adress1=0x04; //选择频率控制字1地址的初值
// Adress2=0x0a; //选择频率控制字2地址的初值
//
// Freq_convert(Freq1); //频率转换1
//
// for(count=6;count>0;) //写入6字节的频率控制字
// {
// AD9854_WR_Byte(Adress1++,FreqWord[--count]);
// }
//
// Freq_convert(Freq2); //频率转换2
// for(count=6;count>0;) //写入6字节的频率控制字
// {
// AD9854_WR_Byte(Adress2++,FreqWord[--count]);
// }
// AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度
// AD9854_WR_Byte(0x22,(u8)(Shape&0xff));
//
// AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度
// AD9854_WR_Byte(0x24,(u8)(Shape&0xff));
// AD9854_UDCLK_Set; //更新AD9854输出
// AD9854_UDCLK_Clr;
//}
//====================================================================================
//函数名称:void AD9854_InitBPSK(void)
//函数功能:AD9854的BPSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
//void AD9854_InitBPSK(void)
//{
// AD9854_WR_Set; //将读、写控制端口设为无效
// AD9854_RD_Clr;
// AD9854_UDCLK_Clr;
// AD9854_RST_Set; //复位AD9854
// Delay_1ms(1);
// AD9854_RST_Clr;
// AD9854_SP_Set;
// AD9854_WR_Byte(0x1d,0x10); //关闭比较器
// AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频
// AD9854_WR_Byte(0x1f,0x08); //设置系统为模式4,由外部更新
// AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿
// AD9854_UDCLK_Set; //更新AD9854输出
// AD9854_UDCLK_Clr;
//}
//====================================================================================
//函数名称:void AD9854_SetBPSK(uint Phase1,uint Phase2)
//函数功能:AD9854的BPSK设置
//入口参数:Phase1 调制相位1
// Phase2 调制相位2
//出口参数:无
//说明: 相位为14Bit,取值从0~16383,谷雨建议在用本函数的时候将Phase1设置为0,
// 将Phase1设置为8192,180°相位
//====================================================================================
//void AD9854_SetBPSK(u16 Phase1,u16 Phase2)
//{
// u8 count;
// const u32 Freq=60000;
// const u16 Shape=4000;
// u8 Adress;
// Adress=0x04; //选择频率控制字1地址的初值
// AD9854_WR_Byte(0x00,Phase1>>8); //设置相位1
// AD9854_WR_Byte(0x01,(u8)(Phase1&0xff));
//
// AD9854_WR_Byte(0x02,Phase2>>8); //设置相位2
// AD9854_WR_Byte(0x03,(u8)(Phase2&0xff));
// Freq_convert(Freq); //频率转换
// for(count=6;count>0;) //写入6字节的频率控制字
// {
// AD9854_WR_Byte(Adress++,FreqWord[--count]);
// }
// AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度
// AD9854_WR_Byte(0x22,(u8)(Shape&0xff));
//
// AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度
// AD9854_WR_Byte(0x24,(u8)(Shape&0xff));
// AD9854_UDCLK_Set; //更新AD9854输出
// AD9854_UDCLK_Clr;
//}
//====================================================================================
//函数名称:void AD9854_InitOSK(void)
//函数功能:AD9854的OSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
//void AD9854_InitOSK(void)
//{
// AD9854_WR_Set; //将读、写控制端口设为无效
// AD9854_RD_Clr;
// AD9854_UDCLK_Clr;
// AD9854_RST_Set; //复位AD9854
// Delay_1ms(1);
// AD9854_RST_Clr;
// AD9854_SP_Set;
// AD9854_WR_Byte(0x1d,0x10); //关闭比较器
// AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频
// AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更新
// AD9854_WR_Byte(0x20,0x70); //设置为可调节幅度,取消插值补偿,通断整形内部控制
// AD9854_UDCLK_Set; //更新AD9854输出
// AD9854_UDCLK_Clr;
//}
//====================================================================================
//函数名称:void AD9854_SetOSK(uchar RateShape)
//函数功能:AD9854的OSK设置
//入口参数: RateShape OSK斜率,取值为4~255,小于4则无效
//出口参数:无
//====================================================================================
//void AD9854_SetOSK(u8 RateShape)
//{
// u8 count;
// const u32 Freq=60000; //设置载频
// const u16 Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095)
// u8 Adress;
// Adress=0x04; //选择频率控制字地址的初值
// Freq_convert(Freq); //频率转换
// for(count=6;count>0;) //写入6字节的频率控制字
// {
// AD9854_WR_Byte(Adress++,FreqWord[--count]);
// }
// AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度
// AD9854_WR_Byte(0x22,(u8)(Shape&0xff));
//
// AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度
// AD9854_WR_Byte(0x24,(u8)(Shape&0xff));
// AD9854_WR_Byte(0x25,RateShape); //设置OSK斜率
// AD9854_UDCLK_Set; //更新AD9854输出
// AD9854_UDCLK_Clr;
//}
//====================================================================================
//函数名称:void AD9854_InitAM(void)
//函数功能:AD9854的AM初始化
//入口参数:无
//出口参数:无
//====================================================================================
//void AD9854_InitAM(void)
//{
// u8 count;
// const u32 Freq=60000; //设置载频
// u8 Adress;
// Adress=0x04; //选择频率控制字地址的初值
//
// AD9854_WR_Set; //将读、写控制端口设为无效
// AD9854_RD_Clr;
// AD9854_UDCLK_Clr;
// AD9854_RST_Set; //复位AD9854
// Delay_1ms(1);
// AD9854_RST_Clr;
// AD9854_SP_Set;
// AD9854_WR_Byte(0x1d,0x10); //关闭比较器
// AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频
// AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更新
// AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿
// Freq_convert(Freq); //频率转换
// for(count=6;count>0;) //写入6字节的频率控制字
// {
// AD9854_WR_Byte(Adress++,FreqWord[--count]);
// }
// AD9854_UDCLK_Set; //更新AD9854输出
// AD9854_UDCLK_Clr;
//}
//====================================================================================
//函数名称:void AD9854_SetAM(uchar Shape)
//函数功能:AD9854的AM设置
//入口参数:Shape 12Bit幅度,取值从0~4095
//出口参数:无
//====================================================================================
//void AD9854_SetAM(u16 Shape)
//{
// AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度
// AD9854_WR_Byte(0x22,(u8)(Shape&0xff));
//
// AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度
// AD9854_WR_Byte(0x24,(u8)(Shape&0xff));
// AD9854_UDCLK_Set; //更新AD9854输出
// AD9854_UDCLK_Clr;
//}
//====================================================================================
//函数名称:void AD9854_InitRFSK(void)
//函数功能:AD9854的RFSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitRFSK(void)
{
AD9854_WR_Set; //将读、写控制端口设为无效
AD9854_RD_Clr;
AD9854_UDCLK_Clr;
AD9854_RST_Set; //复位AD9854
Delay_1ms(1);
AD9854_RST_Clr;
AD9854_SP_Set;
AD9854_FDATA_Clr;
AD9854_WR_Byte(0x1d,0x10); //关闭比较器
AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频
AD9854_WR_Byte(0x1f,0x24); //设置系统为模式2,由外部更新,使能三角波扫频功能
AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿,关闭Sinc效应
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void AD9854_SetRFSK(void)
//函数功能:AD9854的RFSK设置
//入口参数:Freq_Low RFSK低频率 48Bit
// Freq_High RFSK高频率 48Bit
// Freq_Up_Down 步进频率 48Bit
// FreRate 斜率时钟控制 20Bit
//出口参数:无
//注: 每两个脉冲之间的时间周期用下式表示(FreRate +1)*(System Clock ),一个脉冲,
// 频率 上升或者下降 一个步进频率
//====================================================================================
void AD9854_SetRFSK(u32 Freq_Low,u32 Freq_High,u32 Freq_Up_Down,u32 FreRate)
{
u8 count=6;
u8 Adress1,Adress2,Adress3;
const u16 Shape=3600; //幅度设置. 为12 Bit,取值范围为(0~4095)
Adress1=0x04; //选择频率控制字地址的初值
Adress2=0x0a;
Adress3=0x10;
Freq_convert(Freq_Low); //频率1转换
for(count=6;count>0;) //写入6字节的频率控制字
{
AD9854_WR_Byte(Adress1++,FreqWord[--count]);
}
Freq_convert(Freq_High); //频率2转换
for(count=6;count>0;) //写入6字节的频率控制字
{
AD9854_WR_Byte(Adress2++,FreqWord[--count]);
}
Freq_convert(Freq_Up_Down); //步进频率转换
for(count=6;count>0;) //写入6字节的频率控制字
{
AD9854_WR_Byte(Adress3++,FreqWord[--count]);
}
AD9854_WR_Byte(0x1a,(u8)((FreRate>>16)&0x0f)); //设置斜升速率
AD9854_WR_Byte(0x1b,(u8)(FreRate>>8));
AD9854_WR_Byte(0x1c,(u8)FreRate);
AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度
AD9854_WR_Byte(0x22,(u8)(Shape&0xff));
AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度
AD9854_WR_Byte(0x24,(u8)(Shape&0xff));
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
stm32核心板版AD9854.h
/*--------------------------------------------------------------
头文件名:AD9854.h
文件描述:数据处理头文件
---------------------------------------------------------------*/
#ifndef _AD9854_H_
#define _AD9854_H_
#include
//----------------------------------------------------------------
// AD9854_I/O控制线
//-----------------------------------------------------------------
#define AD9854_RD_Set (GPIO_SetBits(GPIOC,GPIO_Pin_8))
#define AD9854_RD_Clr (GPIO_ResetBits(GPIOC,GPIO_Pin_8))
#define AD9854_WR_Set (GPIO_SetBits(GPIOC,GPIO_Pin_9))
#define AD9854_WR_Clr (GPIO_ResetBits(GPIOC,GPIO_Pin_9))
#define AD9854_UDCLK_Set (GPIO_SetBits(GPIOC,GPIO_Pin_10))
#define AD9854_UDCLK_Clr (GPIO_ResetBits(GPIOC,GPIO_Pin_10))
#define AD9854_RST_Set (GPIO_SetBits(GPIOC,GPIO_Pin_11)) //开关电源板
#define AD9854_RST_Clr (GPIO_ResetBits(GPIOC,GPIO_Pin_11))
#define AD9854_SP_Set (GPIO_SetBits(GPIOC,GPIO_Pin_12))
#define AD9854_SP_Clr (GPIO_ResetBits(GPIOC,GPIO_Pin_12))
#define AD9854_OSK_Set (GPIO_SetBits(GPIOC,GPIO_Pin_13))
#define AD9854_OSK_Clr (GPIO_ResetBits(GPIOC,GPIO_Pin_13))
#define AD9854_FDATA_Set (GPIO_SetBits(GPIOC,GPIO_Pin_14)) //fsk/bpsk/hold
#define AD9854_FDATA_Clr (GPIO_ResetBits(GPIOC,GPIO_Pin_14))
//**************************以下部分为函数定义********************************
extern void GPIO_AD9854_Configuration(void); // AD9854_IO口初始化
static void AD9854_WR_Byte(u8 addr,u8 dat);
extern void AD9854_Init(void);
static void Freq_convert(long Freq);
extern void AD9854_SetSine(u32 Freq,u16 Shape);
static void Freq_double_convert(double Freq);
extern void AD9854_SetSine_double(double Freq,u16 Shape);
extern void AD9854_InitFSK(void);
extern void AD9854_SetFSK(u32 Freq1,u32 Freq2);
extern void AD9854_InitBPSK(void);
extern void AD9854_SetBPSK(u16 Phase1,u16 Phase2);
extern void AD9854_InitOSK(void);
extern void AD9854_SetOSK(u8 RateShape);
extern void AD9854_InitAM(void);
extern void AD9854_SetAM(u16 Shape);
extern void AD9854_InitRFSK(void);
extern void AD9854_SetRFSK(u32 Freq_Low,u32 Freq_High,u32 Freq_Up_Down,u32 FreRate);
#endif