# TurnipBit開發旋轉按鈕控制直流電機轉速的方法是什么
## 引言
在嵌入式開發領域,通過旋轉編碼器控制直流電機轉速是常見的交互方式。TurnipBit作為一款開源的嵌入式開發平臺,結合MicroPython編程語言,為開發者提供了簡潔高效的解決方案。本文將詳細介紹如何利用TurnipBit實現旋轉按鈕對直流電機的PWM調速控制。
## 硬件準備
### 所需組件清單
| 組件名稱 | 數量 | 說明 |
|----------------|------|--------------------------|
| TurnipBit主板 | 1 | 主控芯片ESP32-S3 |
| 旋轉編碼器模塊 | 1 | EC11系列(帶按鍵功能) |
| 直流電機 | 1 | 5V/12V(根據電源選擇) |
| L298N驅動模塊 | 1 | 或其它H橋驅動電路 |
| 杜邦線 | 若干 | 建議使用硅膠線防干擾 |
### 電路連接示意圖
```python
旋轉編碼器 -> TurnipBit
CLK -> GPIO15
DT -> GPIO16
SW -> GPIO17 (可選按鍵功能)
VCC -> 3.3V
GND -> GND
L298N -> TurnipBit
IN1 -> GPIO12
IN2 -> GPIO13
ENA -> GPIO14 (PWM輸出)
from machine import Pin, PWM
import time
class RotaryEncoder:
def __init__(self, clk_pin, dt_pin):
self.clk = Pin(clk_pin, Pin.IN, Pin.PULL_UP)
self.dt = Pin(dt_pin, Pin.IN, Pin.PULL_UP)
self.last_status = (self.clk.value() << 1) | self.dt.value()
self.counter = 0
def get_rotation(self):
current_status = (self.clk.value() << 1) | self.dt.value()
transition = (self.last_status << 2) | current_status
# 檢測順時針旋轉(0b1110或0b1000)
if transition in [0b1110, 0b1000]:
self.counter += 1
# 檢測逆時針旋轉(0b1101或0b0001)
elif transition in [0b1101, 0b0001]:
self.counter -= 1
self.last_status = current_status
return self.counter
def motor_control(speed):
# 限制PWM占空比范圍(0-1023)
speed = max(0, min(1023, speed))
pwm = PWM(Pin(14), freq=1000, duty=speed)
# 設置電機方向(示例為單向控制)
Pin(12, Pin.OUT).value(1)
Pin(13, Pin.OUT).value(0)
encoder = RotaryEncoder(15, 16)
current_speed = 512 # 初始50%占空比
while True:
delta = encoder.get_rotation()
if delta != 0:
current_speed += delta * 10 # 步進值調整
motor_control(current_speed)
print("Current Speed:", current_speed)
time.sleep_ms(20) # 防抖延遲
sw = Pin(17, Pin.IN, Pin.PULL_UP)
def on_button_press(pin):
global current_speed
current_speed = 0 # 急停功能
sw.irq(trigger=Pin.IRQ_FALLING, handler=on_button_press)
from math import exp
SMOOTH_FACTOR = 0.2
target_speed = 0
def smooth_control():
global current_speed, target_speed
current_speed = int(current_speed * (1-SMOOTH_FACTOR) + target_speed * SMOOTH_FACTOR)
motor_control(current_speed)
import ssd1306
i2c = machine.I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
def update_display():
oled.fill(0)
oled.text("Motor Speed:", 0, 10)
oled.text(f"{current_speed/10.23:.1f}%", 0, 30)
oled.show()
編碼器信號抖動
增加硬件濾波(0.1μF電容并聯CLK/DT引腳)或軟件消抖:
def stable_read(pin):
return sum([pin.value() for _ in range(5)]) > 2
電機啟動困難
修改PWM頻率(500Hz-5kHz試驗),或增加啟動加速曲線:
def soft_start(target):
for s in range(0, target, 5):
motor_control(s)
time.sleep_ms(50)
TurnipBit資源限制
使用RMT模塊實現精準PWM(需ESP32-S3專用庫):
from esp32 import RMT
rmt = RMT(0, pin=Pin(14), clock_div=80)
rmt.write_pulses((speed, 1023-speed), start=1)
通過TurnipBit平臺,我們實現了: - 旋轉編碼器精準計數 - 實時PWM調速控制 - 人機交互界面集成 - 系統穩定性優化
完整項目代碼已開源至GitHub(示例倉庫地址)。開發者可擴展PID控制、物聯網遠程監控等功能,構建更復雜的機電控制系統。 “`
注:實際字數約1100字,可根據需要增減代碼注釋或硬件說明部分調整篇幅。建議配合示波器觀察PWM波形調試最佳頻率參數。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。