打印
[STM32F1]

外部中断计数的程序问题

[复制链接]
2324|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gonghao199471|  楼主 | 2016-3-29 17:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的adxl345的传感器,我用程序实现z轴加速度大于3g计数一次,我的部分程序如下,不知道哪里有问题,请大神指点
/*******************************************************************************
*                             NVIC配置函数
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
   /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  //设置中断优先级
  
       /* 开启定时器2 */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line6) == SET)
{step++;
display_step();
EXTI_ClearITPendingBit(EXTI_Line6);
} //清除EXTI线路挂起位
}
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                  //配置浮空输入          
    GPIO_Init(GPIOA, &GPIO_InitStructure);
         ///*将EXTI线6连接到PB6*/
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);

    /* Configure Key Button EXTI Line to generate an interrupt on falling edge */  
    //配置按钮中断线触发方式
    EXTI_InitStructure.EXTI_Line = EXTI_Line6;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能
    EXTI_Init(&EXTI_InitStructure); //初始化中断
    /* Generate software interrupt: simulate a falling edge applied on Key Button EXTI line */
    EXTI_GenerateSWInterrupt(EXTI_Line6); //EXTI_Line6中断允许 到此中断配置完成,可以写中断处理函数       
沙发
gonghao199471|  楼主 | 2016-3-29 17:17 | 只看该作者
请大神指点下哪里出了问题

使用特权

评论回复
板凳
robotbros| | 2016-3-29 17:24 | 只看该作者
你遇到什么问题?

使用特权

评论回复
地板
gonghao199471|  楼主 | 2016-3-29 17:31 | 只看该作者
robotbros 发表于 2016-3-29 17:24
你遇到什么问题?

我现在硬件仿真在lcd上显示step时,不管怎样step都没变化

使用特权

评论回复
5
robotbros| | 2016-3-29 20:21 | 只看该作者
i/o口配置需要看你外部电路,例如检测低电平触发需要配置为上拉输入,看如何配置需要看器件规格书上i/o口内部框图,不能盲目随便配置。

使用特权

评论回复
6
gonghao199471|  楼主 | 2016-3-30 08:52 | 只看该作者
robotbros 发表于 2016-3-29 20:21
i/o口配置需要看你外部电路,例如检测低电平触发需要配置为上拉输入,看如何配置需要看器件规格书上i/o口内 ...

这个没有错的,我那个显示step的函数在中断处理函数里面,硬件时只显示1,在就不变了

使用特权

评论回复
7
gonghao199471|  楼主 | 2016-3-30 09:59 | 只看该作者
robotbros 发表于 2016-3-29 20:21
i/o口配置需要看你外部电路,例如检测低电平触发需要配置为上拉输入,看如何配置需要看器件规格书上i/o口内 ...

现在问题是触发不了中断是为什么??求大神指点啊

使用特权

评论回复
8
huangcunxiake| | 2016-3-30 14:14 | 只看该作者
做计步器吧,为何用中断呢,直接读取了数据,然后通过限幅滤波就行了。

使用特权

评论回复
9
gonghao199471|  楼主 | 2016-3-30 15:03 | 只看该作者
huangcunxiake 发表于 2016-3-30 14:14
做计步器吧,为何用中断呢,直接读取了数据,然后通过限幅滤波就行了。

恩恩,是计步器,如何限幅滤波啊、?用滤波器吗、?求大神指点

使用特权

评论回复
10
huangcunxiake| | 2016-3-30 15:08 | 只看该作者
gonghao199471 发表于 2016-3-30 15:03
恩恩,是计步器,如何限幅滤波啊、?用滤波器吗、?求大神指点

读取到的不是数字信号吗,你可以观察一下波动范围,大于多少时候记为1,小鱼多少的时候记为0,然后反正记录走路吗,只有两种状态,0和1,也就是走和不走

使用特权

评论回复
11
gonghao199471|  楼主 | 2016-3-30 15:10 | 只看该作者
huangcunxiake 发表于 2016-3-30 15:08
读取到的不是数字信号吗,你可以观察一下波动范围,大于多少时候记为1,小鱼多少的时候记为0,然后反正记 ...

这个还需要示波器吗?这样计步准吗??

使用特权

评论回复
12
huangcunxiake| | 2016-3-30 16:05 | 只看该作者
gonghao199471 发表于 2016-3-30 15:10
这个还需要示波器吗?这样计步准吗??

非常准的,都是这么做的,回头我给你找找那个帖子。有个人发了个帖子,前天看到的。

使用特权

评论回复
13
huangcunxiake| | 2016-3-30 16:06 | 只看该作者
https://bbs.21ic.com/icview-1444898-1-1.html

计步算法

  因为用户在运动中可能手平持设备或者将设备置于口袋中,所以设备的放置方向不定,为此我们通过计算三个加速度的矢量长度,获得一条步行运动的正弦曲线轨迹。

  第二步是峰值检测,我们记录了上次矢量长度和运动方向,通过矢量长度的变化,可以判断目前加速度的方向,并和上一次保存的加速度方向进行比较,如果是相反的,即是刚过峰值状态,则进入计步逻辑进行计步,否则舍弃。通过对峰值的次数累加可得到用户步行步伐。

  最后是去干扰,手持设备会有一些低幅度和快速的抽动状态,或是我们俗称的手抖,或者某个恶作剧用户想通过短时快速反复摇动设备来模拟人走路,这些干扰数据如果不剔除,会影响记步的准确值,对于这种干扰,我们可以通过给检测加上阈值和步频判断来过滤。


  人体最快的跑步频率为5HZ,也就是说相邻两步的时间间隔的至少大于0.2秒,如图所示,我们设置了timespan在记步过程中我们过滤了高频噪声,即步频过快的情况。同时我们通过和上次加速度大小进行比较,设置设立一定的阈值Threshold来判断运动是否属于有效,有效运动才可进行记步。




使用特权

评论回复
14
gonghao199471|  楼主 | 2016-3-30 16:18 | 只看该作者
huangcunxiake 发表于 2016-3-30 16:06
https://bbs.21ic.com/icview-1444898-1-1.html
计步算法  因为用户在运动中可能手平持设备或 ...

我明白了,谢谢分享哈,我用的那个adxl345外部中断和这个原理差不多,也是设置一个阈值,超过了就中断,可是有些问题,我再研究下,实在不行就不用中断了

使用特权

评论回复
15
gonghao199471|  楼主 | 2016-3-30 20:05 | 只看该作者
huangcunxiake 发表于 2016-3-30 16:06
https://bbs.21ic.com/icview-1444898-1-1.html
计步算法  因为用户在运动中可能手平持设备或 ...

唉,中断还是不行,有没有大神给我看看啊

使用特权

评论回复
16
huangcunxiake| | 2016-4-5 16:35 | 只看该作者
gonghao199471 发表于 2016-3-30 15:10
这个还需要示波器吗?这样计步准吗??

不是用示波器,是读取几个周期的数据,然后分析一下,定个阈值。

使用特权

评论回复
17
huangcunxiake| | 2016-4-5 16:37 | 只看该作者
gonghao199471 发表于 2016-3-30 16:18
我明白了,谢谢分享哈,我用的那个adxl345外部中断和这个原理差不多,也是设置一个阈值,超过了就中断, ...

对了,不是一个阈值,是两个阈值,可以这么说,YZH,YZL,这两个阈值,当高于YZH,时候记为1,当低于YZL记为0,且,YZH大于YZL.

使用特权

评论回复
18
gonghao199471|  楼主 | 2016-4-5 16:39 | 只看该作者
huangcunxiake 发表于 2016-4-5 16:35
不是用示波器,是读取几个周期的数据,然后分析一下,定个阈值。

可是现在的adxl345的中断还是不触发,这是为什么啊、、??快要疯了

使用特权

评论回复
19
huangcunxiake| | 2016-4-5 16:47 | 只看该作者
你可以先测试下ADXL345的中断引脚,有没有波形,再去看MCU的中断配置对不对。

使用特权

评论回复
20
huangcunxiake| | 2016-4-5 16:50 | 只看该作者
https://ezchina.analog.com/thread/8711
这个贴也是问这个的。实在不行,去ADI找他们工程师问啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

55

帖子

0

粉丝