Почему зуммер мешает ШИМ?
Это код:
#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 следующим образом:
Почему при срабатывании зуммера вентилятор перестает вращаться?
@ElectronSurf, 👍-1
Обсуждение1 ответ
Лучший ответ:
Команда 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
- Не выходит из цикла for
- Установите частоту ШИМ на 25 кГц.
- Какова частота PWM-выхода на Arduino
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Генерация частоты ШИМ выше 125 кГц с помощью Arduino Uno
- Увеличить разрядность PWM
- Как вывести истинное аналоговое напряжение на выходной контакт
У меня есть идея, почему, но из этого фрагмента кода я не могу быть уверен. Вам нужно опубликовать *весь* код, так как часть, которая скажет мне, прав ли я в своем предположении или нет, - это часть, которую вы заменили комментарием "// определенные переменные и прочее"., @Majenko
@Majenko, весь код слишком длинный, но я добавил ту часть, о которой вы упомянули., @ElectronSurf
Та. Кроме того, какой Arduino вы используете для этого?, @Majenko
@Маженко Ардуино УНО, @ElectronSurf
«Использование функции tone() будет мешать выходу ШИМ на контактах 3 и 11». https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/, @Juraj
контакт для тона () не обязательно должен быть штифтом pwm, @Juraj