2016-11-14 4 views
0

Например, если мне нужно установить частоту 100 Гц, я использовал функцию tone для установки частоты с использованием ШИМ. Теперь мне нужно изменить амплитуду от 0 до 5 вольт с помощью PWM. Можно ли использовать tone и analogWrite вместе для фиксации частоты i.e 100 Hertz и analogWrite для изменения амплитуды?Как изменить частоту и амплитуду одновременно?

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

+1

Привет Дэйв - пожалуйста, вы можете разместить код, который вы уже написали, так что мы можем помочь вам улучшить его? –

ответ

1

Вы не можете сделать это, используя функцию tone. Посмотрите на https://en.wikipedia.org/wiki/Pulse-width_modulation, чтобы получить представление о том, как генерируется «частота» с использованием PWM. Это изображение может быть полезно:

PWM waveform

Если вам действительно нужно иметь разные напряжения, вам нужно будет либо добавить внешние компоненты на выходной контакт (простой делитель напряжения, по крайней мере) или генерировать сигнал с использованием только analogWrite. Имейте в виду, что в последнем случае проблемы с сроками могут возникать в зависимости от сложности вашего кода.

+0

Я использую функцию тона, потому что она дает точную частоту 100 Гц и проверила осциллограф при постоянном напряжении батареи. В свое время аналоговая функция для изменения напряжения не работает, поскольку я уже изменил частоту. –

0

Редактировать

Вы рассмотрел digital potentiometer? После прочтения его описания, это в значительной степени соответствует вам.

[...] контролировать громкость на стерео [...]

Он действует совсем как обычный потенциометр, и я думаю, что он должен работать для вас.


Оригинальное сообщение

Ответ: нет, потому что tone будет выводить импульсы на заданной частоте, а затем analogWrite попросит булавку для вывода чего-то другого. Микроконтроллер может запутаться и, вероятно, не будет делать то, что вы хотите.

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

+0

Я уже использовал потенциометр для изменения напряжения, однако, я бы хотел контролировать его с помощью Arduino. Я ищу вариант, который может служить той же цели, что и механический потенциометр. –

+0

Да использовал цифровой потенциометр, потому что я требую почти 100 мА, выходной ток стеклоочистителя не превышает 25 мА. –

+0

OpAmp? Вы считали это? –

0

Вы можете

  1. использование analogWrite и выбросить функцию тон, имитируя поведение функции тона;
  2. использовать внешнюю цепь.

код, который может удовлетворить первое решение является

#define TONE_PERIOD 10 /* Period in milliseconds */ 
unsigned long lastPulseStart; 
byte volume; 

void setup() 
{ 
    volume = ...; 
    lastPulseChange = millis(); 
} 

void loop() 
{ 
    if (lastPulseStart - millis() < TONE_PERIOD/2) 
     analogWrite(pin, volume); 
    else if (lastPulseStart - millis() < TONE_PERIOD) 
     analogWrite(pin, 0); 
    else 
     lastPulseStart += TONE_PERIOD; 
} 

Для второго решения можно использовать два контакта, а затем использовать что-то смешивать выходы.Например,

  • порт AND (тон поступает на вход, analogWrite к другому, порт и порт должны быть перед фильтром);
  • буфер с разрешающим входом (тон переходит к разрешению, analogWrite к линии, это может быть до или после фильтра);
  • если вы используете усилитель, и он имеет контактный контакт, используйте его (конечно, тон переходит к разрешению, analogWrite к линии);
  • внешний АЦП (в этом случае вы будете использовать тон в качестве опорного напряжения, объем должен быть передан в качестве значения для АЦП);
  • Если вы подключили динамик непосредственно к выходу, вы можете отправить аналоговый выход на громкоговоритель и поместить NMOS на другой вывод динамика, управляемый выходным тоном.

Если вам нужны некоторые схемы просто спросить ..

+0

Мое требование состоит в том, чтобы зафиксировать частоту в 100 Herts и изменить напряжение от 0 до 5 вольт, сохраняя указанную выше частоту. Код, который вы упомянули для первого решения, будет служить моей цели, если да, то как? не могли бы вы рассказать немного? И для второго решения кажется интересным, можете ли вы отправить схему или схему для того же?. Я использую внешнюю батарею 5 вольт, а текущее требование - 250 мА. –

+0

Ну, тон представляет собой прямоугольную волну с частотой 100 Гц, поэтому каждые 5 мс он переключается с Vdd на GND. Если вместо использования фиксированного напряжения вы используете PWM, вам просто нужно включить и выключить его. Однако будьте осторожны, что analogWrite выводит волну PWM, т. Е. Квадратную волну с частотой около 500 или 1000 Гц, а не фиксированное значение. Вам придется сгладить это с помощью фильтра (но 100 Гц немного слишком близко). Что касается схем, мне нужно еще немного времени. Может быть, этим вечером я смогу что-то нарисовать и добавить его к ответу. – frarugi87

+0

Спасибо за ваш ответ. Да, я знаю, что, поскольку мы не предоставляем фиксированное напряжение, мы пытаясь изменить с помощью PWM, мое единственное сомнение заключается в том, что мы установили частоту 100 Гц и снова изменив напряжение с помощью PWM (500 - 1000 Гц), это повлияет на постоянную частоту 100 герц? В любом случае я попытаюсь реализовать код и будет проверять осциллограф на то же самое. Поскольку мне нужно иметь 100 герц при каждом напряжении от 0 до 5 В. –

Смежные вопросы