




已阅读5页,还剩78页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用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#define PAR1_L 0X01/Phase Adjust Register#1#define PAR2_H 0X02/Phase Adjust Register#2#define PAR2_L 0X03/Phase Adjust Register#2#define FTW1_6 0X04/Frequency Tuning Word1#define FTW1_5 0X05/Frequency Tuning Word1#define FTW1_4 0X06/Frequency Tuning Word1#define FTW1_3 0X07/Frequency Tuning Word1#define FTW1_2 0X08/Frequency Tuning Word1#define FTW1_1 0X09/Frequency Tuning Word1#define FTW2_6 0X0A/Frequency Tuning Word2#define FTW2_5 0X0B/Frequency Tuning Word2#define FTW2_4 0X0C/Frequency Tuning Word2#define FTW2_3 0X0D/Frequency Tuning Word2#define FTW2_2 0X0E/Frequency Tuning Word2#define FTW2_1 0X0F/Frequency Tuning Word2#define DFW_6 0X10/Delta Frequency Word#define DFW_5 0X11/Delta Frequency Word#define DFW_4 0X12/Delta Frequency Word#define DFW_3 0X13/Delta Frequency Word#define DFW_2 0X14/Delta Frequency Word#define DFW_1 0X15/Delta Frequency Word#define UDCLK_4 0X16/Update Clock#define UDCLK_3 0X17/Update Clock#define UDCLK_2 0X18/Update Clock#define UDCLK_1 0X19/Update Clock#define RRC_3 0X1A/Ramp Rate Clock#define RRC_2 0X1B/Ramp Rate Clock#define RRC_1 0X1C/Ramp Rate Clock#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#define OSKI_1 0X22/Output Shape Key I Mult#define OSKQ_2 0X23/Output Shape Key Q Mult#define OSKQ_1 0X24/Output Shape Key Q Mult#define OSKRR 0X25/Output Shape Key Ramp Rate#define QDAC_2 0X26/QDAC#define QDAC_1 0X27/QDAC正弦波:#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 BIT0void 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;i0;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 BIT0void 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;i0;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 BIT0void 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;i0;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; /07采样保持时间为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 BIT0void 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;i0;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/*/*初始化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/*/*初始化ADC12*/void init_adc12() P6SEL |= 0XFF; ADC12CTL0 &= ENC; ADC12CTL0=0X03f0; /07采样保持时间为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; if(samp0x7ff) am=samp-0x7ff; per=am*0x10000/0x7ff; /per-long int; scal=0x10000; while(pp30x0f & per=0x600)per/=0x10;scal/=0x10; while(pp3=0x1000)per/=0x10;scal/=0x10; MPY=pp1; OP2=per; _NOP(); _NOP(); spp1=RESLO; c=RESHI; MPY=pp2; OP2=per; _NOP(); _NOP(); spp2=RESLO; spp2=spp2+c; c=RESHI; MPY=pp3; OP2=per; _NOP(); _NOP(); spp3=RESLO; spp3=spp3+c; switch(scal) case 0x10000:spp1=spp2;spp2=spp3;spp3=0x0000;break; case 0x1000:spp1=spp1/0x1000+(spp2%0x1000)*0x10;spp2=spp2/0x1000+(spp3%0x1000)*0x10;spp3=spp3/0x1000;break; case 0x100:spp1=spp1/0x100+(spp2%0x100)*0x100;spp2=spp2/0x100+(spp3%0x100)*0x100;spp3=spp3/0x100;break; case 0x10:spp1=spp1/0x10+(spp2%0x10)*0x1000;spp2=spp2/0x10+(spp3%0x10)*0x1000;spp3=spp3/0x10; send_byte(FTW1_1,ftw1+spp1%0x100); send_byte(FTW1_2,ftw2+spp1/0x100); send_byte(FTW1_3,ftw3+spp2%0x100); send_byte(FTW1_4,ftw4+spp2/0x100); send_byte(FTW1_5,ftw5+spp3%0x100); send_byte(FTW1_6,ftw6+spp3/0x100); for(i=15000;i0;i-); else am=0x7ff-samp; per=am*0x10000/0x7ff; /per-long int; scal=0x1000
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外墙防水保修合同书
- 时间主题的课件
- 企业信用评级与授信咨询服务协议
- 产品推广代理合同协议
- 过春节的活动作文(8篇)
- 早期教育概论课件
- 《新编商务应用文写作》第一章 习题参考答案
- 水孩子读后感250字(9篇)
- 早教分离焦虑课件
- 2025年瑞典语等级考试B1试卷:2025秋季学期词汇拓展
- 食堂从业人员开学前集中培训讲稿
- 2024新版《突发事件应对法》及其应用案例课件
- 介入手术交接流程
- 2024年国家安全法深度解读
- DB11-T 1140-2024 儿童福利机构常见疾病患儿养护规范
- 心脏康复戒烟处方
- 《工贸企业重大事故隐患判定标准(机械行业)》知识培训
- 2024年中考数学真题分类汇编(全国版)专题12一次函数及其应用(39题)含答案及解析
- 2024城市轨道交通节能改造EMC合作合同
- 全国职业院校技能大赛中职(大数据应用与服务赛项)考试题及答案
- 实验室检验结果及报告管理制度
评论
0/150
提交评论