收藏 分销(赏)

用DDS-AD9854产生各种波形程序集.doc

上传人:w****g 文档编号:2645953 上传时间:2024-06-03 格式:DOC 页数:75 大小:279.54KB 下载积分:16 金币
下载 相关 举报
用DDS-AD9854产生各种波形程序集.doc_第1页
第1页 / 共75页
用DDS-AD9854产生各种波形程序集.doc_第2页
第2页 / 共75页


点击查看更多>>
资源描述
(完整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 } //***
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服