打印

PICC乘法讨论

[复制链接]
2793|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
phoenix110|  楼主 | 2008-6-24 11:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一个子程序,编译可以通过,实际计算错误,请大家帮忙看看什么问题?是12位A/D,所以是0x800。错误在这句话上:voltage = data*5000;但是我定义的是长整型,是四个字节,应该不会溢出,但实际每次单步执行到这里就错。我怀疑是PICC的编译器的问题,我用的芯片是PIC18F4523,但是,如果是编译器的问题,我还必须需要他,我该怎么办呢?
uint AdOperate( uint data )
{
    unsigned long    voltage;
    uint    current;
    if ( data > 0x800 )            //* 传感器2.5V输出为0,大于2.5V为正,小于2.5V为负;    2exp12=4096,2.5V对应0x800 */
    {                
        sign = 1;
        data = data - 0x800;
    }
    else
    {
        sign = 0;
        data = 0x800 - data;
    }
    voltage = data*5000;            /* convert mv voltage */
    voltage =voltage/4095;
    current = voltage/4;                /* convert output current */
    return current;
}
沙发
xieyuanbin| | 2008-6-24 11:57 | 只看该作者

你用12位AD?

0X800是什么概念?
8位的一半是0X80,10位的一半是0X200,0X80012位AD?程序有没有输入一个数字仿真过?
voltage =voltage/4095应为4096

使用特权

评论回复
板凳
yewuyi| | 2008-6-24 12:00 | 只看该作者

current = voltage/4;                /* convert output current */

使用特权

评论回复
地板
yewuyi| | 2008-6-24 12:27 | 只看该作者

current = voltage/4;

这个计算本来就有点问题,

unsigned long    voltage;
    uint    current;

使用特权

评论回复
5
phoenix110|  楼主 | 2008-6-24 13:27 | 只看该作者

回复4楼

有问题吗?应该是一个强制转换,在语言书写是不规范,给理解造成歧意。
应该是(uint)current = voltage/4;谢谢指教;
但错误是这句:voltage = data*5000; 

使用特权

评论回复
6
zalin| | 2008-6-24 14:48 | 只看该作者

voltage = (unsigned long)data*5000;

使用特权

评论回复
7
dream2010| | 2008-6-24 15:03 | 只看该作者

稍微修改下

错误是这句:voltage = data*5000; 

使用特权

评论回复
8
phoenix110|  楼主 | 2008-6-24 16:01 | 只看该作者

没有明白7楼什么意思?

使用特权

评论回复
9
phoenix110|  楼主 | 2008-6-24 16:10 | 只看该作者

回复六楼zalin

zalin说的是正确的,验证通过。但是为什么,我开头定义了是unsigned long类型啊,为什么到时候还需要强制再定义,大家讨论一下?

使用特权

评论回复
10
tdh03z| | 2008-6-24 20:00 | 只看该作者

data是uint啊,C51也是这样

使用特权

评论回复
11
su_mj000| | 2008-6-26 04:09 | 只看该作者

应使用带符号格式

int AdOperate( uint data )
{
    long    voltage;
    int    current;
    if ( data >= 0x800 )            //* 传感器2.5V输出为0,大于2.5V为正,小于2.5V为负;    2exp12=4096,2.5V对应0x800 */
    {                
        sign = 1;
        data = data - 0x800;
    }
    else
    {
        sign = 0;
        data = 0x800 - data;
    }
    voltage = ((long)data)*5000;        /* convert mv voltage */
    voltage =voltage/4095;
    current = voltage/4;                /* convert output current */
    return current;
}

大多数DAC的数据输出是原码格式。用无符号格式会造成数据错误。
所以要使用强制转化:voltage = ((long)data)*5000;


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

1

粉丝