cdfldf1984的个人空间 https://blog.eetop.cn/33590 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

MTK 轨迹球(JOG_BALL)(转)

已有 2113 次阅读| 2010-8-24 14:49

1.轨迹球(JOG_BALL)
1.1.JOG_BALL原理

如下图所示,轨迹球里面有4个霍尔传感器+4个小的径向充磁的小磁铁。当从上到下推球或者从左到右推动球时,如果球接触到齿条,并带动齿条旋转一个小角度,此时齿条上的磁环也跟着旋转同样的角度,此时磁铁会转动另一个极性(南极北极的切换或者北极南极的切换),这样磁通量会发生变化,由磁信号转化的一个电脉冲信号将被释放出,电平变化会触发相应的霍尔元件对应的中断,上层会根据报上的中断来执行上下左右等操作。

 


1.2  JOG_BALL代码流程和细节

 如下图示是霍尔对应的PCB和原理图

从上面可以看到每个JOG_BALL有四个霍尔,而且初始化时候是上拉的,否则不能工作。

1.2.1初始化函数在keymain.c中Kbd_Init()函数:

Void Kbd_Init(void)

………

    // power on

    GPIO_ModeSetup(gpio_jog_ball_enable_pin, 0);

    GPIO_InitIO(1, gpio_jog_ball_enable_pin);

    GPIO_WriteIO(0, gpio_jog_ball_enable_pin);

 

    // set jog ball eint

    if (JOG_BALL_EINT1_NO < EINT_CHANNEL_NOT_EXIST)

    {

        GPIO_ModeSetup(JOG_BALL_EINT1_NO+41, 1);

        EINT_Registration(JOG_BALL_EINT1_NO, KAL_FALSE, JOG_BALL_EINT_1_Polarity, JOG_BALL_EINT_1_HISR, KAL_TRUE);

}

{……}

…………

在初始化函数中使能开启JOG_BALL 2.8V电压,给中断管脚赋了初值并注册了四个中断。

 

1.2.2响应中断的函数void JOG_BALL_EINT_1_HISR(void)

void JOG_BALL_EINT_2HISR(void)

void JOG_BALL_EINT_3HISR(void)

void JOG_BALL_EINT_4HISR(void)

以void JOG_BALL_EINT_1_HISR(void)

………

    if (JOG_BALL_EINT_1_Polarity == 1)

    {

        if (JOG_BALL_EINT_1_tick == JOG_BALL_EINT_tick_launch)

………

                kbd_push_onekey_to_kbdbuffer(kbd_onekey_press,DEVICE_KEY_UP);

                kbd_push_onekey_to_kbdbuffer(kbd_onekey_release,DEVICE_KEY_UP);

                 #ifndef L4_NOT_PRESENT

                    DRV_BuildPrimitive(Kp_ilm,

                                       MOD_DRVKBD,

                                       MOD_UEM,

                                       MSG_ID_DRVUEM_KEYPAD_IND,

                                       NULL);

 

                    msg_send_ext_queue(Kp_ilm);

                 #endif   /*L4_NOT_PRESENT*/

 }

 

 

    JOG_BALL_EINT_1_Polarity = !JOG_BALL_EINT_1_Polarity;

                                         EINT_Set_Polarity(JOG_BALL_EINT1_NO, JOG_BALL_EINT_1_Polarity);

函数为例,在中断响应函数中设置了JOG_BALL_EINT_1_tick中断响应计数器,当达到门限JOG_BALL_EINT_tick_launch才会确实发出消息给上层执行操作,这样是为了消抖,避免误操作和干扰。在函数结尾将触发电平又恢复成低电平。

1.2.3上层接受消息处理函数:在函数mmi_task()中,根据上面中断函数中kbd_push_onekey_to_kbdbuffer(kbd_onekey_press,DEVICE_KEY_UP);

                kbd_push_onekey_to_kbdbuffer(kbd_onekey_release,DEVICE_KEY_UP);

压栈的按键和事件类型依次遍历处理。

小贴士:

电平触发,就是只有高电平(或者低电平)的时候才能触发的动作,
边沿触发,就是有高电平向低电平转换,或者翻过来转换,这个转换过程触发一个动作。

上升沿,就是低电平向高电平转换的瞬间(过程),比如

 

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiangyu912/archive/2010/08/12/5805976.aspx


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 1

    好友
  • 2

    获赞
  • 16

    评论
  • 691

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-23 01:04 , Processed in 0.024777 second(s), 13 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部