单片机y=0.09*x-45的数据处理

2020-01-22 12:14发布

本帖最后由 shafei 于 2012-3-29 19:50 编辑

我用单片机处理数据遇到一个不大不小的问题,
有一个公式y=0.09*x-45 其中x是unsigned char型,x的取值范围为[500,2500]我有几个问题
一:这里的y定义成什么类型比较好,float型吗?
二:算出y后,我希望对它四舍五入后,返回一个unsigned char型的数据
我的意思是说:算出y后,四舍五入以后,再让y变成unsigned char型
我举一个例子,假如我算出来y为178.3,我想让它四舍五入后变成178,然后返回unsigned char型的178,如果我算出来的是178.8,我想让他四舍五入后变成179,然后返回unsigned char型的179
大家可以帮帮我吗?我用在舵机角度控制上面
刚才有人提醒因为X是从500到2500,所以X不是uchar,应该定义成uint
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
75条回答
y574924080
1楼-- · 2020-01-25 15:07
eduhf_123 发表于 2012-3-30 15:23
见我在20楼的回复。

谢谢您了

我去复习Excel了

惭愧,这些都学过,

不会学以致用~~

shafei
2楼-- · 2020-01-25 20:16
eduhf_123 发表于 2012-3-30 15:56
值得一提的是,8楼这种处理四舍五入的办法效率太低了。
当我们需要对一个除法运算的商进行四舍五入时,只 ...

您这句话对我处理四舍五入提供了一个好方法,学习了!
晚辈看了一半帖子的时候,写的处理方法是这样的:
void display(uint x)
{
        uint y,tmp_0,tmp_1,tmp_2,tmp_3;
        y=9*x-4500;
        tmp_0=y/10000;
        tmp_1=(y%10000)/1000;
        tmp_2=((y%10000)%1000)/100;
        tmp_3=((y%10000)%1000)%100;
        if(tmp_3>=5)
                tmp_2+=1;//以上是我本来的数据处理程序
        P2=0x07;
        P0=table[tmp_2];
        Delay5MS(2);
        P2=0x06;
        P0=table[tmp_1];
        Delay5MS(2);
        P2=0x05;
        P0=table[tmp_0];
        Delay5MS(2);
        P2=0x03;
        P0=table[servo_num+1];
        Delay5MS(2);
        P2=0x01;
        P0=table[flag];
        Delay5MS(2);

}
现在尝试改成您说的那样:
void display(unsigned short int x)
{
unsigned char y;
y= (9*x-4450) /100//我这个地方没有错误了吧?
tmp_0=y/100;
tmp_1=(y%100)/10;
tmp_2=(y%100)%10;//后面省略了
}
这个程序里面只是把误差控制在您说的[0,2],没有四舍五入。
如果按您对六楼的优化:y= INT( (x*23-11392)/256 )
这里面就加入了四舍五入了对吧,误差控制在[-1,0]之间了,同时x最好从501算起


lyjian
3楼-- · 2020-01-26 00:29
学习了,以前都不会用Excel啊
zhiwei
4楼-- · 2020-01-26 01:40
 精彩回答 2  元偷偷看……
shafei
5楼-- · 2020-01-26 05:23
zhiwei 发表于 2012-3-30 18:47
精度要求高的话把0.09转换成16bit数据 y=( (U16)(0.09*65536)*x >> 16 )- 45;

晚辈不才,
第一个问题:您公式里面的(U16)是什么意思啊?(本人是C语言菜鸟级)直接像您说的这样直接把这个公式敲进去吗?
第二个问题:您这个公式里面的Y定义成什么数据类型?
第三个问题:您给出的这个公式,单片机运行起来,速度怎么样啊?
请高手指点!
vermon
6楼-- · 2020-01-26 08:53
移位是一个好方法,算出来的结果在移位,这种应该不受编译器限制

一周热门 更多>