1. <ins id="1y00c"></ins>

  2. <menuitem id="1y00c"><acronym id="1y00c"></acronym></menuitem>
      <ins id="1y00c"><video id="1y00c"><var id="1y00c"></var></video></ins>
    1. <ins id="1y00c"><option id="1y00c"></option></ins>
      <tr id="1y00c"></tr>
        當前位置 : 首頁 > 應用方案 > MCU應用及方案 > 智能電動牙刷方案

        軟硬件全開源,航芯方案分享 | 智能電動牙刷方案


        當代口腔問題頻發,讓人們越來越重視口腔衛生。傳統的刷牙方式,由于個人習慣和刷牙方式的不同,會不同程度地導致牙齦受損,牙菌斑去除不徹底等問題。而電動牙刷設備,基于其相對程序化的刷牙方式,可根據個人口腔特性支持自主選擇,調節刷牙力度。而且在刷牙過程中,不需要過多的手部動作,僅需要調節刷牙的角度,更多的清潔工作交付由牙刷本身的特性來完成。方便人們的同時也更能有效的減少口腔問題。


        電動牙刷類型


        現在市面上電動牙刷品類繁多,從刷頭的方式可將其分為兩大類型:旋轉式和振動式(也叫聲波式)。參考https://zhuanlan.zhihu.com/p/42097327



        圖1. 電動牙刷工作方式對比圖


        旋轉式電動牙刷是由電機帶動刷頭旋轉,牙面清潔度高,但牙縫清潔能力薄弱且相較于振動式,更易損傷牙釉質。而振動式,由電機帶動刷頭進行上下的高頻振動,高頻擺動的刷頭能高效完成洗刷牙齒的動作,可以讓牙膏與水的混合物產生大量微小的氣泡,氣泡爆裂時產生的壓力可以更深入牙縫達到深度的清潔效果。


        振動式的實現有兩種方式,一種由偏心振動電機實現,多用于中低檔的電動牙刷方案。該種方式的電動牙刷振動感強,振動無序。另一種則是采用線性電機,業內也稱之為磁懸浮電機。



        圖2. 磁懸浮電機示意圖


        磁懸浮電機的優點在于其在工作運行噪聲小,機身振感低,振動能量集中,清潔效果佳。因此,本文采用ACM32F030作為主控芯片,基于磁懸浮電機提出一款電動牙刷的設計方案。


        設計方案


        本文描述的電動牙刷方案,是基于上海航芯ACM32F030系列的MCU進行設計,整體的方案框圖如下所示:



        圖3. 基于ACM32F030/070電動牙刷設計方案框圖


        ACM32F0X0 系列是一款支持多種低功耗模式的通用MCU。集成12位1.6 Msps高精度ADC以及比較器、運放、觸控按鍵控制器、段式LCD控制器,內置高性能定時器、多路UART、LPUART、SPI、I2C等豐富的通訊外設,內建AES、TRNG等信息安全模塊,支持多種低功耗模式,具有高整合度、高抗干擾、高可靠性的特點。本產品采用ARM Cortex-M0系列內核,最高工作頻率64MHz。足以滿足一般的電動牙刷方案的需求。



        掃碼即可立即購買ACM32F070KBU7
        備注:ACM32F030和070軟硬件兼容



        掃碼即可立即購買開發板


        軟硬件下載鏈接如下:

        https://gitee.com/acm32-mcu/electric-toothbrush

        https://github.com/ACM32-MCU/electric-toothbrush


        ? 人機交互系統


        本文論述的設計方案中的人機交互功能是采用簡單的LED和按鍵的方式進行實現。共有1個按鍵和6個LED。按鍵需實現設備的開關機以及模式切換功能。設備會根據按鍵按下時間的長短來判定當前的動作是需要切換模式或是開關機操作。6個LED中有3個用于工作模式指示,最大可支持7種工作模式(23-1),本設計方案中僅提供了三種模式。另外3個LED用于系統狀態指示,包括正常,欠壓,充電,充滿4種電壓狀態。


        長短按識別程序:


        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);
            }
          }
        }


        ? 電源及功耗管理


        電動牙刷產品的續航能力也是一直備受人們關注。本設計方案在低功耗的處理,摒棄了一般的休眠方式,直接采用關閉電源來避免設備在不工作狀態下的設備功耗。整個設備的供電線路共有三種,如下圖所示。



        圖4. 基于ACM32F030的電動牙刷供電電路(部分)


        正常情況下,設備不在充電時,VCHARG電壓為0,需要關機時,按鍵彈開,PWR_KEY為低電平,芯片內部程序也將PWR_LOCK拉低,此時Q2關斷,Q2的D極電壓同VBAT,從而引起Q1斷開,VCCIN斷電,系統關機。而開機時,按鍵按下,PWR_KEY先被拉至高電平,Q2導通,Q2的D極拉低,則Q1導通,設備供電,程序檢測到開機,拉高PWR_LOCK,此時,盡管按鍵彈開,PWR_LOCK仍然會提供Q2的導通電壓,系統正常工作。充電時,Q2的導通電壓會由VCHARG提供,系統保持在工作狀態,此時會程序會檢測系統的運行狀態,在不需要啟動時,進入休眠狀態。


        電源管理部分,則通過鋰電池充電芯片檢測是否進行充電,同時通過一路ADC監測電池電壓。為減少芯片工作負擔,電池電壓的欠壓和滿電通過ADC門限電壓功能來實現。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 ;


        ? 智能管理系統


        智能管理系統分為兩個部分,一部分為上位機的數據處理,由云端處理,另一部分是電動牙刷數據記錄和傳輸。整個的實現過程可簡述為,電動牙刷通過慣性測量儀QMI8658C記錄電動牙刷在使用過程中的運動軌跡,并實時將該部分數據以及整個系統的工作參數通過BLE發送到手機,手機連接云端,并將數據傳輸至云平臺進行數據解析,分析用戶刷牙的健康指數,并將相關建議反饋至手機。電動牙刷作為數據采集設備,需上報實時數據,結構如下:


        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為三軸的角度。定時上傳電動牙刷的相關實時數據。上位機根據一系列點位數據進行建模計算可得到整個牙刷的運動軌跡。


        ? 電機驅動系統


        電動牙刷的驅動系統是通過H橋芯片MX612E進行處理,MX612E的輸入端連接芯片的PWM互補輸出端口。如下圖所示:



        圖5. 電動牙刷電機驅動電路


        本設計中的電動牙刷采用磁懸浮電機,內部構造和直流無刷電機相似,但相比于直流無刷電機,其僅有兩相輸入端。這也就造成該電機在通電后,正負極不變的情況下,電機旋轉至某一角度形成平衡后將會停止旋轉。切換正負極后則又會在另一個方向旋轉形成平衡。在電動牙刷的正常工作中,是通過兩相的正負極切換來使電機正反旋轉從而帶動刷頭做高頻運動的。因此,其電機速度的控制依靠于輸出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周期內,電機可完成一次往返運動。


        本文提出的設計方案的主旨是將電動牙刷智能化,在提高人們刷牙效率的同時,也能達到進一步保證人們刷牙質量的目的。通過電動牙刷對慣性的數據采集,實時上傳至云端,并對數據進行處理,恢復用戶的刷牙軌跡,給出合理建議,糾正用戶不良的刷牙習慣。磁懸浮電機的高頻振動也能有效清除口腔污漬。歲月恒久遠,牙齒永相隨 ^-^。


        上海航芯·原廠直連:marketing@aisinochip.com

        97色色,欧美最猛黑人XXXX黑人猛交,亚洲国产成人精品女人久久久,久久国产精品男人的天堂