资源描述
(完整word)用DDS AD9854产生各种波形程序集
用DDS AD9854产生各种波形程序集
本程序集包含以下波形的程序:
正弦波,三角波,AM调制,FM调制,ASK调制,PSK调制,FSK调制
最后还有一个包含12864液晶显示、7290键盘控制的可以输出正弦波,三角波,方波(由单片机产生),AM调制,FM调制,ASK调制和PSK调制的一个DDS函数发生器的综合系统.
这些程序都是本人写的,单片机用的是TI的msp430f247,这些程序都经过精心调试,并都已调试成功.
希望这些程序能给需要的朋友一定的帮助。
头文件【AD9854.h】:
#define PAR1_H 0x00 //Phase Adjust Register#1〈13:8>
#define PAR1_L 0X01 //Phase Adjust Register#1<7:0〉
#define PAR2_H 0X02 //Phase Adjust Register#2〈13:8>
#define PAR2_L 0X03 //Phase Adjust Register#2<7:0〉
#define FTW1_6 0X04 //Frequency Tuning Word1<47:40>
#define FTW1_5 0X05 //Frequency Tuning Word1<39:32>
#define FTW1_4 0X06 //Frequency Tuning Word1<31:24>
#define FTW1_3 0X07 //Frequency Tuning Word1<23:16〉
#define FTW1_2 0X08 //Frequency Tuning Word1<15:8>
#define FTW1_1 0X09 //Frequency Tuning Word1<7:0〉
#define FTW2_6 0X0A //Frequency Tuning Word2<47:40〉
#define FTW2_5 0X0B //Frequency Tuning Word2〈39:32〉
#define FTW2_4 0X0C //Frequency Tuning Word2〈31:24>
#define FTW2_3 0X0D //Frequency Tuning Word2<23:16>
#define FTW2_2 0X0E //Frequency Tuning Word2<15:8〉
#define FTW2_1 0X0F //Frequency Tuning Word2〈7:0>
#define DFW_6 0X10 //Delta Frequency Word<47:40>
#define DFW_5 0X11 //Delta Frequency Word〈39:32〉
#define DFW_4 0X12 //Delta Frequency Word<31:24>
#define DFW_3 0X13 //Delta Frequency Word〈23:16>
#define DFW_2 0X14 //Delta Frequency Word〈15:8〉
#define DFW_1 0X15 //Delta Frequency Word<7:0>
#define UDCLK_4 0X16 //Update Clock〈31:24〉
#define UDCLK_3 0X17 //Update Clock〈23:16〉
#define UDCLK_2 0X18 //Update Clock<15:8>
#define UDCLK_1 0X19 //Update Clock<7:0〉
#define RRC_3 0X1A //Ramp Rate Clock〈19:16〉
#define RRC_2 0X1B //Ramp Rate Clock<15:8〉
#define RRC_1 0X1C //Ramp Rate Clock<7:0>
#define PD 0X1D //Power Down:DC,DC,DC,Comp PD,0,QDAC PD,DAC PD,DIG PD
#define REFCLK 0X1E //REFCLK:DC,PLL Range,Bypass PLL,RM4,RM3,RM2,RM1,RM0
#define MOD 0X1F //MOD:CLR ACC1,CLR ACC2,Triangle,SRC QDAC,M2,M1,M0,Int Update Clk
#define OSK_S 0X20 //OSK&SERIAL COM:DC,Bypass Inv Sinc,OSK EN,OSK INT,DC,DC,LSB First,SDO Active
#define OSKI_2 0X21 //Output Shape Key I Mult〈11:8>
#define OSKI_1 0X22 //Output Shape Key I Mult<7:0>
#define OSKQ_2 0X23 //Output Shape Key Q Mult<11:8〉
#define OSKQ_1 0X24 //Output Shape Key Q Mult〈7:0>
#define OSKRR 0X25 //Output Shape Key Ramp Rate<7:0〉
#define QDAC_2 0X26 //QDAC〈11:8〉
#define QDAC_1 0X27 //QDAC〈7:0〉
正弦波:
#include ”msp430x24x。h"
#include ”AD9854.h”
#define uchar unsigned char
#define us _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP()
#define data_out P5OUT
#define data_in P5IN
#define data_dir P5DIR
#define add_out P4OUT
#define add_dir P4DIR
#define ctrl_out P1OUT
#define ctrl_dir P1DIR
#define UDCLK BIT6
#define WR BIT5
#define RD BIT4
#define FBH BIT3
#define SK BIT2
#define SP BIT1
#define RST BIT0
void init();
void init_9854();
void send_byte(uchar add,uchar data);
uchar read_byte(uchar add);
void delayus(int t);
uchar FTW1,FTW2,FTW3,FTW4,FTW5,FTW6,P_D,REF_CLK,UD_CLK1,UD_CLK2,UD_CLK3,UD_CLK4,OSKS,MD;
//**********************系统整体时钟设定****************//
void time_set()
{
char i;
BCSCTL1&=~(XT2OFF+XTS); //启动xt2,ACLK为LFXT1
BCSCTL2|=SELM1; //MCLK为XT2
BCSCTL2&=~SELS; //SMCLK为DCO
do
{
IFG1&=~OFIFG;
for(i=0xFF;i〉0;i-—);
}
while((IFG1&OFIFG)!=0);
}
//*****************************************************//
//**************主函数***************//
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
init();
init_9854();
send_byte(PD,0x00); //turn on I DAC and DIG,but still off Q DAC,PD: DC,DC,DC,COMP, 0,QDAC,DAC,DIG
/* send_byte(FTW1_6,0x15); //设置频率10MHz:15 55 46 8C 40 00
send_byte(FTW1_5,0x55);
send_byte(FTW1_4,0x46);
send_byte(FTW1_3,0x8C);
send_byte(FTW1_2,0x40);
send_byte(FTW1_1,0x00);*/
send_byte(FTW1_6,0x02); //设置频率1MHz:02 22 22 22 22 22
send_byte(FTW1_5,0x22);
send_byte(FTW1_4,0x22);
send_byte(FTW1_3,0x00);
send_byte(FTW1_2,0x00);
send_byte(FTW1_1,0x00);
}
//**********************************//
//********单片机初始化***********//
void init()
{
time_set();
data_dir=0xFF;
add_dir=0xff;
ctrl_dir=0xff;
ctrl_out=0x32; //CP,UDCLK,F/B/H,SK,RST=0;WR,RD,S/P=1
}
//*******************************//
//**********初始化AD9854*********//
void init_9854()
{
ctrl_out|=RST;
delayus(1);
ctrl_out&=~RST;
//1F为默认值,即Triangle=0,QDAC为内部输入,模式0,内部刷新时钟
send_byte(REFCLK,0x04); //PLL小于200MHz,不旁路PLL,4倍频
delayus(4); //延时4us,以保证数据写入
send_byte(UDCLK_1,0x20); //将刷新周期改为600多ns,保证发送1字节数据的周期大于刷新周期
delayus(2); //延时1us,以保证数据写入
send_byte(PD,0x17); //power down所有模块
send_byte(OSK_S,0x00); //不旁路Inv Sinc,不使能OSK EN
}
//*******************************//
//**********发送1字节数据************//
void send_byte(uchar add,uchar data)
{
data_dir=0xff;
ctrl_out|=WR;
add_out=add; //送地址
_NOP();
ctrl_out&=~WR; //拉低WR
data_out=data; //送数据
_NOP();
ctrl_out|=WR; //拉高WR
delayus(1);
}
//***********************************//
//**********读取一个字节的数据**********//
uchar read_byte(uchar add)
{
uchar dat;
data_dir=0x00;
ctrl_out|=RD;
add_out=add;
ctrl_out&=~RD;
_NOP();
dat=data_in;
ctrl_out|=RD;
return dat;
}
//**************************************//
//**********1us延时************//
void delayus(int t)
{
while(t——)us;
}
三角波:
#include ”msp430x24x.h"
#include "AD9854.h"
#define uchar unsigned char
#define us _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP()
#define data_out P5OUT
#define data_in P5IN
#define data_dir P5DIR
#define add_out P4OUT
#define add_dir P4DIR
#define ctrl_out P1OUT
#define ctrl_dir P1DIR
#define UDCLK BIT6
#define WR BIT5
#define RD BIT4
#define FBH BIT3
#define SK BIT2
#define SP BIT1
#define RST BIT0
void init();
void init_9854();
void init_TA();
void send_byte(uchar add,uchar data);
uchar read_byte(uchar add);
void delayus(int t);
//**********************系统整体时钟设定****************//
void time_set()
{
char i;
BCSCTL1&=~(XT2OFF+XTS); //启动xt2,ACLK为LFXT1
BCSCTL2|=SELM1; //MCLK为XT2
BCSCTL2|=SELS+BIT2+BIT1; //SMCLK为XT2,8分频
do
{
IFG1&=~OFIFG; for(i=0xFF;i〉0;i-—);
}
while((IFG1&OFIFG)!=0);
}
//*****************************************************//
//**************主函数***************//
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
init();
init_9854();
init_TA();
send_byte(PD,0x10); //turn on I DAC and DIG,but still off Q DAC,PD: DC,DC,DC,COMP, 0,QDAC,DAC,DIG
CCR0=18; //18
CCR1=9; //16
send_byte(OSKRR,0X03); //幅度扫描时间设为最大--8。7381ms ~~~~~~~~~~~~~~~~
TACTL|=0X0010; //开始增计数模式
while(1);
}
//**********************************//
//********单片机初始化***********//
void init()
{
time_set();
data_dir=0xFF;
add_dir=0xff;
ctrl_dir=0xff;
P1SEL|=0X04; //P1。2为TA1输出
ctrl_out=0x36; //UDCLK,F/B/H,RST=0;WR,RD,SK,S/P=1
}
//*******************************//
//**********初始化AD9854*********//
void init_9854()
{
ctrl_out|=RST;
delayus(1);
ctrl_out&=~RST;
//1F为默认值,即Triangle=0,QDAC为内部输入,模式0,内部刷新时钟
send_byte(REFCLK,0x04); //PLL小于200MHz,不旁路PLL,4倍频
delayus(4); //延时4us,以保证数据写入
send_byte(UDCLK_1,0x20); //将刷新周期改为600多ns,保证发送1字节数据的周期大于刷新周期
delayus(2); //延时1us,以保证数据写入
send_byte(PD,0x17); //power down所有模块
send_byte(OSK_S,0x30); //不旁路Inv Sinc,使能OSK EN,选择内部配置ramp
}
//*******************************//
//*********Timer_A初始化*********//
void init_TA()
{
TACTL=0X0204; //选择子系统时钟,不分频,停止计数,清除定时器,禁止中断,清溢出标志
CCTL1=OUTMOD_7; //禁止捕获,输出模式7(复位/置位模式)
}
//**********发送1字节数据************//
void send_byte(uchar add,uchar data)
{
data_dir=0xff;
ctrl_out|=WR;
add_out=add; //送地址
_NOP();
ctrl_out&=~WR; //拉低WR
data_out=data; //送数据
_NOP();
ctrl_out|=WR; //拉高WR
delayus(1);
}
//***********************************//
//**********读取一个字节的数据**********//
uchar read_byte(uchar add)
{
uchar dat;
data_dir=0x00;
ctrl_out|=RD;
add_out=add;
ctrl_out&=~RD;
_NOP();
dat=data_in;
ctrl_out|=RD;
return dat;
}
//**************************************//
//**********1us延时************//
void delayus(int t)
{
while(t——)us;
}
AM调制:
#include ”msp430x24x.h”
#include "AD9854。h”
#define uchar unsigned char
#define us _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP()
#define data_out P5OUT
#define data_in P5IN
#define data_dir P5DIR
#define add_out P4OUT
#define add_dir P4DIR
#define ctrl_out P1OUT
#define ctrl_dir P1DIR
#define UDCLK BIT6
#define WR BIT5
#define RD BIT4
#define FBH BIT3
#define SK BIT2
#define SP BIT1
#define RST BIT0
void init();
void init_9854();
void init_adc12();
void send_byte(uchar add,uchar data);
uchar read_byte(uchar add);
void delayus(int t);
int samp=0,ATW;
float A=0.5,dc,ac; //A:调制指数,dc:直流量,ac:交流量
//**********************系统整体时钟设定****************//
void time_set()
{
char i;
BCSCTL1&=~(XT2OFF+XTS); //启动xt2,ACLK为LFXT1
BCSCTL2|=SELM1; //MCLK为XT2
BCSCTL2&=~SELS; //SMCLK为DCO
do
{
IFG1&=~OFIFG;
for(i=0xFF;i〉0;i--);
}
while((IFG1&OFIFG)!=0);
}
//*****************************************************//
//**************主函数***************//
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
init();
init_9854();
init_adc12();
send_byte(PD,0x10); //turn on I DAC and DIG,but still off Q DAC,PD: DC,DC,DC,COMP, 0,QDAC,DAC,DIG
send_byte(FTW1_6,0x2a); //设置频率10MHz:15 55 46 8C 40 00
send_byte(FTW1_5,0xaa);
send_byte(FTW1_4,0x8d);
send_byte(FTW1_3,0x18);
send_byte(FTW1_2,0x80);
send_byte(FTW1_1,0x00);
ADC12CTL0 |= 0x01; //开始转换
while(1);
}
//**********************************//
//********单片机初始化***********//
void init()
{
time_set();
data_dir=0xFF;
add_dir=0xff;
ctrl_dir=0xff;
ctrl_out=0x32; //CP,UDCLK,F/B/H,SK,RST=0;WR,RD,S/P=1
}
//*******************************//
//**********初始化AD9854*********//
void init_9854()
{
ctrl_out|=RST;
delayus(1);
ctrl_out&=~RST;
//1F为默认值,即Triangle=0,QDAC为内部输入,模式0,内部刷新时钟
send_byte(REFCLK,0x04); //PLL小于200MHz,不旁路PLL,4倍频
delayus(4); //延时4us,以保证数据写入
send_byte(UDCLK_1,0x20); //将刷新周期改为600多ns,保证发送1字节数据的周期大于刷新周期
delayus(2); //延时1us,以保证数据写入
send_byte(PD,0x17); //power down所有模块
send_byte(OSK_S,0x20); //不旁路Inv Sinc,使能OSK EN,使用OSK寄存器
}
//*******************************//
//*********初始化ADC12*******//
void init_adc12()
{
P6SEL |= 0XFF;
ADC12CTL0 &= ~ENC;
ADC12CTL0=0X03f0; //0~7采样保持时间为ADC12时钟的32倍(4us),多次采样,2.5V参考源,参考源开,ADC12内核开,溢出中断等关闭
ADC12CTL1=0X0214; //首地址从ADC12MEM0开始,输入信号源为ADC12SC,采样由SAMPCON触发,输入信号同向输入,不分频,时钟源选择MCLK,单通道多次转换
ADC12MCTL0=0X10; //通道0选择内部参考源—-2。5V
ADC12IE=0X0001; //使能通道0转换完成后中断
_EINT();
ADC12CTL0 |= ENC; //使能AD转换
}
//****************************//
//**********发送1字节数据************//
void send_byte(uchar add,uchar data)
{
data_dir=0xff;
ctrl_out|=WR;
add_out=add; //送地址
_NOP();
ctrl_out&=~WR; //拉低WR
data_out=data; //送数据
_NOP();
ctrl_out|=WR; //拉高WR
delayus(1);
}
//***********************************//
//**********读取一个字节的数据**********//
uchar read_byte(uchar add)
{
uchar dat;
data_dir=0x00;
ctrl_out|=RD;
add_out=add;
ctrl_out&=~RD;
_NOP();
dat=data_in;
ctrl_out|=RD;
return dat;
}
//**************************************//
//**********1us延时************//
void delayus(int t)
{
while(t-—)us;
}
#pragma vector=ADC12_VECTOR
__interrupt void adc12()
{
samp=ADC12MEM0;
dc=(1-A)*0XFFF/(1+A);
ac=2*A*samp/(1+A);
ATW=dc+ac;
send_byte(OSKI_2,ATW/0x100);
send_byte(OSKI_1,ATW%0x100);
}
FM调制:
#include "msp430x24x。h"
#include "AD9854。h”
#define uchar unsigned char
#define us _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP()
#define data_out P5OUT
#define data_in P5IN
#define data_dir P5DIR
#define add_out P4OUT
#define add_dir P4DIR
#define ctrl_out P1OUT
#define ctrl_dir P1DIR
#define UDCLK BIT6
#define WR BIT5
#define RD BIT4
#define FBH BIT3
#define SK BIT2
#define SP BIT1
#define RST BIT0
void init();
void init_9854();
void init_adc12();
void send_byte(uchar add,uchar data);
uchar read_byte(uchar add);
void delayus(int t);
int samp=0,pp=75; //pp:频偏
uchar ftw1,ftw2,ftw3,ftw4,ftw5,ftw6;
unsigned int am,per,pp1,pp2,pp3,spp1,spp2,spp3,ftw11,ftw12,ftw13,ftw14,ftw15,ftw16,c,i;
long int scal;
uchar rd=0;
//**********************系统整体时钟设定****************//
void time_set()
{
char i;
BCSCTL1&=~(XT2OFF+XTS); //启动xt2,ACLK为LFXT1
BCSCTL2|=SELM1; //MCLK为XT2
BCSCTL2&=~SELS; //SMCLK为DCO
do
{
IFG1&=~OFIFG;
for(i=0xFF;i〉0;i—-);
}
while((IFG1&OFIFG)!=0);
}
//*****************************************************//
//**************主函数***************//
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
init();
init_9854();
init_adc12();
send_byte(PD,0x10); //turn on I DAC and DIG,but still off Q DAC,PD: DC,DC,DC,COMP, 0,QDAC,DAC,DIG
send_byte(FTW1_6,0x02); //设置频率1MHz:02 22 20 a7 a0 00
send_byte(FTW1_5,0x22);
send_byte(FTW1_4,0x20);
send_byte(FTW1_3,0xa7);
send_byte(FTW1_2,0xa0);
send_byte(FTW1_1,0x00);
ftw1=0x00;
ftw2=0xa0;
ftw3=0xa7;
ftw4=0x20;
ftw5=0x22;
ftw6=0x02;
switch(pp)
{
case 15:pp3=0x0008;pp2=0x3156;pp1=0x544E;break;
case 20:pp3=0x000A;pp2=0xEC2C;pp1=0x5000;break;
case 25:pp3=0x000D;pp2=0xA746;pp1=0xA640;break;
case 30:pp3=0x0010;pp2=0x6251;pp1=0xBA40;break;
case 35:pp3=0x0013;pp2=0x1D5C;pp1=0xCE40;break;
case 40:pp3=0x0015;pp2=0xD867;pp1=0xE240;break;
case 45:pp3=0x0018;pp2=0x9345;pp1=0x2F80;break;
case 50:pp3=0x001B;pp2=0x4E6E;pp1=0xC800;break;
case 55:pp3=0x001E;pp2=0x0998;pp1=0x6080;break;
case 60:pp3=0x0020;pp2=0xC4C1;pp1=0xF900;break;
case 65:pp3=0x0023;pp2=0x7FEB;pp1=0x9180;break;
case 70:pp3=0x0026;pp2=0x3A7C;pp1=0x9380;break;
case 75:pp3=0x0028;pp2=0xF5A6;pp1=0x2C00;
}
ADC12CTL0 |= 0x01; //开始转换
while(1);
}
//**********************************//
//********单片机初始化***********//
void init()
{
time_set();
data_dir=0xFF;
add_dir=0xff;
ctrl_dir=0xff;
ctrl_out=0x32; //CP,UDCLK,F/B/H,SK,RST=0;WR,RD,S/P=1
}
//***
展开阅读全文