智能车制作

 找回密码
 注册

扫一扫,访问微社区

楼主: Malc
打印 上一主题 下一主题

我的平衡车设计--软件篇

    [复制链接]

8

主题

119

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6089
威望
2660
贡献
1737
兑换币
1625
注册时间
2011-7-22
在线时间
846 小时
61#
 楼主| 发表于 2014-3-23 11:47:54 | 只看该作者
wmslecz 发表于 2014-3-23 11:21
嘿嘿..学姐..这个是加速度计出来的波形...然会我测试是将车子来回走...加速度计有非常大的抖动.....红线是 ...

哦是加速的计的啊
我用的也是5阶,wp=3 ws=9首先对加速度计进行一次fir,再在直立控制中对error进行一次fir,直立效果很好,那点延迟完全没影响
回复 支持 反对

使用道具 举报

25

主题

166

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
威望
829
贡献
459
兑换币
461
注册时间
2012-11-1
在线时间
119 小时
62#
发表于 2014-3-23 12:22:03 | 只看该作者
我想问一下在keil里面,micros()、millis()这两个函数可以用吗
回复 支持 反对

使用道具 举报

8

主题

119

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6089
威望
2660
贡献
1737
兑换币
1625
注册时间
2011-7-22
在线时间
846 小时
63#
 楼主| 发表于 2014-3-23 12:31:30 | 只看该作者
光速小子 发表于 2014-3-23 12:22
我想问一下在keil里面,micros()、millis()这两个函数可以用吗

不能,因为这是我自己写的
其实很简单的,开个定时器不停地计时,然后再用两个unsigned long分别存储micros和millis就行了
回复 支持 反对

使用道具 举报

4

主题

796

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
10578

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

威望
5540
贡献
3174
兑换币
3043
注册时间
2013-9-30
在线时间
932 小时
64#
发表于 2014-3-23 14:41:25 | 只看该作者
Malc 发表于 2014-3-23 11:47
哦是加速的计的啊
我用的也是5阶,wp=3 ws=9首先对加速度计进行一次fir,再在直立控制中对error进行一次 ...

嗯嗯...要不是学姐..我也不知道什么是FIR..也不会去了解这个..希望以后再技术的道路能多多向你学习..能加QQ或者其他你常用的方式交流吗?我的腾讯企鹅是1044811851..谢谢学姐..
回复 支持 反对

使用道具 举报

8

主题

119

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6089
威望
2660
贡献
1737
兑换币
1625
注册时间
2011-7-22
在线时间
846 小时
65#
 楼主| 发表于 2014-3-23 18:40:02 | 只看该作者
wmslecz 发表于 2014-3-23 14:41
嗯嗯...要不是学姐..我也不知道什么是FIR..也不会去了解这个..希望以后再技术的道路能多多向你学习..能加 ...

不用谢~!在论坛交流就好啦
回复 支持 反对

使用道具 举报

4

主题

796

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
10578

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

威望
5540
贡献
3174
兑换币
3043
注册时间
2013-9-30
在线时间
932 小时
66#
发表于 2014-3-24 12:15:58 | 只看该作者
Malc 发表于 2014-3-23 18:40
不用谢~!在论坛交流就好啦

嗯嗯..好的..那就先谢谢学姐咯..O(∩_∩)O~~...
回复 支持 反对

使用道具 举报

25

主题

166

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
威望
829
贡献
459
兑换币
461
注册时间
2012-11-1
在线时间
119 小时
67#
发表于 2014-3-24 18:48:24 | 只看该作者
Malc 发表于 2014-3-23 12:31
不能,因为这是我自己写的
其实很简单的,开个定时器不停地计时,然后再用两个unsigned long分别存储mic ...

是否是在一段程序开始前开定时器,结束后关定时器然后看返回的值?

回复 支持 反对

使用道具 举报

1

主题

111

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2408
威望
1202
贡献
658
兑换币
700
注册时间
2013-11-20
在线时间
274 小时
68#
发表于 2014-3-24 20:40:01 | 只看该作者
前面几位大神讲的太深奥了,但感觉很受启发有木有
回复 支持 反对

使用道具 举报

8

主题

119

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6089
威望
2660
贡献
1737
兑换币
1625
注册时间
2011-7-22
在线时间
846 小时
69#
 楼主| 发表于 2014-3-25 09:28:49 | 只看该作者
光速小子 发表于 2014-3-24 18:48
是否是在一段程序开始前开定时器,结束后关定时器然后看返回的值?

没必要,我写的这个函数是从上电初始化后就开始不停的计时,只要time=micros()或time=millis()就能读到当前时间
然后,micros()-time就能计算出一段代码的运行时间,用来查看每个函数运行时间、计算时间都挺方便的

代码:
Time_Function
  1. #include"Time_Function.h"
  2. #include <hidef.h>      /* common defines and macros */
  3. #include "derivative.h"      /* derivative-specific definitions */


  4. void setbusclock_80M(void)
  5. {      
  6.   CLKSEL = 0X00;    //disengage PLL to system
  7.   PLLCTL_PLLON = 1;   //turn on PLL
  8.   SYNR = 0xc0 | 0x09;                        
  9.   REFDV = 0x80 | 0x01;
  10.   POSTDIV = 0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;
  11.   _asm(nop);          //BUS CLOCK=80M
  12.   _asm(nop);
  13.   while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
  14.   CLKSEL_PLLSEL = 1;          //engage PLL to system;
  15. }

  16. void Dly_ms(unsigned int ms)
  17. {
  18.    unsigned int i,j;
  19.    if (ms<1) ms=1;
  20.    for(i=1;i<=ms;i++)
  21.    for(j=0;j<1000;j++) {
  22.     _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  23.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  24.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  25.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  26.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  27.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  28.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  29.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);  
  30.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  31.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  32.       
  33.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  34.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  35.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  36.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  37.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  38.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);  
  39.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  40.    }
  41.    
  42. }

  43. void Dly_us(unsigned int us)
  44. {
  45.    unsigned int ii;   
  46.    for(ii=0;ii<us;ii++)
  47.    {
  48.       
  49. #ifdef BUSCLOCK32M
  50.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  51.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  52.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  53.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  54.       
  55.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  56.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  57.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  58.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);  
  59. #endif

  60. #ifdef BUSCLOCK64M
  61.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  62.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  63.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  64.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  65.       
  66.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  67.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  68.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  69.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  70.       
  71.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  72.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  73.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  74.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  75.       
  76.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  77.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  78.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  79.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);  
  80. #endif

  81. #ifdef BUSCLOCK80M
  82.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  83.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  84.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  85.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  86.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  87.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  88.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  89.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);  
  90.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  91.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  92.       
  93.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  94.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  95.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  96.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  97.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  98.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);  
  99.       _asm(nop);_asm(nop);_asm(nop);_asm(nop);
  100.       //_asm(nop);_asm(nop);_asm(nop);_asm(nop);     
  101. #endif
  102.       
  103.    }
  104. } //end of Dly_us()



  105. void Dly_25ns(unsigned int ns)
  106. {
  107.    unsigned int ii;   
  108.    for(ii=0;ii<ns;ii++)
  109.    {
  110. #ifdef BUSCLOCK80M
  111.   
  112.       _asm(nop);
  113.       //_asm(nop);_asm(nop);_asm(nop);_asm(nop);     
  114. #endif
  115.       
  116.    }
  117. } //end of Dly_us()



  118.   
  119.   


  120. /*   for micros(),millis()
  121. void PIT_Init(void) {
  122.   PITCFLMT_PITE=0; //定时中断通道0 关
  123.   PITCE_PCE0=1;//定时器通道0 使能
  124.   PITMTLD0=80-1;//8 位定时器初值设定。80 分频,在80MHzBusClock 下,为1MHz。即1us.
  125.   PITLD0=50000-1;//16 位定时器初值设定。50ms溢出
  126.   PITINTE_PINTE0=1;//定时器中断通道0 中断使能
  127.   PITCFLMT_PITE=1;//定时器通道0 使能
  128. }
  129. */

  130. void PIT_Init(void) {
  131.   PITCFLMT_PITE=0; //定时中断通道0 关
  132.   PITCE_PCE0=1;//定时器通道0 使能
  133.   PITMTLD0=80-1;//8 位定时器初值设定。80 分频,在80MHzBusClock 下,为1MHz。即1us.
  134.   PITLD0=54321-1;//16 位定时器初值设定。50ms溢出
  135.   PITINTE_PINTE0=1;//定时器中断通道0 中断使能
  136.   PITCFLMT_PITE=1;//定时器通道0 使能
  137.   
  138.   PITLD1=5000-1;//16 位定时器初值设定。2ms溢出
  139.   PITCE_PCE1=1;//定时器通道1 使能
  140.   PITINTE_PINTE1=0; //定时器中断通道1 中断
  141. }

  142. /*
  143. void setTimer0(unsigned long)//定时中断初始化函数50MS 定时中断设置
  144. {
  145.   
  146. }
  147. */

  148. unsigned long micros() {
  149. return time_us+(54321-PITCNT0);
  150. }

  151. unsigned long millis() {
  152. unsigned long mm=micros();
  153. if(mm>500)
  154. return (54321-PITCNT0)/1000+time_ms+1;
  155. return (54321-PITCNT0)/1000+time_ms;

  156. }


  157.      
  158. #pragma CODE_SEG __NEAR_SEG NON_BANKED

  159. void interrupt 66 PIT0(void)
  160. {

  161.     PITTF_PTF0 = 1; //clear interrupts flag
  162.     time_ms_mod+=321;
  163.     if(time_ms_mod>=1000){
  164.      time_ms_mod-=1000;
  165.      time_ms+=1;
  166.     }
  167.     time_ms+=54;
  168.     time_us+=54321;
  169.       
  170. }

  171. #pragma CODE_SEG DEFAULT      

复制代码



Time_Function.h:
  1. #ifndef Time_Function_h
  2. #define Time_Function_h

  3. #define BUSCLOCK80M


  4. #define EnableControlPIT PITINTE_PINTE1=1; //定时器中断通道1 中断使能
  5. #define DisableControlPIT PITINTE_PINTE1=0; //定时器中断通道1 中断使能

  6. #define EnableTimerPIT PITINTE_PINTE0=1; //定时器中断通道1 中断使能
  7. #define DisableTimerPIT PITINTE_PINTE0=0; //定时器中断通道1 中断使能

  8. static unsigned long time_ms=0;
  9. static unsigned long time_ms_mod=0;
  10. static unsigned long time_us=0;

  11. void setbusclock_80M(void);
  12. void Dly_us(unsigned int);
  13. void Dly_ms(unsigned int);
  14. void PIT_Init(void);
  15. unsigned long micros(void);
  16. unsigned long millis(void);

  17. static unsigned signa=0;

  18. #endif
复制代码


回复 支持 反对

使用道具 举报

25

主题

166

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
威望
829
贡献
459
兑换币
461
注册时间
2012-11-1
在线时间
119 小时
70#
发表于 2014-3-25 10:30:06 | 只看该作者
Malc 发表于 2013-8-1 19:36
速度控制周期5x8ms,再均匀输出,速度控制加不加fir感觉都差不多吧滤波用的是汉明窗、矩形窗,过段时间我整 ...

5*8ms是这个样子吗?40ms采集一次然后速度分8次融合到直立控制中(5ms控制一次)是吗。恳求lz的回复。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-27 08:22 , Processed in 0.067151 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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