Не работает ШИМ NodeMCU Lolin

dxf

✩✩✩✩✩✩✩
17 Апр 2020
47
2
Не могу заставить работать ШИМ на ESP8266.
Вроде самый простой код:
C++:
#include <Arduino.h>
int speed = 512;
#define pin_relay_01 14
#define pin_relay_02 12
void setup() {
  pinMode(pin_relay_01, OUTPUT);
   pinMode(pin_relay_02, OUTPUT);
}
void loop() {
analogWrite(pin_relay_01, speed);
analogWrite(pin_relay_02, speed/2);
}
На пинах просто держится уровень лог 1. Что хоть здесь не так?
Явно чего то не понимаю, т.к. пробовал уз 3 м/к прошить, результат одинаковый. 13 и 15 пины тоже пробовал.

Работаю в VSCODE 1.85.1
ОС: Linux x64 6.7.2-arch1-1
 

DakonS

✩✩✩✩✩✩✩
2 Фев 2023
34
5
Я три момента вижу.

1. Я обнаружил, что ты pin_relay_01 управляешь. Ты случайно не реле управляешь? Просто там ШИМ не получится использовать, т.к. там используется катушка, которая имеет свойство накапливать ток и заряд.

2. analogWrite. Когда ты пишешь во втором параметре значение скважности - нужно иметь ввиду, что она ограничена от 0 до 255. А ты 512 делишь пополам и не понимаешь почему - там единица на логике. Тут подробнее про эту функцию: https://arduino.ru/Reference/AnalogWrite?ysclid=ls4pntfjza116791257

3. На ESP ардуиновский ШИМ не совсем корректно работает периодически. Лучше юзать из фреймворка ESP-IDF команды. Тоже сталкивался с этим. Сейчас тебе пример напишу.
Почитай про юзание команд ledc.

А вот небольшой код.Там несколькими командами нужно ШИМ запускать, а также определяет его частоту.



C++:
#include <Arduino.h>
#include "esp32-hal-ledc.h"

#define LEDC_CHANNEL 0
#define LEDC_TIMER 0
#define LED_PIN 2
byte del = 50;
int freq = 0;
int dutyCycle = 0;

void setup()
{
  Serial.begin(115200);

  ledcSetup(LEDC_CHANNEL, freq, 8);
  ledcAttachPin(LED_PIN, LEDC_CHANNEL);
  ledcWrite(LEDC_CHANNEL, dutyCycle * 255 / 100);


pinMode(LED_PIN, OUTPUT);

//del = 50;
}

А вообще ШИМ это настолько ЭЛЕМЕНТАРНАЯ вещь, что можно просто загуглить готовые скетчи, из которых нужную часть использовать - это просто совет - так бы ты решил вопрос быстрее.
 
Изменено:
  • Лойс +1
Реакции: dxf

dxf

✩✩✩✩✩✩✩
17 Апр 2020
47
2
@DakonS, о спасибо ) Поясню:
п.1 - реле только на симисторе с зерокроссингом, ШИМ воспринимает отлично
п.2 - возможно я неверно понял запись что значение ШИМ у esp должно изменяться в пределах 0...1023
п.3 - без подключения Arduino.h код кажет ошибку, возможно следуя твоей логике надо было задать значение между 0 и 255, а так как я меньше 255 не задавал, то логично что на выходе пина будет 1.
Как я понял везде по примерам analogWrite просто включает ШИМ и с ним спокойно можно работать, стандартной частоты мне хватает. Видимо это при подключении Arduino.h, мне видится что это намного проще если оно работает, нежели писать предлагаемый код.

НО огромное спасибо, особенно за наводку теперь хоть более менее понятно в чём ошибка. Попробую все как доберусь до МК
 

poty

★★★★★★✩
19 Фев 2020
3,506
997
@dxf, если реле на симисторе, то, очевидно, коммутируется переменный ток. Если это обычная сеть 50Гц, то чаще 100 раз в секунду подавать управляющий сигнал бесполезно (после открывания симистор закроется только при переходе через 0). Это к вопросу:
ШИМ воспринимает отлично
По умолчанию analogWrite отсутствует для esp32, Arduino.h как раз и нужна для того, чтобы эта функция появилась.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,684
464
реле только на симисторе с зерокроссингом, ШИМ воспринимает отлично
Похоже, вы не совсем понимаете, о чём говорите. Потому и ищете ошибку совершенно не там. Для управления мощностью переменного тока с помощью твердотельного реле/симистора нужна не ШИМ, а СИФУ. А этот "зерокроссинг" в симисторе будет только мешать СИФУ, потому как не даст открыть симистор в нужный момент времени. Другими словами, не позволит менять угол коммутации.
У вас не возникло бы этого вопроса, знай вы что такое импульсно-фазовое управление тиристором/симистором и для чего оно. Гугель в помощь.
 
Изменено:

dxf

✩✩✩✩✩✩✩
17 Апр 2020
47
2
@PiratFox, да, я вкурсе этого, просто пожалуйста повнимательней читайте вопрос в начале топика. Но то что написали, хорошо, пригодится ещё кому то.