完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在AD9954中已经实现了FM调制,与我需要的调制频率及调制频偏完全一致,但是输出幅度却无法调整
理论上调整输出幅度只需要改变ASF寄存器就可以了,在单音输出模式下已验证这样是可以的, 在FM调制下无论如何改变ASF值输出强度都是一样的大。程序流程如下: 1.CFR1->使能RAM模式 2.CFR2->配置时钟 3.ASF->配置输出强度 4.RSCW0->配置切换频率及内存地址 5.产生IO_Update 6.将数据一次性写入RAM中 7.产生IO_Update 代码如下: uint32_t Cfr1Data=0; Cfr1Data=1ul<<31|0<<30|0<<27|0<<26|0<<25|0<<24|0<<23|0<<22|0<<21|0<<15|0<<14| 0<<13|0<<12|0<<11|0<<10|0<<9|0<<8|0<<7|1<<6|0<<5|0<<4|0<<3|0<<2|0<<1; WriteDdsData(CFR1,Cfr1Data,8*4); uint32_t Cfr2Data=0; Cfr2Data=(0<<11|0<<10|0<<9|MUX<<3|1<<2|1<<0); WriteDdsData(CFR2,Cfr2Data,8*3); uint16_t u16_ASF; u16_ASF=DdsConfig->Val.Amp; WriteDdsData(ASF,u16_ASF,8*2); uint32_t u32_FreqSys; uint32_t u32_FreqDec; uint32_t u32_FreqChange; uint64_t u64_Ramptime; //系统时钟 u32_FreqSys=XTAL*MUX; //数字时钟 u32_FreqDec=u32_FreqSys/4; //频率切换时钟 u32_FreqChange=DdsConfig->Val.f_ModuFreq*WAVE_TABLE_SIZE; //计算ramp time u64_RampTime=u32_FreqDec/u32_FreqChange; if(u64_RampTime>65535) { u64_RampTime=65535; } uint64_t RampHex=0; RampHex=((u64_RampTime&0xff)<<8)|(u64_RampTime>>8); //写入ram控制寄存器 uint64_t u64_RSCW0=0; uint64_t u64_Point=WAVE_TABLE_SIZE-1; u64_RSCW0=(RampHex<<24|(u64_Point>>8)<<8|(u64_Point&0xff)<<16|(uint64_t)0x80); WriteDdsData(RSCW0,u64_RSCW0,8*5); //更新寄存器 DDS_IOUPDATE_CLR; DDS_IOUPDATE_SET; //将频率写入RAM中 RBDEV_CS_CLR; FPGADeviceWriteData(8,RAM_REG); for(uint16_t i=0;i |
|
相关推荐
6个回答
|
|
试过PM调制,遇到的现象是一样的
|
|
|
|
为何没有人回复?
|
|
|
|
|
|
|
|
KC_CEC, 能否把你配置AD9554的所有寄存器发给我们。谢谢。 Yiming |
|
|
|
你好,1楼所展示的就是初始化代码了。 初始化的过程中就已经初始化ASF寄存器了,我试过每次改变ASF就刷新这个函数,或者单独刷新ASF寄存器都不能调节输出幅度。 以下列出代码: 1、单音频输出,可以正常调节输出幅度 2、FM调制输出,不能调节幅度,幅度输出始终是最大值 3、调节ASF函数 /*功能:将DDS配置为单一输出频率模式参数:DdsConfig->dds配置结构说明:可以产生正弦波和方波*/static void DdsSingleOut(DdsConfigStr* DdsConfig){ /* 1(1):0->sync_clk脚激活 1->关闭 2(1):1->线性扫描无停留位使能 3(1):1->外部power_down 4(1):0->输入时钟使能 5(1):1->关闭DAC 6(1):1->关闭比较器 0->打开比较器 7(1):1->所有非IO数字功能被挂起 低功耗 0->所有数字功能和时钟激活 8(1):0->m*** 1->l*** 9(1):0->SDIO双向, 1->仅仅为sdi 10(1):1->相位累加器被清除,知道该位被主动清0 11(1):1->频率累加器被清除,知道该位被主动清0 12(1):0->相位与角度成余弦 1->相位与角度成正弦 13(1):1->当IO update有效自动清除相位累加器 14(1):1->当IO update有效自动清除频率累加器 15(1):1->线性扫描在定时器溢出或IO update有效都加载 0->仅仅在定时器溢出加载 21(1):1->使能线性扫描 22(1):1->软件同步多个9954 23(1):1->多个9954同步 24(1):1/0->斜坡方式 25(1):1->斜坡键控使能 26(1):1->幅度斜率定时器在溢出或IO update有效均加载 0->仅仅在定时器溢出加载 27(3):内部配置文件控制 30(1):1->ram输出驱动相位误差地址 0->输出驱动相位累加器(此位在bit 31使能才有效) 31(1):1->使能ram模式 */ //选择正弦波 uint32_t Cfr1Data=0; Cfr1Data=0<<31|0<<30|0<<27|0<<26|1<<25|0<<24|0<<23|0<<22|0<<21|0<<15|0<<14| 0<<13|0<<12|0<<11|0<<10|0<<9|0<<8|0<<7|1<<6|0<<5|0<<4|0<<3|0<<2|0<<1;// Cfr1Data=0<<31|0<<30|0<<27|0<<26|0<<25|0<<24|0<<23|0<<22|0<<21|0<<15|0<<14|// 0<<13|0<<12|0<<11|0<<10|0<<9|0<<8|0<<7|1<<6|0<<5|0<<4|0<<3|0<<2|0<<1; WriteDdsData(CFR1,Cfr1Data,8*4); #if DBG_DDS printf("CFR1 Data=%#xrn",ReadDdsData(CFR1,32)); #endif /* 0(2):电荷泵电流 00~11对应75~150ua 25ua步进 2(1):1->vco范围为250~400m 0->100~250m 3(5):倍频(4~20) 9(1):1->使能晶振输出缓冲 10(1):1->硬件手动sync 11(1):1->开启高速增强sync */ uint32_t Cfr2Data=0; Cfr2Data=(0<<11|0<<10|0<<9|DdsConfig->Mux<<3|1<<2|1<<0); WriteDdsData(CFR2,Cfr2Data,8*3); //计算频率寄存器 uint32_t u32_FreqSys; uint32_t u32_FTW; u32_FreqSys=XTAL*DdsConfig->Mux; u32_FTW=(uint64_t)(DdsConfig->Val.freq1*(4294967296u/(double)u32_FreqSys)); WriteDdsData(FTW0,u32_FTW,8*4); //计算相位寄存器 uint16_t u16_pow; u16_pow=DdsConfig->Val.phase1*45.5111111f; WriteDdsData(POW0,u16_pow,8*2); //计算幅度 uint16_t u16_ASF; u16_ASF=DdsConfig->Val.Amp; WriteDdsData(ASF,u16_ASF,8*2); //更新寄存器 DDS_IOUPDATE_CLR; DDS_IOUPDATE_SET;}/*功能:将DDS配置为FM输出模式参数:DdsConfig->dds配置结构说明:可以产生正弦波和方波*/void DdsFMOut(DdsConfigStr* DdsConfig){ /* 1(1):0->sync_clk脚激活 1->关闭 2(1):1->线性扫描无停留位使能 3(1):1->外部power_down 4(1):0->输入时钟使能 5(1):1->关闭DAC 6(1):1->关闭比较器 0->打开比较器 7(1):1->所有非IO数字功能被挂起 低功耗 0->所有数字功能和时钟激活 8(1):0->m*** 1->l*** 9(1):0->SDIO双向, 1->仅仅为sdi 10(1):1->相位累加器被清除,知道该位被主动清0 11(1):1->频率累加器被清除,知道该位被主动清0 12(1):0->相位与角度成余弦 1->相位与角度成正弦 13(1):1->当IO update有效自动清除相位累加器 14(1):1->当IO update有效自动清除频率累加器 15(1):1->线性扫描在定时器溢出或IO update有效都加载 0->仅仅在定时器溢出加载 21(1):1->使能线性扫描 22(1):1->软件同步多个9954 23(1):1->多个9954同步 24(1):1/0->斜坡方式 25(1):1->斜坡键控使能 26(1):1->幅度斜率定时器在溢出或IO update有效均加载 0->仅仅在定时器溢出加载 27(3):内部配置文件控制 30(1):1->ram输出驱动相位误差地址 0->输出驱动相位累加器(此位在bit 31使能才有效) 31(1):1->使能ram模式 */ #if 1 //选择正弦波 uint32_t Cfr1Data=0; Cfr1Data=1ul<<31|0<<30|0<<27|0<<26|0<<25|0<<24|0<<23|0<<22|0<<21|0<<15|0<<14| 0<<13|0<<12|0<<11|0<<10|0<<9|0<<8|0<<7|1<<6|0<<5|0<<4|0<<3|0<<2|0<<1; WriteDdsData(CFR1,Cfr1Data,8*4); /* 0(2):电荷泵电流 00~11对应75~150ua 25ua步进 2(1):1->vco范围为250~400m 0->100~250m 3(5):倍频(4~20) 9(1):1->使能晶振输出缓冲 10(1):1->硬件手动sync 11(1):1->开启高速增强sync */ uint32_t Cfr2Data=0; Cfr2Data=(0<<11|0<<10|0<<9|DdsConfig->Mux<<3|1<<2|1<<0); WriteDdsData(CFR2,Cfr2Data,8*3); //计算幅度 uint16_t u16_ASF; u16_ASF=DdsConfig->Val.Amp; WriteDdsData(ASF,u16_ASF,8*2); uint32_t u32_FreqSys; uint32_t u32_FreqDec; uint32_t u32_FreqChange; uint64_t u64_RampTime; //系统时钟 u32_FreqSys=XTAL*DdsConfig->Mux; //数字时钟 u32_FreqDec=u32_FreqSys/4; //频率切换时钟 u32_FreqChange=DdsConfig->Val.f_ModuFreq*WAVE_TABLE_SIZE; //计算ramp time u64_RampTime=u32_FreqDec/u32_FreqChange; if(u64_RampTime>65535) { u64_RampTime=65535; } uint64_t RampHex=0; RampHex=((u64_RampTime&0xff)<<8)|(u64_RampTime>>8); #if DBG_DDS printf("SysFreq=%u,DecFreq=%u,ModuFreq=%u,RameTime=%llurn",u32_FreqSys,u32_FreqDec,u32_FreqChange,u64_RampTime); #endif //写入ram控制寄存器 uint64_t u64_RSCW0=0; uint64_t u64_Point=WAVE_TABLE_SIZE-1; u64_RSCW0=(RampHex<<24|(u64_Point>>8)<<8|(u64_Point&0xff)<<16|(uint64_t)0x80); WriteDdsData(RSCW0,u64_RSCW0,8*5); #if DBG_DDS printf("RSCW0=%#llxrn",u64_RSCW0); #endif //更新寄存器 DDS_IOUPDATE_CLR; DDS_IOUPDATE_SET; FpgaAdjChannel(CON2_AD9954); //将频率写入RAM中 RBDEV_CS_CLR; FpgaDeviceWriteData(8,RAM_REG); for(uint16_t i=0;i |
|
|
|
ben233 发表于 2018-10-4 14:16 DdsFMOut(DdsConfigStr* DdsConfig)函数中显示Cfr1Data=0<<25|0<<24. 即【bit25】OSK Enable并没有被置位。请将该位改为1。 |
|
|
|
只有小组成员才能发言,加入小组>>
2261个成员聚集在这个小组
加入小组给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1270 浏览 2 评论
ADP5092 SYS端口为2.09V,但是REG_OUT为0是什么原因?
1874 浏览 1 评论
ad7193差分输入ain1与ain2差是正值时,读到电压与实际值误差小,但为负值值,误差就变的很大
4220 浏览 2 评论
8970 浏览 1 评论
3122 浏览 1 评论
ADC3442采集,分析数据出现有规则毛刺,请问是哪方面的问题啊?
1385浏览 3评论
AD7190状态寄存器一直是0x80,连续转换模式下RDY不拉低
1629浏览 2评论
1585浏览 2评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1271浏览 2评论
1371浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 16:57 , Processed in 0.951455 second(s), Total 87, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号