求一个C语言的算法,最近脑袋不够用了。

2020-01-25 15:33发布

本帖最后由 hck2llj 于 2013-11-22 16:17 编辑

如题,大概是这样的:
1、定义一个目标值           unsigned long target_value;
2、还有一个逐次逼近的值  unsigned long current_value;
===============================================
我希望的效果是,
当目标值target_value确定以后,
逐次逼近的值current_value从最大值FFFF_FFFFH以3ms的时间间隔逐次逼近target_value(即current_value的值3ms改变一次)。
一开始current_value的变化可以大点,但是随着它的值越来越靠近target_value,它的变化也越来越小。
而且current_value的值最终会与target_value相等。

多谢大家的关注,诚心求指导。

10楼更新了我找到的一个工程师写的代码,但是不同的编译环境执行的结果大相径庭啊,大家帮忙出个主意吧
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
hck2llj
1楼-- · 2020-01-26 14:06
关于以后 发表于 2013-11-22 15:30
current_value = current_value  + (target_value - current_value)* 0x300L ;
去掉强制转换。就是一个p ...

仔细想了一下,看来有动力去重新看一下PID了,写谢过大家
lcw_swust
2楼-- · 2020-01-26 14:45
本帖最后由 lcw_swust 于 2013-11-24 11:55 编辑

给楼主一个温控例子:
(注意这里面全是有符号数)
void pid(void)
{
static S16 err1,err2;
S16 err0,add;
err0=Ts-Tr;//设定值减实际值
add=Pid_p*(err0-err1)+Pid_i*err0+Pid_d*((err0-err1)-(err1-err2));//计算输出的增量
Iout=Iout+add;//改变加热器的输出电流
err2=err1;
err1=err0;//保存本次误差
}
当Pid_p=Pid_d=0,Pid_i=0x300L,与楼主的程序有相似之处,但是楼主的程序中缺了输出量
hck2llj
3楼-- · 2020-01-26 15:16
谢谢大家的建议,我会好好去思考的。
补上一个消息,刚才我在不同的编译环境下尝试了以下代码,结果让我很惊讶。
==================================================
unsigned long LVelocity ;
unsigned int Capcs = 23603 ;
unsigned long Capcs32 = 0xFFFFFFFF ;

int main( void )
{
    while(1)
    {
         if (Capcs > 500)
        {
            Capcs32 = Capcs32 - (unsigned int)(*((unsigned int *)&Capcs32)) * 0x200L + Capcs * 0x200L;
        }
        if (*((unsigned int *)&Capcs32) >= 0xFFFF)
        {
            LVelocity = 0x00;
        }
        else  
        {
            LVelocity = (unsigned long)(0xB40397 / *((unsigned int *)&Capcs32));
        }
    }
}
===============================================
LVelocity 为我想要的速度结果。
Capcs 为脉冲采样值。
Capcs32 为逐次逼近采样值的中间变量。
在飞思卡尔的CodeWarrior和keil中,我得到了想要的结果,多次计算后,LVelocity 结果为499.
但是在瑞萨的CubeSuite+和IAR FOR AVR中,LVelocity 的结果一直在不断地变化,毫无规律。
hck2llj
4楼-- · 2020-01-26 15:41
大家如果有时间又很感兴趣的话,可以去尝试一下。
带我的工程师说可能是因为设置的堆栈空间不够,具体他也没时间分析。
我比较小白,求指导。
coleyao
5楼-- · 2020-01-26 15:46
 精彩回答 2  元偷偷看……
lans0625
6楼-- · 2020-01-26 16:56
二分搜索吧。。。。。。。。。

一周热门 更多>