今天一個機友突然問我一個問題:“手機那麼薄,靠什麼振動?”
诶,這個問題有點意思~
手機振動器
手機振動器由電動機和凸輪組成~
利用凸輪(偏心裝置)在手機内旋轉,從而産生的震動。
拆過發動機老鐵會發現,凸輪有點類似發動機平衡塊。都是産生振動,隻不過發動機是抵消振動,而手機是産生振動~
随着手機越做越薄,手機振動器也是越做越小~
有的甚至做成紐扣形式~
無論做的再小,原理萬變不理其中,老鐵們,你們看明白了嗎~
1 工作原理
2 手機馬達使手機震動的原因
3 軟件控制實現
4 模塊介紹
5 模塊init函數
6 如何控制vibrator
工作原理
馬達外部為工程塑料制成的外殼,内部除了外盒外,還有一個微小的直流電動機,驅動偏心輪轉動。此外還有一塊很簡單的集成電路,用以控制啟動和停止電 動 機的運轉。當手機設為“振動” 狀态時,控制電路接通。馬達軸上面有一個偏心輪,當馬達轉動的時候,偏心輪的圓心質點不在電機的轉心上,使得馬達處于不斷的失去平衡狀态,由于慣性作用引起震動。
手機馬達使手機震動的原因
(1)由金屬棒的偏心轉動造成。
由于金屬棒在所在的密封金屬盒内高速轉動, 通通過摩擦力引起金屬盒的内部空氣也做劇烈運動。 從而引起整個密封的金 屬盒振動,進而帶動整個手機産生振 動。有上述計算可知,金屬棒做高速 轉動的能量所占份額很大,故此原因為手機産生振動的主因。
(2)由重心不穩造成。
由于震動馬達的轉動軸上所連的金屬棒并不是按幾何對稱的方式布置的,故震動馬達的轉動軸會沿質心所在的方向轉過一個偏角。故造成金屬棒實際上并不是在 水平面内轉動的。在轉動中,質心所在的位置會随金屬棒位置改變而改變, 故金屬棒轉動平面也是與水平面呈一定的夾角不斷變化的。 這種質心在一定的空間範圍内不斷變化的運動必将造成這個物體的位置移動。當變化較小且十分頻繁時,即在宏觀上表現為振動。
軟件控制實現
控制原理:對馬達輸入端電壓大小調整,控制馬達振動強度(電壓越高馬達振動強度越大),電壓為0則關閉馬達振動,通過設置定時器的參數,來控制馬達震動的持續時間。
模塊介紹
采用spmi_driver_register總線模型實現模塊的挂載
模塊init函數
首先通過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),去開啟定時器,這樣,我們的手機就可以震動了。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!