搜索
bottom↓
回复: 10

DDS输出频率在特定点错误

[复制链接]

出0入0汤圆

发表于 2016-9-25 00:51:44 | 显示全部楼层 |阅读模式
         目前在做一个基于51单片机和CPLD的DDS信号源。单片机是STC的51,CPLD是EPM240。

         基本结构是单片机负责按键输入和显示参数,CPLD负责DDS合成波形输出,最高频率2MHz

        按键输入频率值,由单片机计算出频率字通过SPI发送给CPLD。

         现在碰到的问题是,当设置输出频率的万位数为“7/8/9”时,输出频率就不对,其他情况都对。

        比如频率值为X6-X5-X4-X3-X2-X1-X0,仅当X4取值为“7/8/9”时就出错,60000或1969999时没问题,

        但是70000就输出4464,17000输出104464,117000输出1104464,也就是说除了X4之外高位变化

        都是正确的。更奇葩的是80000时输出14464,90000输出24464,都是按照10000递增,好像也没错。

        也考虑过是不是在转换频率字的过程中,数据类型出错的原因,如果给CPLD发送整数而不是存储计算值的

        变量,输出也是对的。最后附上关键代码,请高手指正!

        /////////////////////////////////////////////////////////////

        #define FREQCONS (4294967296.0/50000000.0)         //频率字计算常数,DDS累加器位宽32位,系统时钟50MHz
        unsigned long BinFreq,  TxsFreq;                                //频率值二进数和转换后的数
        unsigned char NumFreq[7]                                        //用于显示的频率值BCD码数组
        BinFreq = NumFreq[6]*1000000 + NumFreq[5]*100000 + NumFreq[4]*10000 + NumFreq[3]*1000 + NumFreq[2]*100 + NumFreq[1]*10 + NumFreq[0];
        TxsFreq = (((float)(BinFreq))*FREQCONS);

        SendCpld(TxsFreq);                                                //发送频率字给CPLD,万位为7/8/9出错
        //SendCpld(6012954);                                                //直接发送计算好的常数,则输出正确,这里为输出70000的频率字

        Fout = 2^32/50M * 70K = 6012954

        ///////////////////////////////////////////////////////////
void SendCpld(unsigned long parm2)
{       
        unsigned long DataBuf2;
       
        unsigned char i=0;                                //循环变量
       
        /*        初始化接口        */
        F_nLK = 1;                                               
        F_nCS = 1;                                               
        F_SCK = 1;                                               
        F_SDA = 1;       

        DataBuf2 = parm2;
       
        /*        ----------------------------------------------------        */
        F_nCS = 0;                                        //传输开始

        for (i=0; i<32; i++)                            //每组32位频率字
        {
                if (DataBuf2 & 0x80000000)        //判断当前位状态
                        F_SDA = 1;
                else
                        F_SDA = 0;
                F_SCK = 0;                              //产生串行时钟
                F_SCK = 1;
                F_SCK = 0;
                DataBuf2 <<= 1;                      //左移一位,传送下一位
        }

        F_nCS = 1;                                        //传输结束
        /*        ----------------------------------------------------        */
       
        F_nLK = 0;                                        //产生锁存信号
        F_nLK = 1;
}

       

出0入0汤圆

发表于 2016-9-25 13:40:51 来自手机 | 显示全部楼层
长整型定义问题

出0入0汤圆

 楼主| 发表于 2016-9-25 15:36:34 | 显示全部楼层

能具体点么,多谢!

出0入18汤圆

发表于 2016-9-25 18:51:41 来自手机 | 显示全部楼层
想想70000减去4464等于多少,有没有很熟悉?

出0入0汤圆

 楼主| 发表于 2016-9-25 20:20:00 | 显示全部楼层
本帖最后由 wuq_cody 于 2016-9-25 20:21 编辑
feigoo 发表于 2016-9-25 18:51
想想70000减去4464等于多少,有没有很熟悉?


一语惊醒梦中人,感谢feigoo和xinfa190。将 unsigned char NumFreq[7];修改为unsigned long就OK了。

虽然BCD码数组每一位的值都在0~9之间,但成员参与了运算,如NumFreq[4]*10000,造成了数据溢出。

虽然修改后没问题,但还不能确定是何原因。为什么NumFreq[5]*100000和NumFreq[6]*1000000这两项没有出错呢?

出0入0汤圆

发表于 2016-9-29 00:52:29 来自手机 | 显示全部楼层
cpld外接了sram么?

出200入2554汤圆

发表于 2016-9-29 23:04:35 | 显示全部楼层
255 / 65535 / 4294967295 玩的少,玩多了就记住这些雷了。
64bit 的雷实在背不出了,自己拿计算器按吧

应该说设计软件框架的时候就得想到了....

出0入0汤圆

 楼主| 发表于 2016-9-29 23:13:37 | 显示全部楼层
wx85105157 发表于 2016-9-29 00:52
cpld外接了sram么?

没有,直接用LE存的波形

出0入0汤圆

 楼主| 发表于 2016-9-29 23:14:36 | 显示全部楼层
t3486784401 发表于 2016-9-29 23:04
255 / 65535 / 4294967295 玩的少,玩多了就记住这些雷了。
64bit 的雷实在背不出了,自己拿计算器按吧

同样的程序,用32位的M3没问题,只是移植到8位的51上就错了。

出0入0汤圆

发表于 2016-10-1 18:41:09 | 显示全部楼层
wuq_cody 发表于 2016-9-29 23:13
没有,直接用LE存的波形

那你波形数据有多少位宽多少点哦?

出0入0汤圆

 楼主| 发表于 2016-10-1 23:08:40 来自手机 | 显示全部楼层
深度256,宽度8位
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 18:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表