тестирование ADC Arduino MKR ZERO

Andrey2020
Offline
Зарегистрирован: 09.07.2020

Коллеги, ХЕЛППППП!!!!

Купил красивую маленькую плату 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 килогерц!!!

Вы серъёзно??????????????????????

ЭТО ЧТО БЛИН ЗА АЦППППППП??????????????????????

РЕБЯ ПОМОГИТЕ!!! МОЖЕТ ЧТО ТО НЕ ТО ДЕЛАЮЮЮЮЮ

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Подпишусь, пожалуй.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Надо смотреть на какую частоту настраивается АЦП по умолчанию для этой платы.

Andrey2020
Offline
Зарегистрирован: 09.07.2020

Komandir пишет:

Надо смотреть на какую частоту настраивается АЦП по умолчанию для этой платы.

А где это можно увидеть?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

В исходниках аддона

Bruzzer
Offline
Зарегистрирован: 17.03.2020

Andrey2020 пишет:

double t1;

double t2;

Лучше использовать unsigned long

svm
Offline
Зарегистрирован: 06.11.2016

А если замерить общее время за 1024 измерения, а потом разделить на 1024 и обращаться к АЦП напрямую без  AnalogRead(A0)  да еще в буфер не писать, может все не так грустно?

SLKH
Offline
Зарегистрирован: 17.08.2015

svm пишет:

А если замерить общее время за 1024 измерения, а потом разделить на 1024 и обращаться к АЦП напрямую без  AnalogRead(A0)  да еще в буфер не писать, может все не так грустно?

Там и TFM довольно интересный, про ADC в нем 29 страниц. 

В т.ч. при одном из режимов ацп сам 1024 отсчета просуммирует.

==========

840микросекунд тоесть почти 1 миллисекунда!!! ЭТО 1 килогерц!!!

==========

Max ADC Sampling Rate (ksps) 350

 

Andrey2020
Offline
Зарегистрирован: 09.07.2020

Вот в этом видео интурист хорошо рассказывает где находятся эти файлы:

 В папке ASF файлы с константами  (там можно прескалер адц найти итп) и в папке core файл wiring.c - в нем регистры и делитель 512...

Очень муторно и долго разбираться. Но придется... т.к. жалко плату - а я еще прикупил seeeduino samd21 это вообще малютка... придется попотеть с ADC

Andrey2020
Offline
Зарегистрирован: 09.07.2020
Andrey2020
Offline
Зарегистрирован: 09.07.2020

короче проблема решена. В дебуг файле wiring.c выяснилось что sample time регистр был установлен на максимум (0x3F) и также прескалер стоял на 512

В wiring я ничего не трогал просто в программу добавил следующее:

в начале

#include <SD.h> // для доступа к регистрам SAMD21

в void setup()

ADC->CTRLB.reg = ADC_CTRLB_PRESCALER_DIV128 |    // Прескаалер делитель 128
                   ADC_CTRLB_RESSEL_10BIT;         // 10 битное разрешение
ADC->SAMPCTRL.reg = 0x13;                        // Сэмплинг тайм
 // Осреденеие AVGCTRL
ADC->AVGCTRL.reg = ADC_AVGCTRL_SAMPLENUM_1 |    // 1 отсчёт (без оверсамплинга и осреднения)
                     ADC_AVGCTRL_ADJRES(0x0ul);   // Adjusting result by 0

после этих настроек тестирование показывает 100микросекунд

можно и меньше!!