PWM(Pulse Width Modulation)即脉宽调制,是一种通过调节信号的占空比来控制电路的技术。 在 PWM 技术中,信号的周期保持不变,但是信号的占空比可以随时间变化而改变。 当信号的占空比为 0% 时,表示信号一直处于低电平状态; 当占空比为 100% 时,表示信号一直处于高电平状态; 而在占空比为中间值时,信号将以一定的频率在低电平和高电平之间切换。
在电路应用中,PWM 技术常用于控制电机的转速、控制 LED 的亮度和颜色、实现音频数字化等方面。 例如,在控制 LED 亮度时,可以通过调节 PWM 信号的占空比来控制 LED 的亮度,占空比越大,LED 灯亮度越高,反之亦然。
在微控制器中,通过定时器和计数器等硬件模块,可以实现高精度的 PWM 信号输出。 许多单片机和嵌入式系统都提供了 PWM 功能,并且在软件层面提供了相应的 API 和库函数,方便开发者使用。 在使用 PWM 技术时,需要根据具体的应用场景选择合适的 PWM 频率和分辨率,以及合适的占空比范围和切换速率,以达到最优的控制效果。
ESP8266 是一款高度集成的 Wi-Fi SoC 芯片,内部集成了许多硬件模块,其中包括一个灵活的 PWM 控制器,即 LEDC(LED 控制器)。 LEDC 可以用于实现高精度的 PWM 输出,适用于控制 LED 的亮度、颜色和闪烁等效果。
ESP8266 的 LEDC 控制器可实现同频率、不同占空比的PWM波形输出。 LEDC 模块的主要特点包括:
在使用 ESP8266 的 PWM 功能时,可以使用 ESP8266 的官方库文件 ESP8266WiFi.h 中提供的 LEDC 相关函数进行配置和控制。 例如,可以使用 ledcSetup() 函数来初始化 PWM 通道,并使用 ledcWrite() 函数来设置 PWM 占空比。 此外,ESP8266 的开发环境也提供了丰富的示例代码和库函数,方便开发者快速上手使用 PWM 功能。
要注意的是,GPIO1和GPIO3作为调试串口的TX和RX,一般不做PWM使用。
要实现输出PWM信号,可以使用analogWrite()函数:
analogWrite(pin,value)
1
analogWriteFreq(new_frequency);
可以用于调节模拟输出的 PWM 范围。
在 ESP8266 中,analogWriteRange() 函数用于设置 PWM 的分辨率。 默认情况下,ESP8266 的 PWM 分辨率为 10 位,即占空比范围为 0~1023。 通过调用 analogWriteRange() 函数,可以将 PWM 分辨率调节为 8 位或 9 位,以扩大或缩小 PWM 占空比范围。
const int ledPin = 2;
void setup() {
}
void loop() {
// 增加LED亮度
for(int dutyCycle = 0; dutyCycle < 1023; dutyCycle++){
// 通过PWM改变LED亮度
analogWrite(ledPin, dutyCycle);
delay(10);
}
// 降低LED亮度
for(int dutyCycle = 1023; dutyCycle > 0; dutyCycle--){
// 通过PWM改变LED亮度
analogWrite(ledPin, dutyCycle);
delay(10);
}
}
红外通信是一种无线通信方式,它通过发射红外线来传输数据或控制信号,通常用于红外遥控器、红外传感器等场景。
红外信号是一种电磁辐射,其频率在可见光波和微波之间,一般波长为0.75至1000微米,其中,可见光波长为0.38至0.78微米。 红外线被称为"热线",因为物体温度越高,发射的红外线辐射就越多。
在红外通信中,通过对载波信号进行调制,将数字信号转换为红外信号,从而实现数据或控制信号的传输。 调制方式主要有两种:幅度调制和频率调制。
接收端通过红外接收器接收到红外信号,然后通过解调的方式提取出携带的数据或控制信号。 解调的过程就是将红外信号转化为电信号,然后提取出载波信号,再将其与一个固定的频率进行比较,从而恢复出原始的数字信号。
红外信号的载波频率(Carrier Frequency)指的是红外信号中用于携带信息的载波波形的频率。 在红外通信中,常用的载波频率一般在 20 kHz 到 50 kHz 之间。
将信息信号和载波信号进行调制后,就可以通过红外发射器将带有载波信号的红外信号发送出去。 接收器可以通过解调过程,将携带的信息信号提取出来。
在红外遥控器中,一般使用一定的载波频率进行通信。 这样可以提高通信的可靠性,同时也可以避免干扰,因为很少有其他的设备会使用相同的载波频率进行通信。
红外信号的发送周期是指一个完整的红外信号周期所需的时间。 在红外通信中,为了确保通信的可靠性,每一个红外信号周期中一般包含多个载波周期。 具体来说,发送周期包括两部分时间:载波周期和调制周期。
在红外遥控器中,每一个按键通常对应一个特定的红外信号,这个红外信号的发送周期一般是固定的,以确保遥控器能够正确地发送信号,并且接收器能够正确地解码信号。
库开源地址:
https://github.com/crankyoldgit/IRremoteESP8266
#include
#include
IRsend irsend(4); // 初始化IRsend对象并设置输出引脚,GPIO4=D2
void setup()
{
Serial.begin(115200);
delay(1000);
}
void loop()
{
Serial.println("Sending IR signal...");
irsend.sendSony(0xA90, 12); // 发送SONY红外信号,传输数据为0xA90,数据长度为12位
delay(1000); // 等待1秒钟
}
#include
#include
#include
#include
// An IR detector/demodulator is connected to GPIO pin 14(D5 on a NodeMCU
// board).
// Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts.
// Note: GPIO 14 won't work on the ESP32-C3 as it causes the board to reboot.
#ifdef ARDUINO_ESP32C3_DEV
const uint16_t kRecvPin = 10; // 14 on a ESP32-C3 causes a boot loop.
#else // ARDUINO_ESP32C3_DEV
const uint16_t kRecvPin = 14;
#endif // ARDUINO_ESP32C3_DEV
IRrecv irrecv(kRecvPin);
decode_results results;
void setup() {
Serial.begin(115200);
irrecv.enableIRIn(); // Start the receiver
while (!Serial) // Wait for the serial connection to be establised.
delay(50);
Serial.println();
Serial.print("IRrecvDemo is now running and waiting for IR message on Pin ");
Serial.println(kRecvPin);
}
void loop() {
if (irrecv.decode(&results)) {
// print() & println() can't handle printing long longs. (uint64_t)
serialPrintUint64(results.value, HEX);
Serial.println("");
irrecv.resume(); // Receive the next value
}
delay(100);
}
全部0条评论
快来发表一下你的评论吧 !