Разгоняем Ардуину !
Oct. 15th, 2014 04:31 pmВсё хорошо в этой железяке, только вот иногда встречаются задачки, которые не имеют простого решения.
Нужно оцифровать сигнал с микрофона. На первый взгляд - гавновопрос !
Пишем val=analogRead(1);
Только вот, даже если процессор ничего больше не делает, скорость выполнения этой команды через стандартную библиотеку составляет каких-то 8кГц.

По теореме Котельникова "частота дискретизации должна минимум в два раза превышать частоту обрабатываемого сигнала", т.е. мы можем оцифровать максимум до 4кГц. Этого мало даже для речевого сигнала :-(
Если нам нужно сделать БПФ (быстрое преобразование Фурье) и получить спектр звукового сигнала, то необходимо минимум 44кГц частоты дискретизации.
Нарыл в интернете подобную проблемку. Умные люди придумали такую штуку:
#define FASTADC 1 // defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
void setup() {
long int start ;
long int i ;
#if FASTADC // set prescale to 16
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
#endif
Serial.begin(9600) ;
Serial.print("ADCTEST: ") ;
start = millis() ;
for (i = 0 ; i < 61500 ; i++) analogRead(1) ;
Serial.print(millis() - start) ;
Serial.println(" msec (61500 calls)") ;
}
void loop() {
}
В результате получаем увеличения быстродействия примерно в 8 раз.

60кГц - это более чем достаточно, можно будет ещё и математикой заниматься в промежутках между чтением АЦП. Вот ссылочка на статейку про ускорение ввода-вывода на микроконтроллерах AVR: http://habrahabr.ru/post/141442/
только вот пока не могу разобраться, как это работает :-)))
Нужно оцифровать сигнал с микрофона. На первый взгляд - гавновопрос !
Пишем val=analogRead(1);
Только вот, даже если процессор ничего больше не делает, скорость выполнения этой команды через стандартную библиотеку составляет каких-то 8кГц.

По теореме Котельникова "частота дискретизации должна минимум в два раза превышать частоту обрабатываемого сигнала", т.е. мы можем оцифровать максимум до 4кГц. Этого мало даже для речевого сигнала :-(
Если нам нужно сделать БПФ (быстрое преобразование Фурье) и получить спектр звукового сигнала, то необходимо минимум 44кГц частоты дискретизации.
Нарыл в интернете подобную проблемку. Умные люди придумали такую штуку:
#define FASTADC 1 // defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
void setup() {
long int start ;
long int i ;
#if FASTADC // set prescale to 16
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
#endif
Serial.begin(9600) ;
Serial.print("ADCTEST: ") ;
start = millis() ;
for (i = 0 ; i < 61500 ; i++) analogRead(1) ;
Serial.print(millis() - start) ;
Serial.println(" msec (61500 calls)") ;
}
void loop() {
}
В результате получаем увеличения быстродействия примерно в 8 раз.

60кГц - это более чем достаточно, можно будет ещё и математикой заниматься в промежутках между чтением АЦП. Вот ссылочка на статейку про ускорение ввода-вывода на микроконтроллерах AVR: http://habrahabr.ru/post/141442/
только вот пока не могу разобраться, как это работает :-)))
no subject
Date: 2014-10-15 05:22 pm (UTC)#define FASTADC 1 // defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
Ðак ÑÑо ÑабоÑÐ°ÐµÑ Ð¸ заÑем они вообÑе нÑÐ¶Ð½Ñ ?
ÐоÑÐµÐ¼Ñ Ð±Ñло не напиÑаÑÑ Ð² понÑÑном виде, Ñипа:
http://www.arduino.cc/en/Reference/PortManipulation-
no subject
Date: 2014-10-15 05:27 pm (UTC)#define cbi - clear bit register
#define sbi - set bit register
ÑÑо (Ñамо по Ñебе) не ÑабоÑаеÑ, ÑÑо ÑÑÐ¾Ð±Ñ Ð² коде ÑÑи макÑоÑÑ Ð¸ÑполÑзоваÑÑ
no subject
Date: 2014-10-15 05:31 pm (UTC)no subject
Date: 2014-10-15 08:07 pm (UTC)for (i = 0 ; i < 61500 ; i++) analogRead(1) ;
ÐопÑобовал вÑÑÑоиÑÑ ÑÑÐ¾Ñ Ð½ÐµÐ¿Ð¾Ð½ÑÑнÑй код в ÑÐ²Ð¾Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ - заÑабоÑало :-)
ÐолÑÑилоÑÑ 50кÐÑ. Ðо как ÑÑо ÑабоÑÐ°ÐµÑ Ñ Ð½Ðµ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ñ :-(
ÐÐ¾Ñ ÑекÑÑ Ð¿ÑогÑаммÑ: http://pastebin.com/aBqJWAVU
no subject
Date: 2014-10-15 08:43 pm (UTC)еÑли Ð»ÐµÐ½Ñ - ÑÑÑ.256 - заÑем нÑжен ADSC и 257 - prescaler (делиÑÐµÐ»Ñ ÑиÑÑем клока).
еÑли и ÑÑо Ð»ÐµÐ½Ñ - https://code.google.com/p/arduino/source/browse/trunk/hardware/arduino/cores/arduino/wiring_analog.c :
64. while (bit_is_set(ADCSRA, ADSC)); // Ñем бÑÑÑÑее клокаем ADC, Ñем бÑÑÑÑее нам оÑдаÑÑ ÑезÑлÑÑаÑ
no subject
Date: 2014-10-15 09:04 pm (UTC)Ñак ÑÑо лаба по ÑлекÑÑонике или по c++?
no subject
Date: 2014-10-15 10:20 pm (UTC):-)))
ХоÑÑ Ð·Ð°Ð²ÑÑа ÑÑо-нибÑÐ´Ñ "ÑгÑабиÑÑ" Ñ Ð³ÐµÐ½ÐµÑаÑоÑа, пÑÑÑÑ ÑÑÑденÑÑ ÑнаÑала поÑÑÑоÑÑ Ñигнал в EXELе, а поÑом пÑеобÑазование ФÑÑÑе вÑÑÑнÑÑ Ð¸ полÑÑим ÑпекÑÑ Ñигнала, на ÑледÑÑÑем занÑÑии воплоÑим маÑемаÑÐ¸ÐºÑ Ð² конÑÑолеÑе, а поÑом бÑдем "опознаваÑÑ" ÑпекÑÑ Ð²Ð¾ Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¼ Ñигнале и "ÑеагиÑоваÑÑ" на него.
ÐÑÑÐ³Ð°Ñ Ð´Ð¸ÑÑиплина Ñ Ð¼ÐµÐ½Ñ - "Ð¡Ñ ÐµÐ¼Ð¾ÑÐµÑ Ð½Ð¸ÑеÑкое пÑоекÑиÑование ÐС" , Ñам Ñоже пÑÑаÑÑÑ Ñе же лабоÑаÑоÑки пÑидÑмаÑÑ, ÑолÑко задаÑи дÑÑгие.
ÐÑÑÑ Ñ Ð¼ÐµÐ½Ñ ÐµÑÑ "ÐонÑÑÑÑиÑование ÐС на базе ÐÐС" Ð¸Ñ Ñоже поÑÑепенно Ð¿Ð¾Ð´Ð²Ð¾Ð¶Ñ Ðº ÑомÑ, ÑÑÐ¾Ð±Ñ Ð¼Ð½Ðµ бÑло полегÑе занимаÑÑÑÑ Ñ Ð½Ð¸Ð¼Ð¸ вÑеми.
Ð "ÐнÑоÑмаÑионнÑе ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸Ð¸" и "ÐнÑоÑмаÑика" Ñ Ð²ÐµÑеÑников - Ñам С++
no subject
Date: 2014-10-15 11:21 pm (UTC)еÑли ÑÑда же Ð¿Ð¸Ñ Ð°ÑÑ Ð¸ маÑемаÑикÑ, Ñогда надо делаÑÑ Ð°Ñп аÑÐ¸Ð½Ñ ÑоннÑм - ÑнимаÑÑ Ð¸Ð·Ð¼ÐµÑÐµÐ½Ð¸Ñ Ð¿Ð¾ пÑеÑÑваниÑм, а обÑабаÑÑваÑÑ Ð² оÑновном Ñикле. инаÑе вон ÑÐ¾Ñ Ñикл Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ ÑÑаÑиÑÑÑ Ð²Ð¿ÑÑÑÑÑ.
пÑо c++ ÑпÑоÑил из-за Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¿Ð°ÑÑÑ
no subject
Date: 2014-10-16 06:34 am (UTC)Ðа, ÑÑо бÑÐ´ÐµÑ Ð¾Ð±ÑзаÑелÑно. Ð ÑабоÑÑ Ð¿Ð¾ пÑеÑÑваниÑм Ñоже планиÑÑÑ.
РабоÑа болÑÑÐ°Ñ Ð¿Ð¾Ð»ÑÑаеÑÑÑ, бÑдем по ÑаÑÑÑм делаÑÑ.
делиÑÐµÐ»Ñ ÑиÑÑем клока
Date: 2014-10-15 10:20 pm (UTC)ÑÑÑ.247 , полÑÑаеÑÑÑ, ÑÑо поÑÑÑÐ°Ð´Ð°ÐµÑ ÐºÐ°ÑеÑÑво пÑеобÑазованиÑ.
By default, the successive approximation circuitry requires an input clock frequency between
50kHz and 200kHz to get maximum resolution. If a lower resolution than 10 bits is needed, the
input clock frequency to the ADC can be higher than 200kHz to get a higher sample rate.
The ADC module contains a prescaler, which generates an acceptable ADC clock frequency
from any CPU frequency above 100kHz. The prescaling is set by the ADPS bits in ADCSRA.
The prescaler starts counting from the moment the ADC is switched on by setting the ADEN bit
in ADCSRA. The prescaler keeps running for as long as the ADEN bit is set, and is continuously
reset when ADEN is low.
When initiating a single ended conversion by setting the ADSC bit in ADCSRA, the conversion
starts at the following rising edge of the ADC clock cycle.
A normal conversion takes 13 ADC clock cycles. The first conversion after the ADC is switched
on (ADEN in ADCSRA is set) takes 25 ADC clock cycles in order to initialize the analog circuitry.
When the bandgap reference voltage is used as input to the ADC, it will take a certain time for
the voltage to stabilize. If not stabilized, the first value read after the first conversion may be
wrong.
Re: делиÑÐµÐ»Ñ ÑиÑÑем клока
Date: 2014-10-15 11:23 pm (UTC)