2

我目前正在为学校项目开发 pid 调节器。由于电晕已经关闭了学校,我们无法获得任何硬件来测试它。所以我想在微处理器(PSoC5LP)上模拟 PID 调节器。所以我正在实现一个返回所选直流电机的阶跃响应的函数。

当我找到传递函数“(-3.47*exp(-6.36*s)+3.47))”的输出时,如果我在代码中手动定义“s”的值,我会得到正确的结果。但是当我在代码“未定义对“exp”的引用中将 s 设置为递增时。

问题似乎是我不能在循环中运行 exp 而增加它。在另一个项目中尝试过,唯一发生的事情是循环运行 10 次并打印出 exp() 以及循环运行的 nr 次(不起作用)

float step_respons(){
    double s = 0.1;
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f \r\n", (-3.47*exp(-6.36*s)+3.47));
        pc_uart_PutString(outpurBuffer);
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f \r\n", (-3.47*exp(-6.36*1)+3.47));
        pc_uart_PutString(outpurBuffer);
    //These works just fine

    pc_uart_PutString("Loop:\r\n");

    for(s = 0.1; s < 2; s++){
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f %f \r\n", s,(-3.47*exp(-6.36*s)+3.47));
        pc_uart_PutString(outpurBuffer);
        //this does not work (if "s" is changed with a number it works fine.)

    };

    return 0;
};

因此,如果我在循环中手动选择 S,它会起作用,但如果它增加它就会停止。我试图使用另一个变量并增加它,但它仍然不起作用

    for(s = 0.1; s < 2; s++){
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f %f \r\n", s,(-3.47*exp(-6.36*s)+3.47));
        pc_uart_PutString(outpurBuffer);

    };

不工作

    for(s = 0.1; s < 2; s++){
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f %f \r\n", s,(-3.47*exp(-6.36*1)+3.47));
        pc_uart_PutString(outpurBuffer);

    };

确实有效,但没有完成结果的增量如您所见,在循环中完成的唯一更改是“s”已被定义为一个值

double temp = 0.5;

    for(s = 0.1; s < 2; s++){
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f %f \r\n", s,(-3.47*exp(-6.36*temp)+3.47));
        pc_uart_PutString(outpurBuffer);    

    };

这行得通

double temp = 0.5;

for(s = 0.1; s < 2; s++){
        snprintf(outpurBuffer, sizeof(outpurBuffer), "%f %f \r\n", s,(-3.47*exp(-6.36*temp)+3.47));
        pc_uart_PutString(outpurBuffer);    
        temp += 0.5;
    };

不这是错误:Build error: undefined reference to 'exp'

编译器输出的日志

--------------- 构建开始:04/28/2020 01:34:42 项目:Plotterkode,配置:ARM GCC 5.4-2016-q2-update 调试 ------ --------- 代码生成步骤是最新的。编译步骤是最新的,不需要做任何工作。arm-none-eabi-ar.exe -rs .\CortexM3\ARM_GCC_541\Debug\Plotterkode.a .\CortexM3\ARM_GCC_541\Debug\cy_em_eeprom.o .\CortexM3\ARM_GCC_541\Debug\CyDmac.o .\CortexM3\ARM_GCC_541\ Debug\CyFlash.o .\CortexM3\ARM_GCC_541\Debug\CyLib.o .\CortexM3\ARM_GCC_541\Debug\cyPm.o .\CortexM3\ARM_GCC_541\Debug\CySpc.o .\CortexM3\ARM_GCC_541\Debug\cyutils.o . \CortexM3\ARM_GCC_541\Debug\pc_uart.o .\CortexM3\ARM_GCC_541\Debug\pc_uart_PM.o .\CortexM3\ARM_GCC_541\Debug\pc_uart_INT.o .\CortexM3\ARM_GCC_541\Debug\pc_uart_BOOT.o .\CortexM3\ARM_GCC_541\Debug \pc_uart_IntClock.o .\CortexM3\ARM_GCC_541\Debug\isr_pc_uart.o 。step_respons': C:\Users\Vikto\Desktop\plottercode\Plotterkode.cydsn/./plotter_position.h:125: undefined reference toexp' collect2.exe:错误:ld 返回 1 退出状态命令“arm-none-eabi-gcc.exe”失败,退出代码为“1”。--------------- 构建失败:04/28/2020 01:34:42 ---------------

4

1 回答 1

2

您可能没有链接包含 exp() 函数的库。

它适用于您将文字(或编译器可以推断的值)传递给它的情况,因为编译器正在计算该值并将其放入代码中。

https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

我相信 exp() 包含在“libm”中,因此添加-Wl,-lm(或者您在构建系统中指定 libm)应该可以修复它。

如果它已经存在,请尝试将其放在列表的末尾。

于 2020-04-28T02:50:16.137 回答