軟硬件全開源,航芯方案分享 | 智能電動牙刷方案
當(dāng)代口腔問題頻發(fā),,讓人們越來越重視口腔衛(wèi)生,。傳統(tǒng)的刷牙方式,由于個人習(xí)慣和刷牙方式的不同,,會不同程度地導(dǎo)致牙齦受損,,牙菌斑去除不徹底等問題。而電動牙刷設(shè)備,,基于其相對程序化的刷牙方式,,可根據(jù)個人口腔特性支持自主選擇,調(diào)節(jié)刷牙力度,。而且在刷牙過程中,,不需要過多的手部動作,,僅需要調(diào)節(jié)刷牙的角度,更多的清潔工作交付由牙刷本身的特性來完成,。方便人們的同時也更能有效的減少口腔問題,。
電動牙刷類型
現(xiàn)在市面上電動牙刷品類繁多,從刷頭的方式可將其分為兩大類型:旋轉(zhuǎn)式和振動式(也叫聲波式),。參考https://zhuanlan.zhihu.com/p/42097327
圖1. 電動牙刷工作方式對比圖
旋轉(zhuǎn)式電動牙刷是由電機帶動刷頭旋轉(zhuǎn),,牙面清潔度高,但牙縫清潔能力薄弱且相較于振動式,,更易損傷牙釉質(zhì),。而振動式,由電機帶動刷頭進行上下的高頻振動,,高頻擺動的刷頭能高效完成洗刷牙齒的動作,,可以讓牙膏與水的混合物產(chǎn)生大量微小的氣泡,氣泡爆裂時產(chǎn)生的壓力可以更深入牙縫達到深度的清潔效果,。
振動式的實現(xiàn)有兩種方式,,一種由偏心振動電機實現(xiàn),多用于中低檔的電動牙刷方案,。該種方式的電動牙刷振動感強,,振動無序。另一種則是采用線性電機,,業(yè)內(nèi)也稱之為磁懸浮電機。
圖2. 磁懸浮電機示意圖
磁懸浮電機的優(yōu)點在于其在工作運行噪聲小,,機身振感低,,振動能量集中,清潔效果佳,。因此,,本文采用ACM32F030作為主控芯片,基于磁懸浮電機提出一款電動牙刷的設(shè)計方案,。
設(shè)計方案
本文描述的電動牙刷方案,,是基于上海航芯ACM32F030系列的MCU進行設(shè)計,整體的方案框圖如下所示:
圖3. 基于ACM32F030/070電動牙刷設(shè)計方案框圖
ACM32F0X0 系列是一款支持多種低功耗模式的通用MCU,。集成12位1.6 Msps高精度ADC以及比較器,、運放、觸控按鍵控制器,、段式LCD控制器,,內(nèi)置高性能定時器、多路UART,、LPUART,、SPI,、I2C等豐富的通訊外設(shè),內(nèi)建AES,、TRNG等信息安全模塊,,支持多種低功耗模式,具有高整合度,、高抗干擾,、高可靠性的特點。本產(chǎn)品采用ARM Cortex-M0系列內(nèi)核,,最高工作頻率64MHz,。足以滿足一般的電動牙刷方案的需求。
掃碼即可立即購買ACM32F070KBU7
備注:ACM32F030和070軟硬件兼容
掃碼即可立即購買開發(fā)板
軟硬件下載鏈接如下:
https://gitee.com/acm32-mcu/electric-toothbrush
https://github.com/ACM32-MCU/electric-toothbrush
? 人機交互系統(tǒng)
本文論述的設(shè)計方案中的人機交互功能是采用簡單的LED和按鍵的方式進行實現(xiàn),。共有1個按鍵和6個LED,。按鍵需實現(xiàn)設(shè)備的開關(guān)機以及模式切換功能。設(shè)備會根據(jù)按鍵按下時間的長短來判定當(dāng)前的動作是需要切換模式或是開關(guān)機操作,。6個LED中有3個用于工作模式指示,最大可支持7種工作模式(23-1),,本設(shè)計方案中僅提供了三種模式,。另外3個LED用于系統(tǒng)狀態(tài)指示,包括正常,,欠壓,,充電,充滿4種電壓狀態(tài),。
長短按識別程序:
void keyPressHandler(void) { key.isPressed = Key_GetPressValue(); switch(key.pressState) { case 0: if(key.isPressed) { key.pressTime = 0; key.pressState = 1; } break; case 1: /* eliminate jitter */ if(key.isPressed) { if(++key.pressTime > 10) key.pressState = 2; } else key.pressState = 0; break; case 2: /* whether long press is existed */ if(key.isPressed) { if(++key.pressTime > LONG_PRESS_TIME) key.pressState = 3; } else { if(key.shortPressHandler != NULL) key.shortPressHandler(); else DEBUG_KEY("have no short press handler!!\r\n"); key.pressState = 0; } break; case 3: if(key.longPressHandler != NULL) key.longPressHandler(); else DEBUG_KEY("have no long press handler!!\r\n"); key.pressState = 4; break; case 4: /* wait for releasing key */ if(key.isPressed == 0) key.pressState = 0; break; } }
工作指示程序:
void appMotorModeLedControl(void) { static uint8_t state = 0xFF; if(sys.status == SYSTEM_RUNMODE) { if(state != sys.motorStatus) { state = sys.motorStatus; if(sys.motorStatus == 0) { ModeLed_Select(MODE_LED_1, MODE_LED_ON); } else if(sys.motorStatus == 1) { ModeLed_Select(MODE_LED_2, MODE_LED_ON); } else if(sys.motorStatus == 2) { ModeLed_Select(MODE_LED_3, MODE_LED_ON); } } } else { state = 0xFF; ModeLed_Select(MODE_LED_UNKNOWN, MODE_LED_OFF); } }
系統(tǒng)指示程序:
void appSysLedController(void) { static uint8_t led_state = 0xFF; if(led_state != led.state) { led_state = led.state; if(led.state == LED_OFF) { led.duty = 0; PowerLed_Select(PWR_LED_UNKNOWN, PWR_LED_OFF); PWM_dutySet(PWM_LED, led.duty); } else if(led.state == LED_TWINKLE) // low power warning { led.duty = 0; PowerLed_Select(PWR_LED_R, PWR_LED_ON); PWM_dutySet(PWM_LED, led.duty); } else if(led.state == LED_ON) { led.duty = 0; PowerLed_Select(PWR_LED_R, PWR_LED_OFF); PWM_dutySet(PWM_LED, led.duty); } else if(led.state == LED_BREATHE) { if(led.duty == PWM_DUTY_MAX) led.dir = LED_FADE; else led.dir = LED_BRIGHTER; } else led.state = LED_OFF; } else{ if(led.state == LED_BREATHE) { PowerLed_Select(PWR_LED_UNKNOWN, PWR_LED_OFF); if(led.dir == LED_BRIGHTER) { if(led.duty < PWM_DUTY_MAX) led.duty += BREATHE_INTERVAL; else { if(++led.cnt > BREATHE_HOLD_TIME) { led.dir = LED_FADE; led.cnt = 0; } } } else { if(led.duty > BREATHE_INTERVAL) led.duty -= BREATHE_INTERVAL; else { led.duty = 0; if(++led.cnt > BREATHE_HOLD_TIME) { led.dir = LED_BRIGHTER; led.cnt = 0; } } } PWM_dutySet(PWM_LED, led.duty); } } }
? 電源及功耗管理
電動牙刷產(chǎn)品的續(xù)航能力也是一直備受人們關(guān)注,。本設(shè)計方案在低功耗的處理,摒棄了一般的休眠方式,,直接采用關(guān)閉電源來避免設(shè)備在不工作狀態(tài)下的設(shè)備功耗,。整個設(shè)備的供電線路共有三種,如下圖所示,。
圖4. 基于ACM32F030的電動牙刷供電電路(部分)
正常情況下,,設(shè)備不在充電時,VCHARG電壓為0,,需要關(guān)機時,,按鍵彈開,PWR_KEY為低電平,,芯片內(nèi)部程序也將PWR_LOCK拉低,,此時Q2關(guān)斷,Q2的D極電壓同VBAT,,從而引起Q1斷開,,VCCIN斷電,,系統(tǒng)關(guān)機。而開機時,,按鍵按下,,PWR_KEY先被拉至高電平,Q2導(dǎo)通,,Q2的D極拉低,,則Q1導(dǎo)通,設(shè)備供電,,程序檢測到開機,,拉高PWR_LOCK,此時,,盡管按鍵彈開,,PWR_LOCK仍然會提供Q2的導(dǎo)通電壓,系統(tǒng)正常工作,。充電時,,Q2的導(dǎo)通電壓會由VCHARG提供,系統(tǒng)保持在工作狀態(tài),,此時會程序會檢測系統(tǒng)的運行狀態(tài),,在不需要啟動時,進入休眠狀態(tài),。
電源管理部分,,則通過鋰電池充電芯片檢測是否進行充電,同時通過一路ADC監(jiān)測電池電壓,。為減少芯片工作負(fù)擔(dān),,電池電壓的欠壓和滿電通過ADC門限電壓功能來實現(xiàn)。ADC的門限電壓初始化程序如下:
// ADC Watchdog config ADC_WDT_Handle.ITMode = ENABLE; ADC_WDT_Handle.WatchdogMode = ADC_ANALOGWATCHDOG_RCH_ALL; ADC_WDT_Handle.Channel = channel; ADC_WDT_Handle.HighThreshold = (HIGH_POWER_THS * 0x0FFF) / VREF ; ADC_WDT_Handle.LowThreshold = (LOW_POWER_THS * 0x0FFF) / VREF ;
? 智能管理系統(tǒng)
智能管理系統(tǒng)分為兩個部分,,一部分為上位機的數(shù)據(jù)處理,,由云端處理,另一部分是電動牙刷數(shù)據(jù)記錄和傳輸,。整個的實現(xiàn)過程可簡述為,,電動牙刷通過慣性測量儀QMI8658C記錄電動牙刷在使用過程中的運動軌跡,并實時將該部分?jǐn)?shù)據(jù)以及整個系統(tǒng)的工作參數(shù)通過BLE發(fā)送到手機,,手機連接云端,,并將數(shù)據(jù)傳輸至云平臺進行數(shù)據(jù)解析,分析用戶刷牙的健康指數(shù),,并將相關(guān)建議反饋至手機,。電動牙刷作為數(shù)據(jù)采集設(shè)備,需上報實時數(shù)據(jù),,結(jié)構(gòu)如下:
typedef __packed struct{ uint32_t time; // This shows the relative time of each activity uint16_t location[3]; // This shows the acceleration of brush when using uint16_t pressure; // This is the force between tooth and brush uint16_t angle[3]; // This shows the angle between brush }BLE_RealTimeDataDef; // This define the data structure about brushing tooth in real time
其中,,location為三軸的加速度,,angle為三軸的角度。定時上傳電動牙刷的相關(guān)實時數(shù)據(jù),。上位機根據(jù)一系列點位數(shù)據(jù)進行建模計算可得到整個牙刷的運動軌跡,。
? 電機驅(qū)動系統(tǒng)
電動牙刷的驅(qū)動系統(tǒng)是通過H橋芯片MX612E進行處理,MX612E的輸入端連接芯片的PWM互補輸出端口,。如下圖所示:
圖5. 電動牙刷電機驅(qū)動電路
本設(shè)計中的電動牙刷采用磁懸浮電機,,內(nèi)部構(gòu)造和直流無刷電機相似,但相比于直流無刷電機,,其僅有兩相輸入端,。這也就造成該電機在通電后,正負(fù)極不變的情況下,,電機旋轉(zhuǎn)至某一角度形成平衡后將會停止旋轉(zhuǎn),。切換正負(fù)極后則又會在另一個方向旋轉(zhuǎn)形成平衡。在電動牙刷的正常工作中,,是通過兩相的正負(fù)極切換來使電機正反旋轉(zhuǎn)從而帶動刷頭做高頻運動的,。因此,其電機速度的控制依靠于輸出PWM的輸出頻率而非占空比,??刂拼a如下:
void PWM_freqSet(uint8_t PWMx, uint16_t freq) { uint32_t arr; if(IS_PWM_INSTANCE(PWMx) == 0) return; if(freq == 0) { TIM15->ARR = 0; return; } if(freq > PWM_FREQ_MAX) freq = PWM_FREQ_MAX; if(freq < PWM_FREQ_MIN) freq = PWM_FREQ_MIN; arr = (PWM_TIMER_FRE / freq); if(PWMx == PWM_MOTOR) { TIM15->ARR = arr-1; TIM15->CCR1 = arr / 2; } }
上例中,PWM的占空比為50%,,使得在一個PWM周期內(nèi),電機可完成一次往返運動,。
本文提出的設(shè)計方案的主旨是將電動牙刷智能化,,在提高人們刷牙效率的同時,也能達到進一步保證人們刷牙質(zhì)量的目的,。通過電動牙刷對慣性的數(shù)據(jù)采集,,實時上傳至云端,并對數(shù)據(jù)進行處理,,恢復(fù)用戶的刷牙軌跡,,給出合理建議,糾正用戶不良的刷牙習(xí)慣,。磁懸浮電機的高頻振動也能有效清除口腔污漬,。歲月恒久遠,牙齒永相隨 ^-^,。
上海航芯 · 原廠直連:[email protected]