智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4055|回复: 13
打印 上一主题 下一主题

[咨询] 问个参考方案程序上的问题

[复制链接]

6

主题

264

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1608
威望
959
贡献
341
兑换币
43
注册时间
2010-12-10
在线时间
154 小时
跳转到指定楼层
1#
发表于 2012-4-22 11:01:07 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
以下代码来自官网参考方案“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又不能仿真这个芯片,还请大家帮忙分析一下。

14

主题

77

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1580
威望
768
贡献
484
兑换币
491
注册时间
2014-9-13
在线时间
164 小时
14#
发表于 2015-3-22 13:55:45 | 只看该作者
:lol:lol:lol:lol:lol:lol:lol:lol
回复 支持 反对

使用道具 举报

5

主题

93

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2842
威望
1087
贡献
599
兑换币
264
注册时间
2012-3-31
在线时间
578 小时
13#
发表于 2012-12-4 01:13:30 | 只看该作者
回复 支持 反对

使用道具 举报

6

主题

264

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1608
威望
959
贡献
341
兑换币
43
注册时间
2010-12-10
在线时间
154 小时
12#
 楼主| 发表于 2012-4-22 16:54:28 | 只看该作者
吉他手 发表于 2012-4-22 16:32
可以去掉+1,也可以视而不见。

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

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

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

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

回复 支持 反对

使用道具 举报

6

主题

264

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1608
威望
959
贡献
341
兑换币
43
注册时间
2010-12-10
在线时间
154 小时
11#
 楼主| 发表于 2012-4-22 16:41:48 | 只看该作者
吉他手 发表于 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()调换一下”。


是吧?
回复 支持 反对

使用道具 举报

2

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2811

论坛骨干奖章优秀会员奖章技术大牛奖章

威望
1705
贡献
606
兑换币
245
注册时间
2011-3-28
在线时间
250 小时
10#
发表于 2012-4-22 16:32:03 | 只看该作者
zl6977 发表于 2012-4-22 16:21
我把Speed_Adjust_Output();和
Direction_Adjust_Output(); 里面的“+1”都去掉了,然后原来的P,I除以1 ...

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

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

使用道具 举报

6

主题

264

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1608
威望
959
贡献
341
兑换币
43
注册时间
2010-12-10
在线时间
154 小时
9#
 楼主| 发表于 2012-4-22 16:21:01 | 只看该作者
吉他手 发表于 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编译的时候会怎么做呢?

回复 支持 反对

使用道具 举报

6

主题

264

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1608
威望
959
贡献
341
兑换币
43
注册时间
2010-12-10
在线时间
154 小时
8#
 楼主| 发表于 2012-4-22 16:13:53 | 只看该作者
wuqt 发表于 2012-4-22 15:06
楼主很细心啊,应该是多加了一次。把它俩调个顺序就可以了。
DirectionControl那儿也是。

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

回复 支持 反对

使用道具 举报

2

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2811

论坛骨干奖章优秀会员奖章技术大牛奖章

威望
1705
贡献
606
兑换币
245
注册时间
2011-3-28
在线时间
250 小时
7#
发表于 2012-4-22 15:38:00 | 只看该作者
我也看了相关的代码,应该是多加了一次。
在中端函数中将g_nSpeedControlPeriod ++ 与SpeedControlOutput()调换一下便可。
从本质上讲,这个误差相当于将原来的速度闭环控制参数放大了(1.01)倍,这个误差会在后期参数调整的时候消除掉。所以不会对控制产生影响。

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

使用道具 举报

4

主题

117

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2100
威望
1066
贡献
440
兑换币
107
注册时间
2011-11-28
在线时间
297 小时
6#
发表于 2012-4-22 15:06:07 | 只看该作者
本帖最后由 wuqt 于 2012-4-22 15:07 编辑

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-25 05:30 , Processed in 0.047516 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表