完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/********************************************************************************************************* ** 函数功能 :复位AD9954 ** 入口参数 :无 *********************************************************************************************************/ { AD9954_RET = 0; delay_ms(100); AD9954_CS = 0; PS0 = 0; IOUPDATE = 0; } ** 函数名称 :void AD9954_SENDBYTE(u8 dat) ** 函数说明 :AD9954的传输速度最大为25M,所以不加延时也可以 ** 出口参数 :无 void AD9954_SENDBYTE(u8 dat) u8 i; { if (dat & 0x80) AD9954_SDIO = 1; else AD9954_SDIO = 0; AD9954_SCLK = 1; } u8 AD9954_ReadByte(void) u8 i,dat=0; { dat|=AD9954_SDO; dat <<= 1; return dat; /********************************************************************************************************* ** 函数功能 :产生一个更新信号,更新AD9954内部寄存器, ** 入口参数 :无 *********************************************************************************************************/ { // delay_us(100); //delay_us(200); } ** 函数名称 :void AD9954_Init(void)) ** 函数说明 :默认关掉比较器的电源,因板上的晶振为100MHz,最大采用了4倍频,为400M ** 出口参数 :无 //读寄存器 { // char i; AD9954_SENDBYTE(CFR1); ret<<=8; ret<<=8; ret<<=8; AD9954_CS=1; } { // char i; AD9954_SENDBYTE(CFR2); ret<<=8; ret<<=8; AD9954_CS=0; } { AD9954_RESET(); AD9954_CS = 0; AD9954_SENDBYTE(CFR1);//地址0写操作 AD9954_SENDBYTE(0x00); // AD9954_SENDBYTE(0x40);//比较器power down AD9954_SENDBYTE(0x00);// #if fs>400 #elseif fs>=250 #else #endif AD9954_CS=1; //Get_FTW的修正后频率 { } /********************************************************************************************************* ** 函数功能 :设置AD9954当前的频率输出,采用的是单一频率输出 ** 入口参数 :欲设置的频率值 *********************************************************************************************************/ { AD9954_CS = 0; date = Get_FTW(f);//det=(f/fclk)x2^32=10.7374xf AD9954_SENDBYTE(FTW0);//FTW0地址 AD9954_SENDBYTE((u8)(date >> 24));//频率控制字 AD9954_SENDBYTE((u8)(date >> 8)); UPDATE(); } void DirectSwitchPSK(float f, float phase1, float phase2, float phase3, float phase4) u16 date; IOUPDATE = 0; AD9954_SENDBYTE(0x00);//地址0写操作 AD9954_SENDBYTE(0x00); AD9954_SENDBYTE(0x40); AD9954_SENDBYTE(0x01);//地址1写操作 AD9954_SENDBYTE(0x00); AD9954_SETFRE(f);//载波频率 PS1 = 0; AD9954_SENDBYTE(0x01);//ramp rate=0x0010 AD9954_SENDBYTE(0x00);//final address:0x000 AD9954_SENDBYTE(0x00);//RAM0工作于模式0,不停留位没有激活 date = 45.51*phase1; AD9954_SENDBYTE(0x0b); AD9954_SENDBYTE((u8)date); AD9954_SENDBYTE(0x00); PS0 = 1;//ram1 AD9954_SENDBYTE(0x01);//ramp rate=0x0010 AD9954_SENDBYTE(0x01);//final address:0x0001 AD9954_SENDBYTE(0x00);//RAM1工作于模式0,不停留位没有激活 date = 45.51*phase2; AD9954_SENDBYTE(0x0b); AD9954_SENDBYTE((u8)date); AD9954_SENDBYTE(0x00); PS0 = 0;//ram2 AD9954_SENDBYTE(0x01);//ramp rate=0x0010 AD9954_SENDBYTE(0x02);//final address:0x0002 AD9954_SENDBYTE(0x00); date = 45.51*phase3; AD9954_SENDBYTE(0x0b); AD9954_SENDBYTE((u8)date); AD9954_SENDBYTE(0x00); PS1 = 1; AD9954_SENDBYTE(0x01);//ramp rate=0x0010 AD9954_SENDBYTE(0x03);//final address:0x0003 AD9954_SENDBYTE(0x00); date = 45.51*phase4; AD9954_SENDBYTE(0x0b); AD9954_SENDBYTE((u8)date); AD9954_SENDBYTE(0x00); AD9954_SENDBYTE(0x00);//地址0写操作 AD9954_SENDBYTE(0x00); AD9954_SENDBYTE(0x40); UPDATE(); /********************************************************************************************************* ** 函数功能 :PSK调制信号输出 ** 这里使用一个RAM段的循环模式,PSK信号为8为数据位。 ** 当跟输出PSK载波的频率是ram rate跟新频率的整数倍时,才能保证每次的相位改变一致 ** u16 *phase: 写入相位累加器的相位值,180实现对相位翻转,0不改变相位,PSK信号为8位,需为8位的数组 *********************************************************************************************************/ { u16 date; IOUPDATE = 0; AD9954_SENDBYTE(0x00);//地址0写操作 AD9954_SENDBYTE(0x00); AD9954_SENDBYTE(0x40); AD9954_SENDBYTE(0x01);//地址1写操作 AD9954_SENDBYTE(0x00); AD9954_SETFRE(f);//载波频率 AD9954_SENDBYTE(0x04);//FTW0地址 AD9954_SENDBYTE(0x10); AD9954_SENDBYTE(0x00); PS1 = 0; AD9954_SENDBYTE(0x00);//ramp rate=0x0400 AD9954_SENDBYTE(0x07);//final address:0x007 AD9954_SENDBYTE(0x80);//RAM0工作于模式4,不停留位没有激活 for (i = 0;i<8;i++) date = 45.51*phase; AD9954_SENDBYTE((u8)(date >> 8));//频率控制字 AD9954_SENDBYTE(0x00); } AD9954_SENDBYTE(0xc0);//打开RAM控制位驱动FTW AD9954_SENDBYTE(0x00); AD9954_CS = 1; } ** 函数名称 :void Generate_FM(u32 *fre) ** 函数说明 :通过RAM端来控制信号的频率,从而实现FM信号的调制 ** RAM的更新速度由ram rate定时寄存器控制,寄存器为16位,实现对系统提供的100M时钟1~65535分频,写0是无效的 ** 入口参数 :u32 *fre:FM信号频率值,这里采用的是32点频率采样,调用此函数之前需先设置好频率表的值,其按正弦规律改变 ** { ** } Fc调制前载波的角频率,Fshift void Generate_FM(u32 *fre) u8 i; AD9954_CS = 0; AD9954_SENDBYTE(0x00);//打开RAM控制位驱动FTW AD9954_SENDBYTE(0x00); AD9954_SENDBYTE(0x00);// AD9954_SENDBYTE(0x24);//4倍频,打开VCO控制高位,系统时钟倍频后为400M PS0 = 0; AD9954_SENDBYTE(0x07); AD9954_SENDBYTE(0x0C); AD9954_SENDBYTE(0x00);//start address:0x000; UPDATE(); AD9954_SENDBYTE(0x0b); { AD9954_SENDBYTE((u8)(date >> 24));//频率控制字 AD9954_SENDBYTE((u8)(date >> 8)); } AD9954_SENDBYTE(0x80);//打开RAM控制位驱动FTW AD9954_SENDBYTE(0x00); AD9954_CS = 1; } ** 函数名称 :void ASK_Init(void) ** 函数说明 :ASK调制,需要先设置好载波频率,然后改变DAC比例因子 scale factor其为14位,通过设置为最大和0两种值实现ASK信号的调制 ** 入口参数 :无 ****************************************************** ***************************************************/ { AD9954_SENDBYTE(0x00);//地址0写操作 AD9954_SENDBYTE(0x00); AD9954_SENDBYTE(0x20);//当受到UPDATE信号,自动清楚相位累加器 // AD9954_SENDBYTE(0X05); AD9954_SENDBYTE(0X00); AD9954_CS = 1; }
|
|
相关推荐
|
|
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi编写程序
671 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第三十七章 image图像对比实验
653 浏览 0 评论
781 浏览 1 评论
564 浏览 0 评论
关于RT-Thread studio添加freemodbus控件失败的问题
936 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11655 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 23:36 , Processed in 0.535425 second(s), Total 69, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号