Как создать короткий (0,5 мкс) электрический импульс (амплитуда 50 мВ)
Я работаю над детектором заряженных частиц, состоящим из пластикового сцинтиллятора и SiPM для создания электрического сигнала, и использую Arduino с АЦП для обнаружения этих импульсов.
Я хотел бы создать схему, которая могла бы эмулировать импульс от детектора дома, в то время как я оставляю детектор в лаборатории, пока разрабатываю осциллограф Arduino.
В идеале я хотел бы создать два импульса, как я описал в заголовке, с интервалом в 1-2 микросекунды между ними и иметь возможность изменять это время.
Создать периодический сигнал с этими свойствами достаточно просто, но как лучше всего создать всего один или два импульса?
@Milfod, 👍1
3 ответа
Если вам требуется управление синхронизацией примерно в 0,5 микросекунды, я думаю, этого можно добиться даже с помощью платы класса Arduino Uno, используя активное ожидание, как обсуждается на следующем веб-сайте. (Но на практике лучшим способом подтверждения будет мониторинг генерируемого импульса с помощью осциллографа.)
Ссылка: Очень короткие задержки — Форум Arduino
Что касается амплитуды 50 мВ, стандартные платы Arduino не имеют порта ЦАП (цифро-аналогового преобразователя), который мог бы управляться такими короткими импульсами, поэтому напрямую это может быть невозможно. Однако, если выходное сопротивление не имеет значения, можно понизить выходное напряжение 5 В до 50 мВ с помощью резистивного делителя напряжения (например, с коэффициентом 1/100). Если же сопротивление имеет значение, потребуется буферная схема, например, транзистор или операционный усилитель.
Надеюсь, это поможет!
Предполагая, что вы используете Arduino на базе AVR с частотой 16 МГц, вы можете добиться такого результата. коротких импульсов, если:
- Вы используете прямое управление портами
- Вы учитываете тот факт, что изменение выходных данных таким образом занимает два циклы ЦП
- Вы создаете задержки с помощью
_delay_us(), который объявлен в<util/delay.h> - вы отключаете прерывания во время импульсов
Вот пример функции, которая делает это на выводе 2 (PD2 на AVR микроконтроллер):
// Подаем импульс длительностью 0,5 мкс на вывод 2 = PD2.
void send_short_pulse()
{
noInterrupts();
PORTD |= _bit(PD2); // устанавливаем выход HIGH
_delay_us(0.375);
PORTD &= ~_bit(PD2); // устанавливаем выход в НИЗКИЙ уровень, это занимает 0,125 мкс
interrupts();
}
Как отметил Ацуши Ёкояма, вам придется настроить сигнал вне Arduino.
Если хотите упростить себе жизнь и избежать хлопот с управлением портами и т.п., используйте более продвинутую (32-битную) плату. Например, Arduino Nano 33 или Teensy4.
Также обратите внимание, что АЦП работают гораздо медленнее микросекунд, поэтому создать импульс легко, но обнаружить его сложнее. В Teensy есть быстрый компаратор, который, вероятно, справится с этой задачей. Это фантастический зверь, быстрее и дешевле, чем Nano33, насколько я знаю, и Пол Стоффегрен предлагает поддержку, так что вы не пожалеете, если решите пойти этим путём.
- Чтение линейного ПЗС-датчика TCD1304
- Создание синусоидальной волны с помощью ЦАП и ее обратная передача
- Если я уменьшу частоту дискретизации АЦП, получу ли я среднее значение за период времени?
- Использование MAX30100 для Arduino для чтения АЦП в формате (0-1023)
- Постоянный выход тактовой частоты Arduino
- Существуют ли библиотеки сглаживания сигналов для Arduino?
- Расширение аналоговых входов для Arduino
- ESP8266: system_adc_read_fast() всегда возвращает 1024
Этот ответ был бы более полным, если бы вы могли показать код, который создает импульс длительностью 0,5 мкс на любой из этих плат., @Edgar Bonet