久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 467|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

樹(shù)莓派RP2350實(shí)現(xiàn)步進(jìn)電機(jī)精確控制

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本文介紹了 樹(shù)莓派 RP2350 開(kāi)發(fā)板實(shí)現(xiàn)步進(jìn)電機(jī)驅(qū)動(dòng)的項(xiàng)目設(shè)計(jì),主要包括旋轉(zhuǎn)角度的精確控制、串口發(fā)送實(shí)現(xiàn)自定義角度旋轉(zhuǎn)、OLED 顯示旋轉(zhuǎn)狀態(tài)三部分。

擴(kuò)展板PCB工程詳見(jiàn):Beetle-RP2350擴(kuò)展板 - 立創(chuàng)開(kāi)源硬件平臺(tái)oshwhubcom/lijinlei0907/beetle-rp2350-expansion-board

項(xiàng)目介紹

包括步進(jìn)電機(jī)原理、該項(xiàng)目使用的 28BYJ-48 步進(jìn)電機(jī),及其驅(qū)動(dòng)器——ULN2003 驅(qū)動(dòng)模塊介紹。

步進(jìn)電機(jī)原理

步進(jìn)電機(jī)(Stepper Motor)是一種將電脈沖信號(hào)轉(zhuǎn)換為精確角度位移的執(zhí)行器件,屬于開(kāi)環(huán)控制電機(jī)。

核心特點(diǎn):每接收一個(gè)脈沖,轉(zhuǎn)子就轉(zhuǎn)動(dòng)一個(gè)固定的角度(稱為“步距角”),無(wú)需反饋傳感器即可實(shí)現(xiàn)位置控制。



  • 結(jié)構(gòu)組成

    • 定子:繞有線圈的磁極,分為多相(常見(jiàn)2相、4相、5相)。
    • 轉(zhuǎn)子:永磁體(永磁式)或齒狀鐵芯(反應(yīng)式/混合式)。
    • 定子繞組按特定順序通電,產(chǎn)生旋轉(zhuǎn)磁場(chǎng),吸引轉(zhuǎn)子逐步轉(zhuǎn)動(dòng)。

  • 工作過(guò)程

    • 通過(guò)控制器(如單片機(jī))發(fā)送脈沖信號(hào),驅(qū)動(dòng)電路按順序切換定子繞組的電流方向。
    • 每切換一次,轉(zhuǎn)子轉(zhuǎn)動(dòng)一個(gè)步距角,連續(xù)脈沖使電機(jī)連續(xù)旋轉(zhuǎn)。


28BYJ-48 步進(jìn)電機(jī)

28BYJ-48 是一款常見(jiàn)的低成本、小扭矩 5 線單極步進(jìn)電機(jī),可使用 ULN2003 控制器和單片機(jī)實(shí)現(xiàn)旋轉(zhuǎn)控制,廣泛用于打印機(jī)、掃描儀、攝像機(jī)云臺(tái)、空調(diào)、家電、玩具、消費(fèi)電子等領(lǐng)域。




參數(shù)
值/描述
電機(jī)類型
單極 4 相永磁式步進(jìn)電機(jī)(5線制)
步距角
5.625°(64 步/圈),配合減速齒輪后 0.0879°(實(shí)際輸出軸 4096 步/圈)
減速比
1:64(內(nèi)部齒輪組減速)
額定電壓
5V 或 12V DC
相電流
約 100mA(每相)
保持扭矩
約 0.1 N·m(輸出軸,受減速齒輪影響)
繞組電阻
約 50Ω/相


實(shí)際輸出軸步距角為 5.625°/64 ≈ 0.0879°,轉(zhuǎn)一圈理論上需要 64×64=4096 步,實(shí)際可能存在誤差。

詳見(jiàn): 28BYJ-48 數(shù)據(jù)手冊(cè).pdf (193.2 KB, 下載次數(shù): 0)

ULN2003 驅(qū)動(dòng)器

ULN2003 是一款常用的達(dá)林頓晶體管陣列芯片,專為驅(qū)動(dòng)高電流負(fù)載(如繼電器、步進(jìn)電機(jī)、LED陣列等)設(shè)計(jì)。其作用是將 MCU 輸出的弱電流信號(hào)轉(zhuǎn)換為大電流輸出,是控制 28BYJ-48 步進(jìn)電機(jī)的核心驅(qū)動(dòng)芯片。



原理圖



使用時(shí)需要將 28BYJ-48 步進(jìn)電機(jī)的5線快接插頭與 ULN2003 模塊對(duì)應(yīng)接口連接,并將模塊的 4 個(gè)控制引腳(信號(hào)輸入端,絲印 IN1、IN2、IN3、IN4)與單片機(jī)對(duì)應(yīng)引腳相連,實(shí)現(xiàn)控制信號(hào)輸入。

詳見(jiàn): uln2003a.pdf (2.04 MB, 下載次數(shù): 0)

項(xiàng)目方案

具體執(zhí)行方案和工程測(cè)試流程如下

  • 步進(jìn)電機(jī)原理
  • 旋轉(zhuǎn)角度的精確控制
  • 串口發(fā)送實(shí)現(xiàn)自定義角度旋轉(zhuǎn)
  • OLED 顯示旋轉(zhuǎn)狀態(tài)

旋轉(zhuǎn)指定角度

本節(jié)介紹并實(shí)現(xiàn)了指定角度的步進(jìn)電機(jī)旋轉(zhuǎn)控制。

硬件連接
  • GP0 ---- IN1 (ULN2003)
  • GP1 ---- IN2 (ULN2003)
  • GP18 ---- IN3 (ULN2003)
  • GP19 ---- IN4 (ULN2003)






代碼


  1. '''
  2. Name: Stepper Motor driven by ULN2003
  3. Version: v1.0
  4. Date: 2025.05
  5. Author: ljl
  6. Other: Rotate stepper motor (28byj-48) for custom angle.
  7. Hardware connect:
  8. 0 ---- IN1 (ULN2003)
  9. 1 ---- IN2 (ULN2003)
  10. 18 ---- IN3 (ULN2003)
  11. 19 ---- IN4 (ULN2003)
  12. '''

  13. from machine import Pin
  14. import utime

  15. # 電機(jī)控制引腳
  16. coils = [
  17.     Pin(0, Pin.OUT),  # A相 (IN1)
  18.     Pin(1, Pin.OUT),  # B相 (IN2)
  19.     Pin(18, Pin.OUT),  # C相 (IN3)
  20.     Pin(19, Pin.OUT)   # D相 (IN4)
  21. ]

  22. # 四相八拍步進(jìn)電機(jī)的順序值
  23. STEP_SEQ = [
  24.     [1, 0, 0, 1],  # AB'
  25.     [1, 0, 0, 0],  # A
  26.     [1, 1, 0, 0],  # AB
  27.     [0, 1, 0, 0],  # B
  28.     [0, 1, 1, 0],  # BC
  29.     [0, 0, 1, 0],  # C
  30.     [0, 0, 1, 1],  # CD
  31.     [0, 0, 0, 1]   # D
  32. ]

  33. '''
  34. 驅(qū)動(dòng)電機(jī)旋轉(zhuǎn)指定步數(shù)
  35. :param steps: 正數(shù)=順時(shí)針,負(fù)數(shù)=逆時(shí)針
  36. :param delay_ms: 步間延時(shí)(ms),控制轉(zhuǎn)速
  37. '''
  38. def step_motor(steps, delay_ms=1):
  39.     direction = 1 if steps >=0 else -1
  40.     for _ in range(abs(steps)):
  41.         for phase in range(8)[::direction]:  # 方向控制
  42.             for coil, state in zip(coils, STEP_SEQ[phase]):
  43.                 coil.value(state)
  44.             utime.sleep_ms(delay_ms)

  45. # 旋轉(zhuǎn)角度控制
  46. def rotate_angle(angle):
  47.     steps_per_rev = 509
  48.     steps = int(angle * (steps_per_rev / 360))
  49.     step_motor(steps)

  50. # 釋放電機(jī)扭矩
  51. def release():
  52.     for coil in coils:
  53.         coil.value(0)

  54. while True:
  55.     #rotate_angle(1) # 以單步方式持續(xù)轉(zhuǎn)動(dòng)
  56.     rotate_angle(180) # 逆時(shí)針
  57.     release()
  58.     utime.sleep_ms(2000)
  59.     rotate_angle(-90) # 順時(shí)針
  60.     release()
  61.     utime.sleep_ms(2000)
復(fù)制代碼




效果



由供電處的電壓-電流計(jì)量工具可知,步進(jìn)電機(jī)旋轉(zhuǎn)工作時(shí)的功率約為 1W



串口自定義角度

在實(shí)現(xiàn)步進(jìn)電機(jī)旋轉(zhuǎn)驅(qū)動(dòng)的基礎(chǔ)上,進(jìn)一步實(shí)現(xiàn)串口發(fā)送自定義角度并旋轉(zhuǎn)的功能設(shè)計(jì)方案。

硬件連接
  • GP0 ---- IN1 (ULN2003)
  • GP1 ---- IN2 (ULN2003)
  • GP4 ---- IN3 (ULN2003)
  • GP5 ---- IN4 (ULN2003)
  • GP8 ---- RXD (CH340)
  • GP9 ---- TXD (CH340)







代碼



  1. '''
  2. Name: Stepper Motor rotate custom angle from serial
  3. Version: v1.0
  4. Date: 2025.05
  5. Author: ljl
  6. Other: Rotate stepper motor (28byj-48) for custom angle from UART.
  7. Hardware connect:
  8. 0 ---- IN1 (ULN2003)
  9. 1 ---- IN2 (ULN2003)
  10. 4 ---- IN3 (ULN2003)
  11. 5 ---- IN4 (ULN2003)
  12. 8 ---- RXD (CH340)
  13. 9 ---- TXD (CH340)
  14. '''

  15. from machine import Pin, UART
  16. import utime
  17. import ujson

  18. # 電機(jī)控制引腳
  19. coils = [
  20.     Pin(0, Pin.OUT),  # A相 (IN1)
  21.     Pin(1, Pin.OUT),  # B相 (IN2)
  22.     Pin(4, Pin.OUT),  # C相 (IN3)
  23.     Pin(5, Pin.OUT)   # D相 (IN4)
  24. ]

  25. # 四相八拍步進(jìn)電機(jī)的相序
  26. STEP_SEQ = [
  27.     [1, 0, 0, 1],  # AB'
  28.     [1, 0, 0, 0],  # A
  29.     [1, 1, 0, 0],  # AB
  30.     [0, 1, 0, 0],  # B
  31.     [0, 1, 1, 0],  # BC
  32.     [0, 0, 1, 0],  # C
  33.     [0, 0, 1, 1],  # CD
  34.     [0, 0, 0, 1]   # D
  35. ]

  36. # 驅(qū)動(dòng)電機(jī)旋轉(zhuǎn)指定步數(shù);delay_ms 步間延時(shí)(ms),控制轉(zhuǎn)速
  37. def step_motor(steps, delay_ms=1):
  38.     direction = 1 if steps >=0 else -1
  39.     for _ in range(abs(steps)):
  40.         for phase in range(8)[::direction]:  # 方向控制
  41.             for coil, state in zip(coils, STEP_SEQ[phase]):
  42.                 coil.value(state)
  43.             utime.sleep_ms(delay_ms)

  44. # 角度控制
  45. def rotate_angle(angle):
  46.     steps_per_rev = 509
  47.     steps = int(angle * (steps_per_rev / 360))
  48.     step_motor(steps)

  49. # 釋放電機(jī)扭矩
  50. def release():
  51.     for coil in coils:
  52.         coil.value(0)

  53. # 串口控制旋轉(zhuǎn)角度
  54. def uart_control():
  55.     uart = machine.UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9))
  56.     while True:
  57.         if uart.any():
  58.             cmd = uart.read()
  59.             try:
  60.                 data = ujson.loads(cmd)
  61.                 rotate_angle(int(data['angle']))
  62.                 release()
  63.             except:
  64.                 uart.write('Invalid command\r\n')
  65.                 release()
  66.         else:
  67.             release()
  68.         utime.sleep_ms(100)

  69. # main loop
  70. while True:
  71.     uart_control()
復(fù)制代碼


這里為了節(jié)能并提高效率,僅在串口發(fā)送正確指令時(shí)旋轉(zhuǎn),其他情況均釋放步進(jìn)電機(jī)扭矩,此時(shí)電流約為 0 .


效果



由于調(diào)用了 ujson 庫(kù),因此串口發(fā)送指令需符合 json 格式,如 {"angle":40} .

若串口發(fā)送 json 消息的格式錯(cuò)誤,則反饋指令無(wú)效的提示。

OLED 顯示旋轉(zhuǎn)狀態(tài)

在前面實(shí)現(xiàn)步進(jìn)電機(jī)旋轉(zhuǎn)驅(qū)動(dòng)、串口自定義角度控制的基礎(chǔ)上,進(jìn)一步實(shí)現(xiàn)串口發(fā)送角度、旋轉(zhuǎn)、OLED 狀態(tài)顯示的功能設(shè)計(jì)方案。

硬件連接

  • GP0 ---- IN1 (ULN2003)
  • GP1 ---- IN2 (ULN2003)
  • GP18 ---- IN3 (ULN2003)
  • GP19 ---- IN4 (ULN2003)
  • GP8 ---- RXD (CH340)
  • GP9 ---- TXD (CH340)
  • GP4 ---- SDA (OLED_SSD1306)
  • GP5 ---- SCL (OLED_SSD1306)




流程圖





代碼



  1. '''
  2. Name: Stepper Motor rotate custom angle from serial and OLED display
  3. Version: v1.0
  4. Date: 2025.05
  5. Author: ljl
  6. Other: Rotate stepper motor (28byj-48) for custom angle from UART, and OLED display the motor state in moving or steady.
  7. Hardware connect:
  8. 0 ---- IN1 (ULN2003)
  9. 1 ---- IN2 (ULN2003)
  10. 18 ---- IN3 (ULN2003)
  11. 19 ---- IN4 (ULN2003)
  12. 8 ---- RXD (CH340)
  13. 9 ---- TXD (CH340)
  14. 4 ---- SDA (OLED_SSD1306)
  15. 5 ---- SCL (OLED_SSD1306)
  16. Serial send style: {"angle": 40}
  17. '''

  18. from machine import Pin, UART, SoftI2C
  19. import ssd1306 # OLED
  20. import ujson # read uart string
  21. import utime

  22. # ==== Initialized IIC OLED ====
  23. i2c = SoftI2C(scl=Pin(5), sda=Pin(4))
  24. oled_width = 128
  25. oled_height = 64
  26. oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)

  27. # display the motor state
  28. def display_motor(angle,state):
  29.     oled.fill(0)  # 清屏
  30.     oled.text("Rotate Angle: ", 0, 0)
  31.     oled.text("{:.1f} deg".format(angle), 20, 15)
  32.     oled.text("State: ", 0, 35)
  33.     if state == 1:
  34.         oled.text("Rotating ...", 20, 50)
  35.     elif state == 0:
  36.         oled.text("Reset", 20, 50)
  37.     else:
  38.         oled.text("Error", 20, 50)
  39.     oled.show()

  40. # 電機(jī)控制引腳
  41. coils = [
  42.     Pin(0, Pin.OUT),  # A相 (IN1)
  43.     Pin(1, Pin.OUT),  # B相 (IN2)
  44.     Pin(18, Pin.OUT),  # C相 (IN3)
  45.     Pin(19, Pin.OUT)   # D相 (IN4)
  46. ]

  47. # 四相八拍步進(jìn)電機(jī)的相序
  48. STEP_SEQ = [
  49.     [1, 0, 0, 1],  # AB'
  50.     [1, 0, 0, 0],  # A
  51.     [1, 1, 0, 0],  # AB
  52.     [0, 1, 0, 0],  # B
  53.     [0, 1, 1, 0],  # BC
  54.     [0, 0, 1, 0],  # C
  55.     [0, 0, 1, 1],  # CD
  56.     [0, 0, 0, 1]   # D
  57. ]

  58. # 驅(qū)動(dòng)電機(jī)旋轉(zhuǎn)指定步數(shù);delay_ms 步間延時(shí)(ms),控制轉(zhuǎn)速
  59. def step_motor(steps, delay_ms=1):
  60.     direction = 1 if steps >=0 else -1
  61.     for _ in range(abs(steps)):
  62.         for phase in range(8)[::direction]:  # 方向控制
  63.             for coil, state in zip(coils, STEP_SEQ[phase]):
  64.                 coil.value(state)
  65.             utime.sleep_ms(delay_ms)

  66. # 角度控制
  67. def rotate_angle(angle):
  68.     steps_per_rev = 509  # 64步/拍 × 8拍 × 8相位
  69.     steps = int(angle * (steps_per_rev / 360))
  70.     step_motor(steps)

  71. # 釋放電機(jī)扭矩
  72. def release():
  73.     for coil in coils:
  74.         coil.value(0)

  75. # 串口控制旋轉(zhuǎn)角度
  76. def uart_control():
  77.     uart = machine.UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9))
  78.     while True:
  79.         if uart.any():
  80.             cmd = uart.read()
  81.             try:
  82.                 data = ujson.loads(cmd)
  83.                 ra = float(data['angle']) # rotate angle
  84.                 display_motor(ra,1)
  85.                 rotate_angle(ra)
  86.                 release()
  87.                 display_motor(ra,0)
  88.             except:
  89.                 uart.write('Invalid command\r\n')
  90.                 release()
  91.         else:
  92.             release()
  93.             #display_motor(0,0)
  94.         utime.sleep_ms(100)

  95. # main loop
  96. display_motor(0,0) # initialize OLED display
  97. while True:
  98.     uart_control()
復(fù)制代碼


效果







總結(jié)

本文介紹了樹(shù)莓派 RP2350 開(kāi)發(fā)板實(shí)現(xiàn)步進(jìn)電機(jī)驅(qū)動(dòng)的項(xiàng)目設(shè)計(jì),包括旋轉(zhuǎn)角度的精確控制、串口發(fā)送實(shí)現(xiàn)自定義角度旋轉(zhuǎn)、OLED 顯示旋轉(zhuǎn)狀態(tài)等,為 RP2350 的開(kāi)發(fā)、設(shè)計(jì)和應(yīng)用提供了參考。



評(píng)分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本精品一区二区三区在线观看视频 | 亚洲永久 | 国产传媒在线观看 | 国产精品一区久久久久 | 欧美成人精品在线 | 请别相信他免费喜剧电影在线观看 | 国产一区二区三区免费 | 日韩成人一区二区 | 国产女人与拘做受免费视频 | 天天操天天干天天透 | 国产精品日日摸夜夜添夜夜av | 在线国产一区二区 | 久久亚洲国产 | 天天碰夜夜操 | 热re99久久精品国99热观看 | 91毛片网| 国产视频一区二区 | 日韩手机在线视频 | 亚洲福利视频一区二区 | 久草免费在线 | 久久久视频在线 | 欧美一区二区三区,视频 | 中国一级特黄毛片大片 | 丁香婷婷在线视频 | 性国产丰满麻豆videosex | 99久久婷婷国产综合精品电影 | 欧美在线一区二区三区 | 亚洲黄色国产 | 欧美精品一区二区三区四区 在线 | 在线观看国产网站 | 成年人在线播放 | 成人av网站在线观看 | 国产精品美女久久久 | 成人在线 | 在线观看第一区 | 午夜羞羞| 国产精品一区二区在线 | 国产一级在线观看 | 凹凸日日摸日日碰夜夜 | 欧美成人免费 | 欧美成人精品一区二区三区 |