тестирование ADC Arduino MKR ZERO
- Войдите на сайт для отправки комментариев
Коллеги, ХЕЛППППП!!!!
Купил красивую маленькую плату Arduino MKR Zero та что с SAMD21... 48MHZ
решил залить в неё мой скетч с FFT который я тестил на Arduino DUE
там данные вводятся в буфер с ADC с помощью AnalogRead(A0);
и что вы думаете - не тянет.. даже 500Герц...
Короче я смекнул что-то не так с производительностью ADC
написал такой скетч:
int check[1024];
double t1;
double t2;
int bufer[1024];
void setup(){
Serial.begin(115200);
}
void loop(){
for (int i=0; i<1024; i++){
t1=micros();
bufer[i]=analogRead(A0);
t2=micros();
check[i]=t2-t1;
}
for (int i=0; i<1024; i++){
Serial.println(check[i]);
}
}
тут короче длительность обработки ADC измеряется и записывается в буфер для каждого измерения из 1024
потом буфер выводится на печать..
И что я обнаружил!!!
840микросекунд тоесть почти 1 миллисекунда!!! ЭТО 1 килогерц!!!
Вы серъёзно??????????????????????
ЭТО ЧТО БЛИН ЗА АЦППППППП??????????????????????
РЕБЯ ПОМОГИТЕ!!! МОЖЕТ ЧТО ТО НЕ ТО ДЕЛАЮЮЮЮЮ
Подпишусь, пожалуй.
Надо смотреть на какую частоту настраивается АЦП по умолчанию для этой платы.
Надо смотреть на какую частоту настраивается АЦП по умолчанию для этой платы.
А где это можно увидеть?
В исходниках аддона
double t1;
double t2;
Лучше использовать unsigned long
А если замерить общее время за 1024 измерения, а потом разделить на 1024 и обращаться к АЦП напрямую без AnalogRead(A0) да еще в буфер не писать, может все не так грустно?
А если замерить общее время за 1024 измерения, а потом разделить на 1024 и обращаться к АЦП напрямую без AnalogRead(A0) да еще в буфер не писать, может все не так грустно?
Там и TFM довольно интересный, про ADC в нем 29 страниц.
В т.ч. при одном из режимов ацп сам 1024 отсчета просуммирует.
==========
840микросекунд тоесть почти 1 миллисекунда!!! ЭТО 1 килогерц!!!
==========
Max ADC Sampling Rate (ksps) 350
Вот в этом видео интурист хорошо рассказывает где находятся эти файлы:
В папке ASF файлы с константами (там можно прескалер адц найти итп) и в папке core файл wiring.c - в нем регистры и делитель 512...
Очень муторно и долго разбираться. Но придется... т.к. жалко плату - а я еще прикупил seeeduino samd21 это вообще малютка... придется попотеть с ADC
Видео забыл: https://www.youtube.com/watch?v=glulIeL2lxA
короче проблема решена. В дебуг файле wiring.c выяснилось что sample time регистр был установлен на максимум (0x3F) и также прескалер стоял на 512
В wiring я ничего не трогал просто в программу добавил следующее:
в начале
#include <SD.h> // для доступа к регистрам SAMD21
в void setup()
ADC_CTRLB_RESSEL_10BIT; // 10 битное разрешение
ADC->SAMPCTRL.reg = 0x13; // Сэмплинг тайм
ADC->AVGCTRL.reg = ADC_AVGCTRL_SAMPLENUM_1 | // 1 отсчёт (без оверсамплинга и осреднения)
ADC_AVGCTRL_ADJRES(0x0ul); // Adjusting result by 0
после этих настроек тестирование показывает 100микросекунд
можно и меньше!!