Почему зуммер мешает ШИМ?

Это код:

#define TMST A2 // Термистор
#define BZR 10  // Зуммер
#define FanP 11 // Вентилятор

void setup() {
  DDRD = B11000000;
  DDRB = B00001111;
  DDRC = B00000000;
  TCCR2B = TCCR2B & B11111000 | B00000101; // контакт 3 & 11 -> 245 Гц
  T0 = 25 + 273.15;
}

void loop() {
  if (hallState > magnetDistance) {
    PORTB &= ~(1 << 0); // манипулирование портом -> НИЗКИЙ
    strcpy(WPStatus, "OFF");
    if (Alarm == 1) { // это будет установлено в меню настроек
      if ((millis() - BZRT) > 500) {
        tone(BZR, 2300);
        BZRT = millis();
      }
      if ((millis() - BZRT) > 250) {
        noTone(BZR);
      }
    }
    else {
      noTone(BZR);
    }
  }
  else {
    PORTB |= (1 << 0); // манипулирование портом -> ВЫСОКИЙ
    noTone(BZR);
    strcpy(WPStatus, " ON");
  }

  if ((millis() - fanTimer) > 2000) { // каждые 2 секунды проверяет, изменилась ли температура
    Thermistor();
    if (TX <= 32) {
      analogWrite(FanP, 60); // Скорость вращения вентилятора
    }
    if (TX > 32 && TX <= 36) {
      analogWrite(FanP, 120);
    }
    if (TX > 36) {
      analogWrite(FanP, 255);
    }
    fanTimer = millis();
  }
}
float Thermistor() { // чтение и расчет с термистора
  VRT = analogRead(TMST);
  VRT = (5.00 / 1023.00) * VRT;
  VR = 5 - VRT;
  RT = VRT / (VR / 10000);
  ln = log(RT / 10000);
  TX = (1 / ((ln / 3977) + (1 / T0)));
  TX = TX - 273.15;
  return TX; // возвращаем температуру
}

Зуммер 5 В, подключенный к выводу ШИМ с резистором 100 Ом, термистор и вентилятор подключены к Arduino следующим образом:

схема

Почему при срабатывании зуммера вентилятор перестает вращаться?

, 👍-1

Обсуждение

У меня есть идея, почему, но из этого фрагмента кода я не могу быть уверен. Вам нужно опубликовать *весь* код, так как часть, которая скажет мне, прав ли я в своем предположении или нет, - это часть, которую вы заменили комментарием "// определенные переменные и прочее"., @Majenko

@Majenko, весь код слишком длинный, но я добавил ту часть, о которой вы упомянули., @ElectronSurf

Та. Кроме того, какой Arduino вы используете для этого?, @Majenko

@Маженко Ардуино УНО, @ElectronSurf

«Использование функции tone() будет мешать выходу ШИМ на контактах 3 и 11». https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/, @Juraj

контакт для тона () не обязательно должен быть штифтом pwm, @Juraj


1 ответ


Лучший ответ:

2

Команда tone() использует Timer2 для генерации прямоугольной волны (она запускает прерывание, которое переключает контакт ввода-вывода).

Однако Timer2 также используется для генерации ШИМ-сигнала на контактах 3 и 11.

Поэтому вы не можете одновременно использовать tone() и ШИМ на контактах 3 или 11.

Простое решение: используйте ШИМ от контактов 5, 6, 9 или 10 для управления вентилятором.

,

вопрос не по теме; поскольку я больше не могу использовать этот контакт, а другие контакты заняты, лучше ли использовать серию диодов для снижения скорости вращения вентилятора или подойдет резистор высокой мощности?, @ElectronSurf

Мощный резистор подойдёт. Это в основном то, что используется в сетевых вентиляторах с кнопками, которые меняют скорость., @Majenko

ты лучший., @ElectronSurf

@newbie, вы можете использовать контакт 10 для вентилятора и контакт 11 или любой другой контакт для тона (), @Juraj

@Juraj тогда мне придется переделывать всю печатную плату, я уже потратил почти 2 месяца на этот проект. достаточно. спасибо за предложение., @ElectronSurf

Если вы не возражаете против блокировки скетча во время воспроизведения тона, есть [TimerFreeTone](https://bitbucket.org/teckel12/arduino-timer-free-tone/wiki/Home), @Majenko

или вы можете изменить таймер, используемый библиотекой tone(), @Juraj