ESP32 的 PWM 腳位是可以指定到 Output 的腳位,用法也相當簡單,可以操作的頻率從 1Hz 到 40Mhz,範圍相當大,今天就來與分享 PWM Control 使用上需注意的地方與 SG90 角度控制實際範例。
1. PWM Control
PWM 類別一樣放在 machine 模組內,但因為需指定哪支 Pin 腳,所以需要import PWM 和 Pin,下面為快速初始化的範例:
from machine import Pin, PWM pwm16= PWM(Pin(16)) pwm17= PWM(Pin(17),freq=1000,duty=512)
兩種方法都可以,純粹看需不需要使用 PWM 時就同時開始啟動,此外這個 PWM 物件還有3個方法可以操作:
pwm16.freq(1000)
:指定 pwm 的基本頻率,如果括號內不填值可以取得目前 pwm 腳位的頻率也就是pwm16.freq()
。(pwm16 是一開始建立的物件名稱)pwm16.duty(512)
:指定 pwm 的 duty cycle,duty 內的值可以填入 0-1023,也就是代表 0-100%,如果想要 duty 為 30% 時,就是填入1024×0.3=307 就可以啦!那如果要取得目前的 duty 值就可以直接pwm16.duty()
就會回傳目前的duty值。(pwm16 是一開始建立的物件名稱)pwm16.deinit()
:這個方法就是把 pwm 功能關掉,如果在 pwm 的操作結束後,可以放入這個方法,避免該隻腳位為仍然有波型輸出,導致誤動作發生。
以上就是ESP32 pwm的基本用法,如果對於pwm(Pulse Width Modulation) 這項技術不是很瞭解的朋友,可以參考JIMI哥之前寫的這篇RGB LED的前幾個小節內容應該就會有基礎的認識啦!那pwm控制可以用來哪裡呢?馬達的電壓控制、led的亮度控制、伺服馬達的角度控制等,今天我們就用常用的SG90伺服馬達來進行應用吧!
2. SG90 伺服馬達
SG90 這顆馬達在 DIY 創客間非常普遍,在拍賣價格多落在幾十塊做左右,通常可以帶買到兩種形式的,0-180 度跟 360 度,適合做角度控制是 180 度的那顆,同時也是可以接收 PWM 訊號進行動作,我們先來看一下這顆 SG90的規格:
- Weight: 9g
- Dimension: 23×12.2x29mm
- Stall torque: 1.8kg/cm(4.8v)
- Gear type: POM gear set
- Operating speed: 0.1sec/60degree(4.8v)
- Operating voltage: 4.8v
- Temperature range: 0℃_ 55℃
- Dead band width: 1us
- Power Supply: Through External Adapter
- servo wire length: 25 cm
- Servo Plug: JR (Fits JR and Futaba)
我們需要注意的就是操作電壓 (Operating Voltage) 跟 『dead band width』這兩個參數,這顆的操作電壓規格設定在 4.8V,也就是我們需要讓連接到 5V 左右,另一個參數的意思是當伺服機接受指令時,不同的命令兩個必須大於 1us,不然內部控制器是忽略控制命令。
在來我們來看這顆可以接受的 PWM 控制命令形式。
由上圖可以得知,SG90 的控制命令的 PWM Period 要設定為 50Hz,Duty 需為500us-2400us 之間,轉換成角度就是 0-180 度之間,透過數學轉換可以得知要轉動一度,控制命令約需要增加10.55us ( 1900us/180 )左右的時間,後續我們可以透過 python 程式碼將此數學式進行轉換。
3. 電路連接
SG90 的電路接法很簡單,紅色為電源 5V,棕色為 GND,橘色為可以接收 PWM 訊號的腳位,下圖為實際電路的接法:(ESP32 USB 端插入電腦即可)
4. 程式功能
這支程式的目的就是利用 PWM 訊號控制 SG90 馬達分別在 0度、90度、180度停止 1 秒,並來回循環。
from machine import Pin,PWM import time sg_pin=PWM(Pin(14),freq=50,duty=0) #duty range 0-1023 d_90=(int)(1023*0.0725) #1.45ms d_zero=(int)(1023*0.025) #0.5ms d_180=(int)(1023*0.12) #2.4ms de_map=[d_90,d_zero,d_90,d_180] try: while 1: for i in de_map: sg_pin.duty(i) time.sleep(1) except Exception as e: print(e) sg_pin.deinit()
> 程式解說
from machine import Pin,PWM import time sg_pin=PWM(Pin(14),freq=50,duty=0) #duty range 0-1023
此部分為 import 需要的 Pin, PWM 類別,由於還需要用到 delay 功能,所以增加time Module。同時指定GPIO14 為 PWM 輸出腳位,PWM 的基本週期為 50Hz,Duty 初始值為0,該腳位先關閉,等需要用時再開啟 PWM。
d_90=(int)(1024*0.0725) #1.45ms d_zero=(int)(1024*0.025) #0.5ms d_180=(int)(1024*0.12) #2.4ms
由於我們要控制在0 度、90度與180度,所需的 HIGH 時間分別為 0.5ms、1.45ms、2.4ms(可以參考 SG90 的控制時序圖),而完整 PWM 週期為 20ms,所以 Duty 就為 2.5%、7.25%、12%,並 x1024 後可以轉換成 PWM Duty填入的數值。
de_map=[d_90,d_zero,d_90,d_180] try: while 1: for i in de_map: sg_pin.duty(i) time.sleep(1) except Exception as e: print(e) sg_pin.deinit()
將各個角度建立一個循環 List,讓 SG90 可已呈現置中、左轉、置中、右轉的狀態,透過 Loop 迴圈實現功能,try-except 則是預留中斷程式的機制。
5. 結語
PWM 技術應用的範圍相當廣泛,今天這篇是只是一個簡單 servo 位置控制,不過相信各位朋熟悉後,也可以使用在像 RGB LED 呼吸燈類的產品,原理都是相同的,日後 JIMI哥會再補充一些相關的範例的,就請大家耐心等待吧!
↓↓↓↓↓↓賣場連結↓↓↓↓↓↓
歡迎大家有需要的話,可以多多支持一下我們的蝦皮賣場喔! 😀
吉米家官方店-創客機器人材料專賣 https://shopee.tw/jimirobot.tw
Follow JIMI哥 Twitter : https://twitter.com/jimirobot <–得到最新文章通知