24小时联系电话:18217114652、13661815404

中文

您当前的位置:
首页>
电子资讯>
公司新闻>
如何在 ESP32 中使用 ...

公司新闻

如何在 ESP32 中使用 PWM


如何在 ESP32 中使用 PWM

脉宽调制 ( PWM ) 是一种广泛使用的电力传输技术。ESP32 有专用的 PWM 硬件。信号或电源的脉宽调制 (PWM) 是一种修改周期信号(例如正弦信号或方波信号)的占空比的技术。周期信号的占空比是其正部分相对于周期的相对宽度。

PWM 电路的典型结构是使用具有两个输入和一个输出的比较器来实现的。其中一个输入连接到锯齿波振荡器,而另一个可用于调制信号。在输出端,频率通常等于锯齿信号的频率,占空比是载波的函数。PWM 电路的主要缺点是可能存在射频干扰。通过将控制器靠近负载并过滤电源,可以最大限度地减少这些问题。

ESP32 PWM 可以驱动 LED、电机(普通直流电机、无刷电机)、智能灯等。典型的 PWM 信号具有 PWM 频率、PWM 分辨率和 PWM 占空比。如果我们改变 PWM 的占空比参数,那么脉冲的宽度也会改变。分辨率是一种衡量标准,可让我们了解我们可以控制多少个离散的占空比级别。PWM 分辨率 = log2(级别数)。分辨率越高,对占空比的控制就越精细。

Arduino中我们使用该analogWrite()函数来实现PWM。但模拟写入功能尚未在 ESP32 Arduino 版本中实现。而是ledcWrite()引入了一个名为的新函数。使用引脚 5 连接 LED 并使用以下代码进行测试:

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

  }

}

这是带电位器的伺服电机的测试代码:

#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

}

这是一个非常短的片段/草图,您可以将其用于直流电机和锅:

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

}

一个 L293 板/模块可以控制 2 个直流电机并提供 500ma 电流。为控制每台电机2组控制,提供引脚。您可以将此模块与上述代码一起使用来构建基本的机器人汽车。

请输入搜索关键字

确定