軟硬件全開(kāi)源,航芯方案分享 | 智能電動(dòng)牙刷方案
當代口腔問(wèn)題頻發(fā),讓人們越來(lái)越重視口腔衛生。傳統的刷牙方式,由于個(gè)人習慣和刷牙方式的不同,會(huì )不同程度地導致牙齦受損,牙菌斑去除不徹底等問(wèn)題。而電動(dòng)牙刷設備,基于其相對程序化的刷牙方式,可根據個(gè)人口腔特性支持自主選擇,調節刷牙力度。而且在刷牙過(guò)程中,不需要過(guò)多的手部動(dòng)作,僅需要調節刷牙的角度,更多的清潔工作交付由牙刷本身的特性來(lái)完成。方便人們的同時(shí)也更能有效的減少口腔問(wèn)題。
電動(dòng)牙刷類(lèi)型
現在市面上電動(dòng)牙刷品類(lèi)繁多,從刷頭的方式可將其分為兩大類(lèi)型:旋轉式和振動(dòng)式(也叫聲波式)。參考https://zhuanlan.zhihu.com/p/42097327
圖1. 電動(dòng)牙刷工作方式對比圖
旋轉式電動(dòng)牙刷是由電機帶動(dòng)刷頭旋轉,牙面清潔度高,但牙縫清潔能力薄弱且相較于振動(dòng)式,更易損傷牙釉質(zhì)。而振動(dòng)式,由電機帶動(dòng)刷頭進(jìn)行上下的高頻振動(dòng),高頻擺動(dòng)的刷頭能高效完成洗刷牙齒的動(dòng)作,可以讓牙膏與水的混合物產(chǎn)生大量微小的氣泡,氣泡爆裂時(shí)產(chǎn)生的壓力可以更深入牙縫達到深度的清潔效果。
振動(dòng)式的實(shí)現有兩種方式,一種由偏心振動(dòng)電機實(shí)現,多用于中低檔的電動(dòng)牙刷方案。該種方式的電動(dòng)牙刷振動(dòng)感強,振動(dòng)無(wú)序。另一種則是采用線(xiàn)性電機,業(yè)內也稱(chēng)之為磁懸浮電機。
圖2. 磁懸浮電機示意圖
磁懸浮電機的優(yōu)點(diǎn)在于其在工作運行噪聲小,機身振感低,振動(dòng)能量集中,清潔效果佳。因此,本文采用ACM32F030作為主控芯片,基于磁懸浮電機提出一款電動(dòng)牙刷的設計方案。
設計方案
本文描述的電動(dòng)牙刷方案,是基于上海航芯ACM32F030系列的MCU進(jìn)行設計,整體的方案框圖如下所示:
圖3. 基于A(yíng)CM32F030/070電動(dòng)牙刷設計方案框圖
ACM32F0X0 系列是一款支持多種低功耗模式的通用MCU。集成12位1.6 Msps高精度ADC以及比較器、運放、觸控按鍵控制器、段式LCD控制器,內置高性能定時(shí)器、多路UART、LPUART、SPI、I2C等豐富的通訊外設,內建AES、TRNG等信息安全模塊,支持多種低功耗模式,具有高整合度、高抗干擾、高可靠性的特點(diǎn)。本產(chǎn)品采用ARM Cortex-M0系列內核,最高工作頻率64MHz。足以滿(mǎn)足一般的電動(dòng)牙刷方案的需求。
掃碼即可立即購買(mǎi)ACM32F070KBU7
備注:ACM32F030和070軟硬件兼容
掃碼即可立即購買(mǎi)開(kāi)發(fā)板
軟硬件下載鏈接如下:
https://gitee.com/acm32-mcu/electric-toothbrush
https://github.com/ACM32-MCU/electric-toothbrush
? 人機交互系統
本文論述的設計方案中的人機交互功能是采用簡(jiǎn)單的LED和按鍵的方式進(jìn)行實(shí)現。共有1個(gè)按鍵和6個(gè)LED。按鍵需實(shí)現設備的開(kāi)關(guān)機以及模式切換功能。設備會(huì )根據按鍵按下時(shí)間的長(cháng)短來(lái)判定當前的動(dòng)作是需要切換模式或是開(kāi)關(guān)機操作。6個(gè)LED中有3個(gè)用于工作模式指示,最大可支持7種工作模式(23-1),本設計方案中僅提供了三種模式。另外3個(gè)LED用于系統狀態(tài)指示,包括正常,欠壓,充電,充滿(mǎn)4種電壓狀態(tài)。
長(cháng)短按識別程序:
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); } }
系統指示程序:
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); } } }
? 電源及功耗管理
電動(dòng)牙刷產(chǎn)品的續航能力也是一直備受人們關(guān)注。本設計方案在低功耗的處理,摒棄了一般的休眠方式,直接采用關(guān)閉電源來(lái)避免設備在不工作狀態(tài)下的設備功耗。整個(gè)設備的供電線(xiàn)路共有三種,如下圖所示。
圖4. 基于A(yíng)CM32F030的電動(dòng)牙刷供電電路(部分)
正常情況下,設備不在充電時(shí),VCHARG電壓為0,需要關(guān)機時(shí),按鍵彈開(kāi),PWR_KEY為低電平,芯片內部程序也將PWR_LOCK拉低,此時(shí)Q2關(guān)斷,Q2的D極電壓同VBAT,從而引起Q1斷開(kāi),VCCIN斷電,系統關(guān)機。而開(kāi)機時(shí),按鍵按下,PWR_KEY先被拉至高電平,Q2導通,Q2的D極拉低,則Q1導通,設備供電,程序檢測到開(kāi)機,拉高PWR_LOCK,此時(shí),盡管按鍵彈開(kāi),PWR_LOCK仍然會(huì )提供Q2的導通電壓,系統正常工作。充電時(shí),Q2的導通電壓會(huì )由VCHARG提供,系統保持在工作狀態(tài),此時(shí)會(huì )程序會(huì )檢測系統的運行狀態(tài),在不需要啟動(dòng)時(shí),進(jìn)入休眠狀態(tài)。
電源管理部分,則通過(guò)鋰電池充電芯片檢測是否進(jìn)行充電,同時(shí)通過(guò)一路ADC監測電池電壓。為減少芯片工作負擔,電池電壓的欠壓和滿(mǎn)電通過(guò)ADC門(mén)限電壓功能來(lái)實(shí)現。ADC的門(mén)限電壓初始化程序如下:
// 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 ;
? 智能管理系統
智能管理系統分為兩個(gè)部分,一部分為上位機的數據處理,由云端處理,另一部分是電動(dòng)牙刷數據記錄和傳輸。整個(gè)的實(shí)現過(guò)程可簡(jiǎn)述為,電動(dòng)牙刷通過(guò)慣性測量?jì)xQMI8658C記錄電動(dòng)牙刷在使用過(guò)程中的運動(dòng)軌跡,并實(shí)時(shí)將該部分數據以及整個(gè)系統的工作參數通過(guò)BLE發(fā)送到手機,手機連接云端,并將數據傳輸至云平臺進(jìn)行數據解析,分析用戶(hù)刷牙的健康指數,并將相關(guān)建議反饋至手機。電動(dòng)牙刷作為數據采集設備,需上報實(shí)時(shí)數據,結構如下:
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為三軸的角度。定時(shí)上傳電動(dòng)牙刷的相關(guān)實(shí)時(shí)數據。上位機根據一系列點(diǎn)位數據進(jìn)行建模計算可得到整個(gè)牙刷的運動(dòng)軌跡。
? 電機驅動(dòng)系統
電動(dòng)牙刷的驅動(dòng)系統是通過(guò)H橋芯片MX612E進(jìn)行處理,MX612E的輸入端連接芯片的PWM互補輸出端口。如下圖所示:
圖5. 電動(dòng)牙刷電機驅動(dòng)電路
本設計中的電動(dòng)牙刷采用磁懸浮電機,內部構造和直流無(wú)刷電機相似,但相比于直流無(wú)刷電機,其僅有兩相輸入端。這也就造成該電機在通電后,正負極不變的情況下,電機旋轉至某一角度形成平衡后將會(huì )停止旋轉。切換正負極后則又會(huì )在另一個(gè)方向旋轉形成平衡。在電動(dòng)牙刷的正常工作中,是通過(guò)兩相的正負極切換來(lái)使電機正反旋轉從而帶動(dòng)刷頭做高頻運動(dòng)的。因此,其電機速度的控制依靠于輸出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%,使得在一個(gè)PWM周期內,電機可完成一次往返運動(dòng)。
本文提出的設計方案的主旨是將電動(dòng)牙刷智能化,在提高人們刷牙效率的同時(shí),也能達到進(jìn)一步保證人們刷牙質(zhì)量的目的。通過(guò)電動(dòng)牙刷對慣性的數據采集,實(shí)時(shí)上傳至云端,并對數據進(jìn)行處理,恢復用戶(hù)的刷牙軌跡,給出合理建議,糾正用戶(hù)不良的刷牙習慣。磁懸浮電機的高頻振動(dòng)也能有效清除口腔污漬。歲月恒久遠,牙齒永相隨 ^-^。
上海航芯·原廠(chǎng)直連:marketing@aisinochip.com