24小時(shí)聯(lián)系電話:18217114652、13661815404
中文
公司新聞
如何在 ESP32 中使用 PWM
如何在 ESP32 中使用 PWM
脈寬調(diào)制 ( PWM ) 是一種廣泛使用的電力傳輸技術(shù)。ESP32 有專用的 PWM 硬件。信號(hào)或電源的脈寬調(diào)制 (PWM) 是一種修改周期信號(hào)(例如正弦信號(hào)或方波信號(hào))的占空比的技術(shù)。周期信號(hào)的占空比是其正部分相對(duì)于周期的相對(duì)寬度。
PWM 電路的典型結(jié)構(gòu)是使用具有兩個(gè)輸入和一個(gè)輸出的比較器來實(shí)現(xiàn)的。其中一個(gè)輸入連接到鋸齒波振蕩器,而另一個(gè)可用于調(diào)制信號(hào)。在輸出端,頻率通常等于鋸齒信號(hào)的頻率,占空比是載波的函數(shù)。PWM 電路的主要缺點(diǎn)是可能存在射頻干擾。通過將控制器靠近負(fù)載并過濾電源,可以最大限度地減少這些問題。
ESP32 的 PWM 可以驅(qū)動(dòng) LED、電機(jī)(普通直流電機(jī)、無刷電機(jī))、智能燈等。典型的 PWM 信號(hào)具有 PWM 頻率、PWM 分辨率和 PWM 占空比。如果我們改變 PWM 的占空比參數(shù),那么脈沖的寬度也會(huì)改變。分辨率是一種衡量標(biāo)準(zhǔn),可讓我們了解我們可以控制多少個(gè)離散的占空比級(jí)別。PWM 分辨率 = log2(級(jí)別數(shù))。分辨率越高,對(duì)占空比的控制就越精細(xì)。
在Arduino中我們使用該analogWrite()函數(shù)來實(shí)現(xiàn)PWM。但模擬寫入功能尚未在 ESP32 Arduino 版本中實(shí)現(xiàn)。而是ledcWrite()引入了一個(gè)名為的新函數(shù)。使用引腳 5 連接 LED 并使用以下代碼進(jìn)行測試:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#define LED_GPIO 5 #define PWM1_Ch 0 #define PWM1_Res 8 #define PWM1_Freq 1000
int PWM1_DutyCycle = 0;
void setup() { ledcAttachPin(LED_GPIO, PWM1_Ch); ledcSetup(PWM1_Ch, PWM1_Freq, PWM1_Res); }
void loop() { while(PWM1_DutyCycle < 255) { ledcWrite(PWM1_Ch, PWM1_DutyCycle++); delay(10); } while(PWM1_DutyCycle > 0) { ledcWrite(PWM1_Ch, PWM1_DutyCycle--); delay(10); } } |
這是帶電位器的伺服電機(jī)的測試代碼:
#include <ESP32Servo.h> Servo servo1; // create a servo object #define potWiper 36 #define servoPin 19 #define twoTo12th 4095 #define delay1 150
int intValue;
void setup() {
servo1.attach(servoPin); // attach the servo to servoPin
Serial.begin(9600); // setup display monitor (work at 9600 baud) }
void loop() { intValue = analogRead(potWiper); // read value at pin potWiper pin intValue = map(intValue, 0, twoTo12th, 0, 180); // convert value read to value from 0 to 180 servo1.write(intValue); // move the servo to position intValue Serial.print("Servo Angle = "); // display the Serial.println(intValue); // servo angle on display monitor delay(delay1); // allow the servo time to get to position } |
這是一個(gè)非常短的片段/草圖,您可以將其用于直流電機(jī)和鍋:
1 2 3 4 5 6 7 8 9 10 |
const byte led_pin = 15; const byte pot_pin = 4; void setup() { ledcAttachPin (led_pin,0); ledcSetup(0,5000,8); // channel 0, pwm freq 5 khz, Resolution 8 bits }
void loop() { ledcWrite(0,analogRead(pot_pin); } |