智能车制作

标题: 问个参考方案程序上的问题 [打印本页]

作者: zl6977    时间: 2012-4-22 11:01
标题: 问个参考方案程序上的问题
以下代码来自官网参考方案“SMMNew1.mcp”
中断里
void TI1_OnInterrupt(void){       
      g_nSpeedControlPeriod ++;
          SpeedControlOutput();

      else if(g_n1MSEventCount == 3) {          // Car speed adjust                  g_nSpeedControlCount ++;                  if(g_nSpeedControlCount >= SPEED_CONTROL_COUNT) {                          SpeedControl();                          g_nSpeedControlCount = 0;                          g_nSpeedControlPeriod = 0;                                            }}

void SpeedControlOutput(void) {        float fValue;        fValue = g_fSpeedControlOutNew - g_fSpeedControlOutOld;        g_fSpeedControlOut = fValue * (g_nSpeedControlPeriod + 1) / SPEED_CONTROL_PERIOD +     g_fSpeedControlOutOld;}
我感觉“g_nSpeedControlPeriod + 1”这个地方不该“+1”啊。SPEED_CONTROL_PERIOD 是100 , 每次进SpeedControlOutput();函数前都会执行 g_nSpeedControlPeriod ++; 所以执行到SpeedControlOutput();时g_nSpeedControlPeriod 的 取值是1~100。再“+1”就不对了吧?再“+1”会造成g_fSpeedControlOut 比设定值g_fSpeedControlOutNew 多出0.01*fValue 。
不知想错了没有,我这里没这个芯片,CW又不能仿真这个芯片,还请大家帮忙分析一下。


作者: noob光环    时间: 2012-4-22 11:04
这个芯片我倒是有,就是我看不太懂官方给的debug.c中的发送数据的子程序,搞得我现在有芯片有程序就是看不到数据,蛋疼
作者: zl6977    时间: 2012-4-22 11:17
还得有配套上位机吧?
作者: zl6977    时间: 2012-4-22 11:24
noob光环 发表于 2012-4-22 11:04
这个芯片我倒是有,就是我看不太懂官方给的debug.c中的发送数据的子程序,搞得我现在有芯片有程序就是看不到 ...

还得有配套上位机吧

作者: zl6977    时间: 2012-4-22 12:49
别沉呀,我刚才用我的程序仿真了一下,发现这里好像确实有问题。
吉他手老师快来看看啊,难道这里有什么我没注意到的东西?
作者: wuqt    时间: 2012-4-22 15:06
本帖最后由 wuqt 于 2012-4-22 15:07 编辑

楼主很细心啊,应该是多加了一次。把它俩调个顺序就可以了。
DirectionControl那儿也是。

作者: 吉他手    时间: 2012-4-22 15:38
我也看了相关的代码,应该是多加了一次。
在中端函数中将g_nSpeedControlPeriod ++ 与SpeedControlOutput()调换一下便可。
从本质上讲,这个误差相当于将原来的速度闭环控制参数放大了(1.01)倍,这个误差会在后期参数调整的时候消除掉。所以不会对控制产生影响。

不过代码还是应该写的比较符合逻辑为好。所以去掉这个+1对于理解程序更好。虽然不会对控制有关系。

作者: zl6977    时间: 2012-4-22 16:13
wuqt 发表于 2012-4-22 15:06
楼主很细心啊,应该是多加了一次。把它俩调个顺序就可以了。
DirectionControl那儿也是。

我把Speed_Adjust_Output();和
Direction_Adjust_Output(); 里面的“+1”都去掉了,然后原来的PI除以1.01,效果应该是一样的吧。


作者: zl6977    时间: 2012-4-22 16:21
吉他手 发表于 2012-4-22 15:38
我也看了相关的代码,应该是多加了一次。
在中端函数中将g_nSpeedControlPeriod ++ 与SpeedControlOutput( ...

我把Speed_Adjust_Output();和
Direction_Adjust_Output(); 里面的“+1”都去掉了,然后原来的P,I除以1.01,效果应该是一样的吧。

还有一个问题要请教您,比如程序里面写 A*100/10/2,编译的时候会自动变成A*5么?还是原封不动的下载进去,执行的时候先*100再/10再/2?跟编译器有关?CodeWorrior编译的时候会怎么做呢?


作者: 吉他手    时间: 2012-4-22 16:32
zl6977 发表于 2012-4-22 16:21
我把Speed_Adjust_Output();和
Direction_Adjust_Output(); 里面的“+1”都去掉了,然后原来的P,I除以1 ...

可以去掉+1,也可以视而不见。

对于后面的 多个常数计算一般的C编译器均会将其合并成一个常数计算。

作者: zl6977    时间: 2012-4-22 16:41
吉他手 发表于 2012-4-22 16:32
可以去掉+1,也可以视而不见。

对于后面的 多个常数计算一般的C编译器均会将其合并成一个常数计算。

好,谢谢。
又想了一下,去掉“+1”逻辑上不对,当g_nSpeedControlPeriod =100时算出来g_fSpeedControlOut 后,紧接着就该执行else if(g_n1MSEventCount == 3)而不是else if(g_n1MSEventCount == 2),可是电机输出的函数是在else if(g_n1MSEventCount == 2)里面的,这个值算然算出来了,但是没被输出出去


所以符合逻辑的应该是“g_nSpeedControlPeriod ++ 与SpeedControlOutput()调换一下”。


是吧?

作者: zl6977    时间: 2012-4-22 16:54
吉他手 发表于 2012-4-22 16:32
可以去掉+1,也可以视而不见。

对于后面的 多个常数计算一般的C编译器均会将其合并成一个常数计算。

好像也不对。。“g_nSpeedControlPeriod ++ 与SpeedControlOutput()调换一下”最终算出来的值还是没被输出出去,而且从效果上说,这才是0.99倍的调控量。

有点乱,还是视而不见吧,虽然g_fSpeedControlOut 会有一个逻辑上不应该出现的值,但是这个值对实际效果没有影响,好像并不是1.01倍。

我主要是想模仿您那个平滑输出的函数写一个逐步提高速度的起跑函数,结果发现速度设定值总是多出一个“步长”,看来这个地方不该“+1”,您那两个函数确实该“+1”。


作者: HKD_WCS    时间: 2012-12-4 01:13

作者: gongfukanggongf    时间: 2015-3-22 13:55
:lol:lol:lol:lol:lol:lol:lol:lol




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2