ШИМ шумит

FDV
Offline
Зарегистрирован: 12.07.2014

Есть задача - пищит блок питания при шимировании, бесит ужасно! ))

Реализованно на ардуино про мини и на esp 8266 - пищит и там и там.

Тому, кто поможет решить проблему - перевод на карту 3 000 р. или 5 000 если решим проблему на обоих устройствах. По железу реализация простая, контроллер + мосфет по стандартной схеме (индуктивность в цепь вставлял, практически не помогает)

Код:

#define MIN_LIGHT 0
#define MAX_LIGHT 255
#define ledPin 9                     //управл¤ющий пин мосфета холодный свет
#define movePin 10                     //пин датчика движения

//блок с константами
int pwmLevel=0;                      //значение ¤ркости холодного света
static unsigned long time_fade;       //счетчик времени
static unsigned long time_fade_ligth;      //счетчик времени для холодного света
static unsigned long next_time;  
bool flag_ligth = 0;
bool flag_power = 0;                  //флаг включени¤
int timeout = 30000; // время свечения

void setup() 
{
    pinMode(ledPin, OUTPUT);  
}

void loop()
{
  //автоматика    
  if(flag_power==0)
  {       
    if(digitalRead(movePin)) 
    { 
      next_time = millis() + timeout; // вычисляем время выключения
    }
    if(millis()>= next_time ) // если текущее время превысило намеченное время, то
    {   
      ChangeLevel(MIN_LIGHT);
    }
    else
    {
      ChangeLevel(MAX_LIGHT);
    }
  } 
} 
void ChangeLevel(int new_value)
{
    if(new_value!=pwmLevel)
  { 
    if(millis()>time_fade)
    {       
    if(new_value-pwmLevel>0) 
    { 
      pwmLevel++;
      pwmLevel = constrain(pwmLevel, MIN_LIGHT, MAX_LIGHT);
      analogWrite(ledPin, pwmLevel);  
      time_fade=millis()+20;
      flag_ligth=1;
    }
    else
    {
      pwmLevel--;
      pwmLevel = constrain(pwmLevel, MIN_LIGHT, MAX_LIGHT);
      analogWrite(ledPin, pwmLevel); 
      time_fade=millis()+30;
      flag_ligth=0;                                              
    } 
    if(pwmLevel==MAX_LIGHT && flag_ligth==1)
    {
      analogWrite(ledPin, MAX_LIGHT); 
    }
    if(pwmLevel==MIN_LIGHT && flag_ligth==0)
    {
      analogWrite(ledPin, MIN_LIGHT); 
    }
    }  
  }  
}

 

Гриша
Offline
Зарегистрирован: 27.04.2014

FDV пишет:

 По железу реализация простая, контроллер + мосфет по стандартной схеме (индуктивность в цепь вставлял, практически не помогает)

Код:

#define MIN_LIGHT 0
#define MAX_LIGHT 255
#define ledPin 9                     //управл¤ющий пин мосфета холодный свет
#define movePin 10                     //пин датчика движения

//блок с константами
int pwmLevel=0;                      //значение ¤ркости холодного света
static unsigned long time_fade;       //счетчик времени
static unsigned long time_fade_ligth;      //счетчик времени для холодного света
static unsigned long next_time;  
bool flag_ligth = 0;
bool flag_power = 0;                  //флаг включени¤
int timeout = 30000; // время свечения

void setup() 
{
    pinMode(ledPin, OUTPUT);  
}

void loop()
{
  //автоматика    
  if(flag_power==0)
  {       
    if(digitalRead(movePin)) 
    { 
      next_time = millis() + timeout; // вычисляем время выключения
    }
    if(millis()>= next_time ) // если текущее время превысило намеченное время, то
    {   
      ChangeLevel(MIN_LIGHT);
    }
    else
    {
      ChangeLevel(MAX_LIGHT);
    }
  } 
} 
void ChangeLevel(int new_value)
{
    if(new_value!=pwmLevel)
  { 
    if(millis()>time_fade)
    {       
    if(new_value-pwmLevel>0) 
    { 
      pwmLevel++;
      pwmLevel = constrain(pwmLevel, MIN_LIGHT, MAX_LIGHT);
      analogWrite(ledPin, pwmLevel);  
      time_fade=millis()+20;
      flag_ligth=1;
    }
    else
    {
      pwmLevel--;
      pwmLevel = constrain(pwmLevel, MIN_LIGHT, MAX_LIGHT);
      analogWrite(ledPin, pwmLevel); 
      time_fade=millis()+30;
      flag_ligth=0;                                              
    } 
    if(pwmLevel==MAX_LIGHT && flag_ligth==1)
    {
      analogWrite(ledPin, MAX_LIGHT); 
    }
    if(pwmLevel==MIN_LIGHT && flag_ligth==0)
    {
      analogWrite(ledPin, MIN_LIGHT); 
    }
    }  
  }  
}

 

схему рисуйте, у меня третий глаз заболел - ничего не видит...

svm
Offline
Зарегистрирован: 06.11.2016

1 пищит при какой яркости - максимальная, промежуточная или минимальная? Зависит-ли частота писка от яркости?

2 Каковы мощности БП и нагрузки?

3 Одной индуктивности недостаточно частота ШИМ достаточно низкая - нужно еще и емкости по питанию ставить, в непосредственной близости от нагруки.

Гриша
Offline
Зарегистрирован: 27.04.2014

svm пишет:

1 пищит при какой яркости - максимальная, промежуточная или минимальная? Зависит-ли частота писка от яркости?

2 Каковы мощности БП и нагрузки?

3 Одной индуктивности недостаточно частота ШИМ достаточно низкая - нужно еще и емкости по питанию ставить, в непосредственной близости от нагруки.

пытаетесь угадать схему :))))))))) ну удачи, может повезет :)

про себя я в таких случаях говорю (если угадал) - у дураков мысли совпадают.... :)))))))))

svm
Offline
Зарегистрирован: 06.11.2016

Гриша пишет:

пытаетесь угадать схему :))))))))) ну удачи, может повезет :)

А что ее угадывать? По скетчу все видно - на 9 пин-мосфет, 10 пин следит за датчиком движения. К этому нет претезий. А вот качество блока  питания, вызывает подозрения. Или он на грани, по мощности, или просто сделан халтурно. И выходной дроссель работает в качестве динамика. Во втором случае можно еще бороться. А в первом-только менять.

b707
Offline
Зарегистрирован: 26.05.2017

FDV - пять лет ардуино занимаетесь, а не знаете что частоту ШИМ выбирать надо?
И никаких дросселей и кондеров ставить не нужно - этим вы только убьете регуляяцию. Просто выведите Шим за пределы звукового диапазона, это описано в куче статей в гугле

b707
Offline
Зарегистрирован: 26.05.2017

FDV, для Шим на пине 9 добавьте в setup() две следующие строчки:
TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;

Это для атмеги328. Если шум пропадет - с вас магарыч

svm
Offline
Зарегистрирован: 06.11.2016

b707 пишет:
FDV, для Шим на пине 9 добавьте в setup() две следующие строчки: TCCR1A = TCCR1A & 0xe0 | 1; TCCR1B = TCCR1B & 0xe0 | 0x09; Это для атмеги328. Если шум пропадет - с вас магарыч

Это если мы слышим частоту ШИМ, а если блок питания работает на грани срыва? ТС пока внятно не объяснил, что за шум и в каких случаях его бесит. Если шумит и при полной яркости, то ШИМ здесь ни при чем.

b707
Offline
Зарегистрирован: 26.05.2017

svm пишет:

b707 пишет:
FDV, для Шим на пине 9 добавьте в setup() две следующие строчки: TCCR1A = TCCR1A & 0xe0 | 1; TCCR1B = TCCR1B & 0xe0 | 0x09; Это для атмеги328. Если шум пропадет - с вас магарыч

Это если мы слышим частоту ШИМ, а если блок питания работает на грани срыва? ТС пока внятно не объяснил, что за шум и в каких случаях его бесит. Если шумит и при полной яркости, то ШИМ здесь ни при чем.


ну пусть попробует, две строчки в код добавить недолго. А вдруг повезет :) на кону 3 тыр

svm
Offline
Зарегистрирован: 06.11.2016

b707 пишет:
svm пишет:

b707 пишет:
FDV, для Шим на пине 9 добавьте в setup() две следующие строчки: TCCR1A = TCCR1A & 0xe0 | 1; TCCR1B = TCCR1B & 0xe0 | 0x09; Это для атмеги328. Если шум пропадет - с вас магарыч

Это если мы слышим частоту ШИМ, а если блок питания работает на грани срыва? ТС пока внятно не объяснил, что за шум и в каких случаях его бесит. Если шумит и при полной яркости, то ШИМ здесь ни при чем.

ну пусть попробует, две строчки в код добавить недолго. А вдруг повезет :) на кону 3 тыр

Я в чудеса не верю. Кому-то может и повезет (Шум от ШИМа, бесить небудет).

FDV
Offline
Зарегистрирован: 12.07.2014

Прошу прощения только добрался до форума.

Ардуино занимаюсь в свободные крохи времени, поэтому сложно над каждой задачей ломать голову месяцами (по 5 мин в неделю )) )

Блоки питания разные все, один от системника. Качество блока влияет только на громкость, нагрузки от 20 до 100Вт.

Шум слышен на промежуточных отрезках - при полном заполнении (100%) тишина. Как правильно заметили, это влияние на уровне частоты слышимости и решение дросселями с емкостями не спасет - эффект плавного включения и выключения пропадает (да и на 100 ватах страшновато индуктивностями баловаться)

"TCCR1A = TCCR1A & 0xe0 | 1; TCCR1B = TCCR1B & 0xe0 | 0x09;"

а для леонардо ? ;) - (есть только они и проверить проще всего на них)

и может есть что то подобное для esp8266?

b707
Offline
Зарегистрирован: 26.05.2017

Похоже не видать мне премии :) ТС получил ответ и пропал

FDV
Offline
Зарегистрирован: 12.07.2014

Где пропал? )))

Тут я, задал уточнение выше ;)

b707
Offline
Зарегистрирован: 26.05.2017

Сорри, не увидел. Конечно, для Леонардо и для Есп тоже есть подобное. Но вы в первом сообщении просили для про мини : то есть для атмеги328. А теперь по ходу меняете условия:)
Может попробуете вариант для обычной ардуины который я уже дал, чтоб понимать, пропадает шум или нет - и стоит ли для других МК подбирать?

FDV
Offline
Зарегистрирован: 12.07.2014

Моя вина - ошибся в названии. (для 328 решение я конечно сам видел, в инете полно) У меня про микро на леонардо, и необходимо найти решение именно для них (по всей кваритире навешаны) дороже менять получится

или для esp (их у меня 2 десятка)

b707
Offline
Зарегистрирован: 26.05.2017

FDV пишет:

Моя вина - ошибся в названии. (для 328 решение я конечно сам видел, в инете полно)

для леонардо точно так же в инете полно.

 

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

b707 пишет:
для Шим на пине 9 добавьте в setup()

Желательно ещё на транзисторы драйвер затвора сделать, если он отсутствует.

Простейший - взять 555й таймер (8ногую микросхему с цифрами 555 на корпусе), выводы 1, 2 - минус (общий), 8, 6 - плюс 12 В, 4й вывод вход (в PWM выход), 3й вывод через резистор 56 Ом на затвор. В непосредственной близости от микросхемы - керамический конденсатор 0.1 мкФ а лучше 1 мкФ.

analogWrite(ledPin, pwmLevel);

поменять на

analogWrite(ledPin, 255-pwmLevel);
FDV
Offline
Зарегистрирован: 12.07.2014

Нужно конечное решение с моим кодом, времени у самого реально нет разбираться ((

Нашел это: http://r6500.blogspot.com/2014/12/fast-pwm-on-arduino-leonardo.html может поможет )

взять оттуда то, что нужно и вставить в мой код

Магарыч ждет того, кто полноценно решит задачу - от слова не отказываюсь (не в обиду, но отсылок в интернет недостаточно)

FDV
Offline
Зарегистрирован: 12.07.2014

Спасиб, посмотрю что это такое "Простейший - взять 555й таймер "

пока непонятно чем он поможет..

b707
Offline
Зарегистрирован: 26.05.2017

Простите, но когда вы сначала типа "ошиблись в плате", а потом пропали на неделю, теперь как не особо хочется вам верить. И с одной стороны, вроде две строчки настройки таймера не стоят три тысячи, но с другой эту сумму предложили Вы сами, за язык никто не тянул. Так что как-то некрасиво выглядит и я лучше ограничусь отсылкой в инет.

FDV
Offline
Зарегистрирован: 12.07.2014

Я же писал, у меня проблема со временем, работы по горло. И не "типа" - я реально ошибся ))

Мне не жалко, но не за 2 строчки того что не нужно. Или вы ждете 3000 на те две строчки не к тому контроллеру....?  

Предлагаю вернуться к конструктивному обсуждению. Все уточнено, я даже нашел и дал ссылку на возможное решение.

Если решим задачу, за мной выполнение слова.

b707
Offline
Зарегистрирован: 26.05.2017

Ок, посмотрю ночью, если найду решение напишу

b707
Offline
Зарегистрирован: 26.05.2017

FDV - для пина 9 на Леонардо добавьте в Сетап:

TCCR1A=1;
TCCR1B=0x01|0x08; 
TCCR1C=0;

 

b707
Offline
Зарегистрирован: 26.05.2017

а на ЕСП8266 вообще все просто - для ЕСП есть готовая функция для настройки ШИМ

analogWriteFreq(31000);

диапазон допустимых частот - от 100 до 40000 Гц

FDV
Offline
Зарегистрирован: 12.07.2014

отлично, завтра проверю - отпишусь!

FDV
Offline
Зарегистрирован: 12.07.2014

ESP переклинило, нужно думать.....

Ардуина вроде перестала шуметь - проверил на малой нагрузке (раньше еле слышно но пищала, сейчас тихо), на большой проверю в ближайшие дни, нужно спаять дублер существующей - думаю заработает )))

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Чота непонятно, исключили блок питания? Он так то тоже имеет свойство при некоторых условиях хрипеть/свистеть/пердеть и т. п. Там такой звук, похожий чем-то на шарканье щёткой/тряпкой по листу металла.

FDV
Offline
Зарегистрирован: 12.07.2014

Да, проверял на нескольких разных БП. Звук - писк, громкость и частота напрямую зависят от уровня ШИМ.

FDV
Offline
Зарегистрирован: 12.07.2014

b707 пишет:

FDV - для пина 9 на Леонардо добавьте в Сетап:

TCCR1A=1;
TCCR1B=0x01|0x08; 
TCCR1C=0;

 

Короче на малой нагрузке и с простым БП в одной комнате перестал пищать - это радует!

На кухне стоит БП от компа и нагрузка побольше, писк слышен, но вроде потише.

А еще повысить частоту возможно? Кстати с этим кодом она какая?

Сам БП может уже уставший... пока нет замены, может на выхи заменю на новый.

С ESP при плавном разгорании вспышками и дергано нарастает, нужно разбираться

И еще - прошу номер карты в личку (или по номеру тел.) - слово держу ;)

b707
Offline
Зарегистрирован: 26.05.2017

FDV пишет:

Короче на малой нагрузке и с простым БП в одной комнате перестал пищать - это радует!
На кухне стоит БП от компа и нагрузка побольше, писк слышен, но вроде потише.
А еще повысить частоту возможно? Кстати с этим кодом она какая?

Скорее всего это означает, что писк не от ШИМ, поскольку с этими параметрами частота должна быть 62 КГц(при частоте такта 16 МГц) - много выше порога слышимости. Это максимум, выше поднять нельзя.

К сожалению, вживую проверить не могу, Леонардо под рукой нет.

 

FDV пишет:

С ESP при плавном разгорании вспышками и дергано нарастает, нужно разбираться

В работоспособности этой функции в ЕСП я не уверен, попробую сам потестировать, если получится - напишу.

FDV пишет:

И еще - прошу номер карты в личку (или по номеру тел.) - слово держу ;)

лички тут нет, можете написать мне на ded собака cur-ex.ru

b707
Offline
Зарегистрирован: 26.05.2017

Проверил осцилом установку частоты ШИМ на ЕСП8266 (NODEMCU v 0.9) функцией

analogWriteFreq(f);

при f от 1 КГц до 20 КГц частота меняется, цифры выше 20 КГц на моей плате не работают - просто игнорируются и все.

FDV
Offline
Зарегистрирован: 12.07.2014

Магарыч ушел b707 ;) прошу подтвердить получение.
Исследования продолжу в выходные!

b707
Offline
Зарегистрирован: 26.05.2017

FDV пишет:
Магарыч ушел b707 ;) прошу подтвердить получение. Исследования продолжу в выходные!

Полностью подтверждаю, FDV держит слово, респект!

 

FDV
Offline
Зарегистрирован: 12.07.2014

b707 пишет:

Проверил осцилом установку частоты ШИМ на ЕСП8266 (NODEMCU v 0.9) функцией

analogWriteFreq(f);

при f от 1 КГц до 20 КГц частота меняется, цифры выше 20 КГц на моей плате не работают - просто игнорируются и все.

 

Привет!

Перебрал все частоты до 20 000 - тот же эффект +\- яркость регулируется со скачками, свист коррелирует с яркостью. похоже эта настройка для аналогового пина esp

Я использую пины 4 и 5 - может на них не действует настройка шим...?

(у меня wemos d1 mini) разницы у них нет - все esp12e

FDV
Offline
Зарегистрирован: 12.07.2014

На всякий случай сам скетч

там 2 контура света и упревление включением БП. Яркость задается командой с сервера.

//блок с библиотеками 
#include <ESP8266WiFi.h>
#define MIN_LIGHT 0
#define MAX_LIGHT 1023
#define ledPinC 4                     //управл¤ющий пин мосфета холодный свет
#define ledPinH 5                     //управл¤ющий пин мосфета теплый свет
#define ledPinP 15                     //управл¤ющий пин мосфета бп

//блок с константами
const char* ssid = "Keenetic-2928"; //имя сети
const char* password = "9055090055";  //пароль сети
const char* host = "192.168.1.52";  //хост
const int httpPort = 80;

const String type="dligth";              //id устройства


int pwmLevelC=0;                      //значение ¤ркости холодного света
int pwmLevelH=0;                      //значение ¤ркости теплого света
int newLevelC=0;                      //значение ¤ркости холодного света
int newLevelH=0;                      //значение ¤ркости теплого света
static unsigned long time_fade;       //счетчик времени
static unsigned long time_fadeC;      //счетчик времени для холодного света
static unsigned long time_fadeH;      //счетчик времени для теплого света
static unsigned long time_fade_wifi;  //счетчик времени дл¤ wifi
bool flagC = 0;
bool flagH = 0;

WiFiServer server(80);


void setup() 
{
    pinMode(ledPinC, OUTPUT);  
    pinMode(ledPinH, OUTPUT); 
    pinMode(ledPinP, OUTPUT);  
    


    // We start by connecting to a WiFi network

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
  }

   // Start the server
  server.begin();
   sendMSG(type,"start");
}

void loop()
{
  if ( pwmLevelC > 0 && pwmLevelH > 0)
  {
 digitalWrite (ledPinP, HIGH);
  }

  if (  pwmLevelC == 0 && pwmLevelH  == 0)
  {
 digitalWrite (ledPinP, LOW);
  }

    ChangeLevelC(newLevelC);
    ChangeLevelH(newLevelH);   

    
// Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  // Wait until the client sends some data

  while(!client.available()){
    delay(1);
  }
  
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  WiFiPars(req);
  client.flush();

  // Send the response to the client
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");

delay(1);


  // The client will actually be disconnected 
  // when the function returns and 'client' object is detroyed
}
void WiFiPars(String request)
{
  // Match the request                               
  int pos_=request.indexOf('_');
  newLevelC=request.substring(0, pos_).toInt();
  newLevelH=request.substring(pos_+1).toInt(); 
}
/*функци¤ отправки сообщени¤ web-серверу*/
void sendMSG(String type,String value)
{   
      
  // Use WiFiClient class to create TCP connections
  
  WiFiClient client;
  if(!client.connect(host, httpPort)) 
  {
    return;
  }
  
  // We now create a URI for the request

  String url = "/ajax/ar.php";
  url += "?type=";
  url += type;
  url += "&val=";
  url += value;

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
 "Host: " + host + "\r\n" + 
"Connection: close\r\n\r\n");
  
  unsigned long timeout = millis();
  while(client.available() == 0) 
  {
    if (millis() - timeout > 5000) 
    {
      client.stop();
      return;
    }
  }
 
    // Read all the lines of the reply from server and print them to Serial
  
  while(client.available())
  {
    String line = client.readStringUntil('\r');
  } 

}


void ChangeLevelC(int new_value)
{
    if(new_value!=pwmLevelC)
  { 
    if(millis()>time_fadeC)
    {       
    if(new_value-pwmLevelC>0) 
    { 
      pwmLevelC++;
      pwmLevelC = constrain(pwmLevelC, MIN_LIGHT, MAX_LIGHT);
      analogWrite(ledPinC, pwmLevelC);  
      time_fadeC=millis()+3;
      flagC=1;
    }
    else
    {
      pwmLevelC--;
      pwmLevelC = constrain(pwmLevelC, MIN_LIGHT, MAX_LIGHT);
      analogWrite(ledPinC, pwmLevelC); 
      time_fadeC=millis()+3;
      flagC=0;                                              
    } 
    if(pwmLevelC==MAX_LIGHT && flagC==1)
    {
      analogWrite(ledPinC, MAX_LIGHT); 
    }
    if(pwmLevelC==MIN_LIGHT && flagC==0)
    {
      analogWrite(ledPinC, MIN_LIGHT); 
    }
    }  
  }  
}
void ChangeLevelH(int new_value)
{
    if(new_value!=pwmLevelH)
  { 
    if(millis()>time_fadeH)
    {       
    if(new_value-pwmLevelH>0) 
    { 
      pwmLevelH++;
      pwmLevelH = constrain(pwmLevelH, MIN_LIGHT, MAX_LIGHT);
      analogWrite(ledPinH, pwmLevelH);
      time_fadeH=millis()+3;
      flagH=1;
    }
    else
    {
      pwmLevelH--;
      pwmLevelH = constrain(pwmLevelH, MIN_LIGHT, MAX_LIGHT);
      analogWrite(ledPinH, pwmLevelH); 
      time_fadeH=millis()+3;
      flagH=0;          
    } 
    if(pwmLevelH==MAX_LIGHT && flagH==1)
    {
      analogWrite(ledPinH, MAX_LIGHT); 
    }
    if(pwmLevelH==MIN_LIGHT && flagH==0)
    {
      analogWrite(ledPinH, MIN_LIGHT); 
    }
    }  
  }  
}

 

b707
Offline
Зарегистрирован: 26.05.2017

FDV пишет:

На всякий случай сам скетч

FDV, не нашел в этом коде настройки частоты PWM