Программный шлюз на порту ШИМ

Я использую порт ШИМ и вывожу частоту. Можно ли с помощью программного обеспечения подать импульс на порт ШИМ для имитации импульсного затвора. Например, я хотел бы вывести частоту 111 Гц, но хотел бы стробировать эту частоту на 0,5-7 Гц. Возможно ли это сделать полностью программно без внешнего оборудования. Я использую плату Teensy, которая похожа на Arduino, но имеет 3 независимых порта ШИМ. Есть идеи, возможно ли это?

, 👍1

Обсуждение

ШИМ не для вывода разных частот, а для вывода прямоугольного сигнала фиксированной частоты с разными скважностями. И не ясно, что вы имеете в виду под "gate that freq at .5-7hz" Чего именно вы пытаетесь добиться?, @chrisl

Вы можете использовать один таймер для 111 Гц и другой таймер с прерыванием. В прерывании включайте и выключайте другой таймер. Можно даже использовать tone() для 111 Гц и millis() в loop(), чтобы создать эти 0,5–7 Гц. Можете ли вы объяснить, для чего это нужно? Это модулированные 111 Гц? Насколько точным это должно быть?, @Jot

Да, я полностью понимаю, что делает порт ШИМ и как он работает, и использую его уже много лет =) Я пытаюсь добиться того, как изменить форму частоты, добавив управляемый затвор на порт ШИМ в программном обеспечении. Я могу сделать это, выведя частоту ШИМ на коллектор транзистора 2N3904 и управляя базой транзистора с другим ШИМ, действующим на частоту затвора, а эмиттер будет иметь новую сформированную частоту, что, кажется, работает, но хотелось бы сделать все это в программном обеспечении, используя таймер на порту ШИМ. Возможно ли это?, @Wildview

Кстати, это для схемы настройки мозга, которую я создаю. Мозг стимулируется на частотах 111 Гц и 1110 Гц, но небольшая пульсация частоты с помощью управляемого затвора изменит форму, чтобы создать различные типы режимов стимуляции. Это то, чего я пытаюсь добиться, используя затвор частоты на порту ШИМ. Точность должна быть максимально близкой. После создания формы волны она будет пропущена через другую схему, которая включает трансформатор для создания конечного выходного сигнала. Если я смогу сделать стробирование в программном обеспечении, это будет действительно круто =) Спасибо за вашу помощь., @Wildview

Jot 23, знаете ли вы какие-либо хорошие примеры кода, использующие прерывание таймера на порту ШИМ, чтобы добиться того, что я ищу? В настоящее время у меня есть 2 порта ШИМ, один из которых работает на частоте 111 Гц, а другой — на частоте 1110 Гц, и к обоим нужно применить управляемый вентиль от 5 до 7 Гц. Если прерывание таймера будет достаточно быстрым, чтобы работать, это было бы здорово, так как я хотел бы сделать все это программно, если это возможно. Теоретически это должно работать. Teensy v3.2 — быстрый процессор., @Wildview


1 ответ


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

1

Если вы можете настроить ШИМ на частоту 111 Гц (я не знаю, как это делается на Teensy), то «запуск» его так же прост, как поворот включение и выключение ШИМ на нужной частоте:

uint32_t half_period;  // половина периода стробирования в микросекундах

void set_gate_frequency(float freq_in_hz)
{
    half_period = (1e6 / 2) / freq_in_hz;
}

void loop()
{
    static uint32_t last_toggle = 0;
    static bool pwm_is_on = false;
    if (micros() - last_toggle >= half_period) {
        if (pwm_is_on) {
            digitalWrite(PWM_PIN, LOW);
            pwm_is_on = false;
        } else {
            analogWrite(PWM_PIN, 128);  // ШИМ с 50% рабочим циклом
            pwm_is_on = true;
        }
        last_toggle += half_period;
    }
}
,

Спасибо, я попробую. Я предполагаю, что это также можно поместить в процедуру прерывания таймера, это верно? Так что я могу отделить это от функции цикла. Для справки: вот как можно настроить порт ШИМ на вывод частоты в Teensy. analogWriteResolution(8); // разрешение 187500 Гц analogWriteFrequency(pwmPin,FreqHz); analogWrite(pwmPin,dutyCycle);, @Wildview

@Wildview: Да, вы можете использовать прерывание. Однако для таких низких частот вам это не нужно. Выполнение этого в loop() должно работать так же хорошо, и вы можете добавить все, что захотите, в тот же loop(). То есть, это будет работать хорошо, если вы не сделаете что-то неправильно, например, не используете delay()..., @Edgar Bonet

Спасибо. Я заметил, глядя на форму сигнала, запущенную в вашем примере. Частота не меняется даже при частоте затвора 50 Гц. Похоже, digitalWrite не работает правильно, чтобы установить низкий уровень на выводе. Если я изменил digitalWrite на analogWrite(PWM_PIN_PIN, 0), то теперь он выглядит так, будто пульсирует. У меня есть подтяжка 1K на этом порту. Имеет ли analogWrite(PWM_PIN_PIN, 0) тот же эффект, что и digitalWrite?, @Wildview

В ядре AVR digitalWrite() отключает любой текущий ШИМ. Может быть, на Teensy он этого не делает, я не знаю. analogWrite(PWM_PIN, 0) должен делать то же самое. Если он работает у вас, оставьте его., @Edgar Bonet