OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4475|回复: 16

平衡小车的代码,control.c里的中断函数5ms是怎么来的呢?请大神们细细道来

[复制链接]

3

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-10-15
在线时间
13 小时
发表于 2017-10-17 19:51:58 | 显示全部楼层 |阅读模式
10金钱

1.png

MiniBalanceV5.0【轻装版】平衡小车源码(精简入门版).zip

10.24 MB, 下载次数: 4016

最佳答案

查看完整内容[请看2#楼]

你把函数好好看看,因为这个函数在初始化函数里面,返回0才是正常的情况,如果只是探究返回值为0的时候(为什么中断频率为5ms),程序就变的很简单,程序中最后一行代码里面的函中有对应的频率,可以该函数下调用的函数 mpu_set_lpf(st.chip_cfg.sample_rate >> 1);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2017-1-3
在线时间
19 小时
发表于 2017-10-17 19:51:59 | 显示全部楼层
lylivestudy 发表于 2017-10-18 17:16
看到了,算法在int mpu_set_sample_rate(unsigned short rate)
表示看不懂啊,呜呜~(>_

你把函数好好看看,因为这个函数在初始化函数里面,返回0才是正常的情况,如果只是探究返回值为0的时候(为什么中断频率为5ms),程序就变的很简单,程序中最后一行代码里面的函中有对应的频率,可以该函数下调用的函数 mpu_set_lpf(st.chip_cfg.sample_rate >> 1);
回复

使用道具 举报

3

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1450
金钱
1450
注册时间
2016-9-22
在线时间
31 小时
发表于 2017-10-17 20:21:09 | 显示全部楼层
这程序,不难吧。
MPU6050很长时间之前玩的了。有些也忘了
该说的都在程序里注释好了


[mw_shl_code=c,true]这里的注释说的很明白。
这是一个外部中断处理函数(PA12,初始化在exti.c中)
【我认为的,其实是MUPU6050已经设置好了,每隔5ms他的INT引脚会变低,而MPU6050的INT引脚应该接在了STM32的PA12上,
当他5ms拉低时,stm32就会产生外部中断,就会运行下面的程序】
/**************************************************************************
函数功能:所有的控制代码都在这里面
         5ms定时中断由MPU6050的INT引脚触发
         严格保证采样和数据处理的时间同步                                 
**************************************************************************/
int EXTI15_10_IRQHandler(void)
{   
        //当MPU6050每隔5ms  INT拉低,就会进入外部中断,这里对INT再次看他是不是0
          if(INT==0)               
         {   
                  EXTI->PR=1<<12;   
                        //通过Flag_Target的值的变化,来控制下面的if的执行。
                //假设Flag_Target为1,当5ms INT为低时,运行这段代码Flag_Target为0,那么之后的if语句中的也就不执行。
                //当5ms INT再次为低时,运行这段代码Flag_Target为1,执行if语句中的
                //所以if语句中的是10ms运行一次
                   Flag_Target=!Flag_Target;
                  if(Flag_Target==1)                                                  
                        {
                                 Get_Angle(Way_Angle);                                             
                           return 0;         
                          }   
                                //这下面的语句每次进入中断,都会执行,所以是5ms执行一次
                        Encoder_Left=Read_Encoder(2);                                    
                        Encoder_Right=Read_Encoder(4);                                    
                  Get_Angle(Way_Angle);                                             
                  Led_Flash(100);                                                                                                   
                         Balance_Pwm =balance(Angle_Balance,Gyro_Balance);                 
                  Velocity_Pwm=velocity(Encoder_Left,Encoder_Right);                 
                   Moto1=Balance_Pwm-Velocity_Pwm-Turn_Pwm;                        
                   Moto2=Balance_Pwm-Velocity_Pwm+Turn_Pwm;                          
                   Xianfu_Pwm();                                                     
                         Set_Pwm(Moto1,Moto2);                                             
        }               
         return 0;         
} [/mw_shl_code]
回复

使用道具 举报

3

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1450
金钱
1450
注册时间
2016-9-22
在线时间
31 小时
发表于 2017-10-17 20:28:44 | 显示全部楼层
我也是新手。有些地方可能解释的不对
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-10-15
在线时间
13 小时
 楼主| 发表于 2017-10-17 22:06:54 来自手机 | 显示全部楼层
zhouxufeng1996 发表于 2017-10-17 20:28
我也是新手。有些地方可能解释的不对

亲,我的问题是“5ms是怎么来的”,也就是你说的5ms拉低,但是怎么拉低呢?在哪里实现?
回复

使用道具 举报

3

主题

32

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1450
金钱
1450
注册时间
2016-9-22
在线时间
31 小时
发表于 2017-10-17 22:19:50 | 显示全部楼层
lylivestudy 发表于 2017-10-17 22:06
亲,我的问题是“5ms是怎么来的”,也就是你说的5ms拉低,但是怎么拉低呢?在哪里实现?

仔细看我说的
,MPU6050可以设置。
MPU6050模块 的 MPU_INT是中断输出引脚

所以MPU6050模块的INT管脚设置成了5ms拉低一次
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-10-15
在线时间
13 小时
 楼主| 发表于 2017-10-17 22:27:57 来自手机 | 显示全部楼层
怎么设置?我想设置成8ms中断怎么设置?
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-10-15
在线时间
13 小时
 楼主| 发表于 2017-10-17 22:29:40 来自手机 | 显示全部楼层
zhouxufeng1996 发表于 2017-10-17 22:19
仔细看我说的
,MPU6050可以设置。
MPU6050模块 的 MPU_INT是中断输出引脚

mpu6050怎么设置中断时间?我不懂设置,求大神指教
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2017-6-18
在线时间
29 小时
发表于 2017-10-18 09:38:32 | 显示全部楼层
你可以不用INT中断改成定时器中断  把control.c里面的中断改成定时器中断  然后修改定时器预分频就好了
我最近也做了平衡小车  有问题可以一起讨论哦
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-10-15
在线时间
13 小时
 楼主| 发表于 2017-10-18 10:08:44 来自手机 | 显示全部楼层
393758485 发表于 2017-10-18 09:38
你可以不用INT中断改成定时器中断  把control.c里面的中断改成定时器中断  然后修改定时器预分频就好了
我 ...

我想弄明白mpu6050自带的定时中断
回复

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2017-1-3
在线时间
19 小时
发表于 2017-10-18 10:24:43 | 显示全部楼层
在你6050配置文件中或者在6050数据手册里面
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-10-15
在线时间
13 小时
 楼主| 发表于 2017-10-18 10:39:03 来自手机 | 显示全部楼层
嘴角上扬 发表于 2017-10-18 10:24
在你6050配置文件中或者在6050数据手册里面

我找不到
回复

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2017-1-3
在线时间
19 小时
发表于 2017-10-18 11:33:43 | 显示全部楼层
我也没有找到关于5s的定义,不过按照你的程序来说是DMP的方式触发的中断,可以看看DMP的函数
回复

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2017-1-3
在线时间
19 小时
发表于 2017-10-18 12:38:49 | 显示全部楼层
找到了,在MPU6050.C中有#define DEFAULT_MPU_HZ  (200) 这一变量,这个变量DMP_init中用到了,调用了inv_mpu中的函数,里面有计算公式,自己再看看吧
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-10-15
在线时间
13 小时
 楼主| 发表于 2017-10-18 17:16:39 来自手机 | 显示全部楼层
嘴角上扬 发表于 2017-10-18 12:38
找到了,在MPU6050.C中有#define DEFAULT_MPU_HZ  (200) 这一变量,这个变量DMP_init中用到了,调用了inv_m ...

看到了,算法在int mpu_set_sample_rate(unsigned short rate)
表示看不懂啊,呜呜~(>_<)~


回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-10-15
在线时间
13 小时
 楼主| 发表于 2017-10-19 09:42:20 | 显示全部楼层
谢谢你的帮助
回复

使用道具 举报

9

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2018-6-30
在线时间
42 小时
发表于 2018-9-11 08:35:33 | 显示全部楼层
393758485 发表于 2017-10-18 09:38
你可以不用INT中断改成定时器中断  把control.c里面的中断改成定时器中断  然后修改定时器预分频就好了
我 ...


你好,可以分享下你的代码?我也是在做平衡小车人,最近老是调不出来,可以联系QQ:2024315152,非常感谢!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 14:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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