手机怎么调震动什么梗(告诉我手机是如何震动的)

今天一个机友突然问我一个问题:“手机那么薄,靠什么振动?”

诶,这个问题有点意思~

手机怎么调震动什么梗(告诉我手机是如何震动的)(1)

手机振动器

手机振动器由电动机和凸轮组成~

手机怎么调震动什么梗(告诉我手机是如何震动的)(2)

手机怎么调震动什么梗(告诉我手机是如何震动的)(3)

利用凸轮(偏心装置)在手机内旋转,从而产生的震动。

拆过发动机老铁会发现,凸轮有点类似发动机平衡块。都是产生振动,只不过发动机是抵消振动,而手机是产生振动~

手机怎么调震动什么梗(告诉我手机是如何震动的)(4)

随着手机越做越薄,手机振动器也是越做越小~

手机怎么调震动什么梗(告诉我手机是如何震动的)(5)

有的甚至做成纽扣形式~

手机怎么调震动什么梗(告诉我手机是如何震动的)(6)

手机怎么调震动什么梗(告诉我手机是如何震动的)(7)

无论做的再小,原理万变不理其中,老铁们,你们看明白了吗~

1 工作原理

2 手机马达使手机震动的原因

3 软件控制实现

4 模块介绍

5 模块init函数

6 如何控制vibrator

工作原理

马达外部为工程塑料制成的外壳,内部除了外盒外,还有一个微小的直流电动机,驱动偏心轮转动。此外还有一块很简单的集成电路,用以控制启动和停止电 动 机的运转。当手机设为“振动” 状态时,控制电路接通。马达轴上面有一个偏心轮,当马达转动的时候,偏心轮的圆心质点不在电机的转心上,使得马达处于不断的失去平衡状态,由于惯性作用引起震动。

手机马达使手机震动的原因

(1)由金属棒的偏心转动造成。

由于金属棒在所在的密封金属盒内高速转动, 通通过摩擦力引起金属盒的内部空气也做剧烈运动。 从而引起整个密封的金 属盒振动,进而带动整个手机产生振 动。有上述计算可知,金属棒做高速 转动的能量所占份额很大,故此原因为手机产生振动的主因。

(2)由重心不稳造成。

由于震动马达的转动轴上所连的金属棒并不是按几何对称的方式布置的,故震动马达的转动轴会沿质心所在的方向转过一个偏角。故造成金属棒实际上并不是在 水平面内转动的。在转动中,质心所在的位置会随金属棒位置改变而改变, 故金属棒转动平面也是与水平面呈一定的夹角不断变化的。 这种质心在一定的空间范围内不断变化的运动必将造成这个物体的位置移动。当变化较小且十分频繁时,即在宏观上表现为振动。

软件控制实现

控制原理:对马达输入端电压大小调整,控制马达振动强度(电压越高马达振动强度越大),电压为0则关闭马达振动,通过设置定时器的参数,来控制马达震动的持续时间。

模块介绍

采用spmi_driver_register总线模型实现模块的挂载

模块init函数

手机怎么调震动什么梗(告诉我手机是如何震动的)(8)

首先通过spmi_driver_register注册驱动,注册成功后进入qpnp_vibrator_probe函数,在这里面,首先通过spmi_get_resource获取vibrator base address,接着通过qpnp_vib_parse_dt(vib)获取DTS里面配置的驱动电压和最长震动时间的参数,接着通过qpnp_vibrator_config(vib)设置vibrator的寄存器参数,然后初始化工作队列、定时器、设置定时器的回调函数,再接着是设置获取震动剩余时间的回调函数,以及使能vibrator的回调函数,最后通过android的Timed Output驱动框架来为上层提供控制的接口。drivers/staging/android/目录timed_output.h中定义timed_output_dev结构体,其中包含enable和get_time这两个函数指针,实现结构体后,使用timed_output_dev_register()和timed_output_dev_unregister()函数注册和注销即可。Timed Output驱动程序框架将为每个设备在/sys/class/timed_output/目录中建立一个子目录,设备子目录中的enable文件就是设备的控制文件。读enable文件表示获得剩余时间,写这个文件表示根据时间振动。Timed Output驱动的设备调试,通过sys文件系统即可

如何控制vibrator

由上面的介绍知道,利用android的Timed Output驱动程序框架,在路劲/sys/class/timed_output/vibrator下,为上层提供了开启震动的接口enable,该接口需要接受振动时间作为参数,代码如下:

通过enable写入震动持续时间参数,然后调用驱动里面的qpnp_vib_enable,在这个函数里面,如果写入的参数是0,那么表示是关闭震动,如果写入的参数是大于0的,那么就设置定时器,然后调用工作队列,在工作队列里面调用qpnp_vib_set(vib, vib->state),去开启定时器,这样,我们的手机就可以震动了。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页