智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4056|回复: 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又不能仿真这个芯片,还请大家帮忙分析一下。

9

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
475
威望
298
贡献
97
兑换币
0
注册时间
2012-2-7
在线时间
40 小时
毕业学校
安徽工业大学
2#
发表于 2012-4-22 11:04:33 | 只看该作者
这个芯片我倒是有,就是我看不太懂官方给的debug.c中的发送数据的子程序,搞得我现在有芯片有程序就是看不到数据,蛋疼
回复 支持 反对

使用道具 举报

6

主题

264

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1608
威望
959
贡献
341
兑换币
43
注册时间
2010-12-10
在线时间
154 小时
3#
 楼主| 发表于 2012-4-22 11:17:06 | 只看该作者
还得有配套上位机吧?
回复 支持 反对

使用道具 举报

6

主题

264

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1608
威望
959
贡献
341
兑换币
43
注册时间
2010-12-10
在线时间
154 小时
4#
 楼主| 发表于 2012-4-22 11:24:01 | 只看该作者
noob光环 发表于 2012-4-22 11:04
这个芯片我倒是有,就是我看不太懂官方给的debug.c中的发送数据的子程序,搞得我现在有芯片有程序就是看不到 ...

还得有配套上位机吧
回复 支持 反对

使用道具 举报

6

主题

264

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1608
威望
959
贡献
341
兑换币
43
注册时间
2010-12-10
在线时间
154 小时
5#
 楼主| 发表于 2012-4-22 12:49:03 | 只看该作者
别沉呀,我刚才用我的程序仿真了一下,发现这里好像确实有问题。
吉他手老师快来看看啊,难道这里有什么我没注意到的东西?
回复 支持 反对

使用道具 举报

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那儿也是。
回复 支持 反对

使用道具 举报

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对于理解程序更好。虽然不会对控制有关系。
回复 支持 反对

使用道具 举报

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,效果应该是一样的吧。

回复 支持 反对

使用道具 举报

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编译的时候会怎么做呢?

回复 支持 反对

使用道具 举报

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编译器均会将其合并成一个常数计算。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 07:26 , Processed in 0.051379 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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