какова будет частота дискретизации моего кода Arduino Mega 2560. Как бы я вычислил это?
void setup() {
// initialize the serial communication:
Serial.begin(9600);
pinMode(10, INPUT); // Setup for leads off detection LO +
pinMode(11, INPUT); // Setup for leads off detection LO -
}
void loop() {
if ((digitalRead(10) == 1) || (digitalRead(11) == 1)) {
Serial.println('!');
}
else {
// send the value of analog input 0:
Serial.println(analogRead(A0));
}
//Wait for a bit to keep serial data from saturating
delay(1);
}
Дополнение
Этот скетч предназначен для построения необработанного сигнала ЭКГ со скоростью передачи 9600 бод. Но когда я использую эти данные для расчета частоты сердечных сокращений, мне нужна частота дискретизации для расчета, но я не получаю значение по этому скетчу. Как я буду рассчитывать частоту из поступающих необработанных данных? Поскольку он не показывает четкой картины.
@MANISHA KUMARI, 👍1
2 ответа
Частота выборки рассчитывается по количеству выборок за раз. Я думаю, вам нужно знать, как быстро вы можете сделать это в своем loop()
.
Для этого вы можете получить время начала, сделать несколько выборок, получить время окончания и рассчитать частоту.
Это прямой и простой способ.
Обратите внимание, что время обработки скетча будет включать время передачи результата. Это будет намного дольше, чем время "чистого" аналогового преобразования.
В качестве альтернативы вы можете найти исходный код библиотечной функции Arduino для analogRead()
, получить техническое описание, узнать, как работает преобразование, и рассчитать время.
Но это совсем не просто.
Кстати, delay(1)
далеко не достаточно, чтобы «насытить» вашу последовательную передачу. Вы используете скорость 9600 бод, что дает около 960 символов в секунду. Самое большое число, которое вы отправляете, это "1023", а последовательность "\r\n" добавляется из-за println()
. Таким образом, вы передаете 6 символов, для которых требуется 6 символов / 960 символов/с = 0,00625 с. Это немного больше, чем 6 мс, поэтому вы должны использовать как минимум delay(7)
.
Если вы этого не сделаете, вызов println()
вызовет задержку, если буфер передатчика заполнится. Поэтому ваш скетч все равно будет ждать. Поэтому вы можете рассмотреть возможность удаления задержки.
И, пожалуйста, используйте правильное форматирование в следующий раз. ;-)
На Arduino Mega АЦП работает на частоте F_CPU
/128 =
125 кГц (период= 8 мкс). Кроме самого первого,
каждое преобразование АЦП занимает 13 тактовых циклов АЦП, т. е. 104 мкс. Если
вы запускаете analogRead()
в замкнутом цикле, например
for (;;)
analogRead(A0);
процессор должен выполнять некоторую работу между преобразованиями, а поскольку АЦП всегда начинает с ожидания нарастающего фронта тактового сигнала АЦП. потерять по крайней мере один полный цикл АЦП между преобразованиями. Ты тогда получить одно преобразование каждые 14 циклов АЦП, что приводит к выборке периодом 112 мкс и соответствующей частотой дискретизации около 8,93 кГц.
Показанный вами код делает немного больше, чем analogRead()
на
итерация: два digitalRead()
, тест и Serial.println()
, которые
включает двоичное преобразование в десятичное. Я не уверен, что процессор будет
способен справиться со всем этим всего за 8 мкс. Вы можете в конечном итоге использовать
15 тактов АЦП на итерацию (13 на преобразование,
2 для вычислений), что даст 120 мкс
(8,33 кГц) период дискретизации. Может быть, даже больше. Вам придется протестировать
если хочешь знать наверняка. Период выборки даже не гарантируется
быть постоянным: код будет выполняться дольше, когда он
прерывается прерыванием таймера, которое ядро Arduino использует для
хронометраж...
Все это применимо до тех пор, пока буфер последовательного вывода не заполнен. Один раз
у вас есть 64 байта, ожидающих отправки, буфер будет заполнен, и
Serial.println()
начнет задерживать вывод, эффективно
дросселирование вашего цикла до скорости последовательного соединения. ср
ответ busbee для деталей. Обратите внимание, что период выборки
все еще не постоянна, так как отправка числа от 1 до 4 цифр через последовательный
порт может занять от 3,125 до 6,25 мс.
Если вам нужен постоянный период выборки, вы должны контролировать время сами. Простой пример:
const uint32_t SAMPLING_PERIOD = 6500; // 6,5 мс
void loop() {
static uint32_t last_sample;
if (micros() - last_sample >= SAMPLING_PERIOD) {
last_sample += SAMPLING_PERIOD;
Serial.println(analogRead(A0));
}
}
Вы могли бы работать быстрее с более высокой скоростью передачи данных, но вы всегда должны
SAMPLING_PERIOD
соответствует выбранной вами скорости передачи данных. Код выше
будет по-прежнему производить некоторый джиттер в выборке, в основном из-за таймера
прерывать. Если это неприемлемо для вашего приложения, у вас будет
прочитать техническое описание микроконтроллера и узнать, как установить
АЦП должен «автоматически запускаться» по таймеру.
- Arduino с 12-битным ЦАП (MCP4725) не работает
- Странное явление с avrdude: stk500v2_ReceiveMessage(): таймаут только с ATmega250 на windows 7x64
- Проанализировать большой ответ json с помощью ESP8266
- Сбой Arduino во время последовательной печати без очевидной причины
- Будет ли адаптер питания 12В постоянного тока, 1А подавать слишком большую мощность и повредит Arduino Mega 2560?
- Как запрограммировать Robotdyn Mega 2560 PRO MINI?
- Отключите автоматический сброс Mega 2560 на последовательном мониторе, открытом с помощью резистора 60 Ом.
- Использование модуля Bluetooth HC-08 с arduino
СПАСИБО... Но ответа я так и не получил. Я хочу рассчитать частоту дискретизации методом расчета, а не просто грубой идеей. Так что, если у вас есть лучший метод, пожалуйста, поделитесь со мной. Спасибо, @MANISHA KUMARI
Ну, мой ответ нацелен на аспекты реального мира. Подробную альтернативу см. в ответе @EdgarBonet. Моя подсказка во второй части — это просто указатель для начала. -- Непонятно, для какой ситуации нужно знать частоту. Вы должны уточнить этот вопрос в своем вопросе. Как написано в вашем скетче, частота определяется последовательной передачей, а не самой выборкой., @the busybee