@redcircle

Как сделать частотный генератор на GPIO Arduino?

Нужно получить на Arduino (Leonardo-совместимый, ATmega32U4, 16МГц) на одном из пинов GPIO однородный сигнал с частотой 200 кГц. В идеале синусообразный, но подойдёт и квадратный.

Вижу 2 подхода:
1) Как-то запрограммировать системный таймер, чтобы он сам управлял GPIO (без обработки прерывания таймера). Этот подход мне больше всего нравится, но непонятно, можно ли так сделать.
2) Запрограммировать системный таймер, и подвеситься на его прерывание. В прерывании менять уровень сигнала на GPIO.

Возможен ли 1й подход?
Если нет, хватит ли скорости у процессора обработать всё в прерывании (2й подход)?
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
@vanyamba-electronics
Можно использовать таймер-счётчик в режиме CTC с переключением вывода OCnA по совпадению с регистром OCRnA. Для таймера-счётчика 1 Arduino Leonardo это вывод Digital 9.
#include <ve_avr.h>  // Используется библиотека VE_AVR

#define PIN_OC1A  9 // Пин Digital 9 - OC1A

void setup() {
  DEV_TIMER1.setWaveGenMode(TimerW::CTC_OCRA);
  DEV_TIMER1.setClockSelect(TimerW::Prescaler_1); // PR = 1
  DEV_TIMER1.setOutputCompareA(39);               // 16e6/(2*PR*(1+39)) = 200 kHz
  DEV_TIMER1.setCompOutModeA(TimerW::Toggle);
  pinMode(PIN_OC1A, OUTPUT);
}

void loop()
{
}

5c44dafd15cb8618166739.png
Библиотеку VE_AVR можно скачать здесь.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kotomyava
@kotomyava
Системный администратор
Т.к. DAC в этом камне нет, то можно реализовать это на PWM с дальнейшим сглаживанием.
PWM может работать автоматически после инициализации, без участия программы. Но чтобы получить сигнал определённой формы, придётся ему периодически менять значения. Т.е. потребуется пара таймеров, один для PWM, второй для шагов. Синус, и другие не линейные штуки, можно делать по заранее заготовленной таблице, обходя её циклически, экономя вычислительные ресурсы.

А вообще, function signal generator или waveform generator погуглить, реализаций много, в частности на AVR.

P.S. Если подойдёт просто меандр, то вообще достаточно одного таймера в режиме PWM.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы