19.09.2013, 22:21
|
|
Частый гость
Регистрация: 07.03.2011
Сообщений: 38
Сказал спасибо: 1
Сказали Спасибо 19 раз(а) в 16 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Цитата:
|
а второго - 70...80, то после случайного прерывания "усредненные" данные резко изменятся с 45 на 75...
|
хи-хи... двойной буфер и такие всплески это смешно...
скользящее окно == непрерывный стек == непрерывное среднее
взводим стек первыми 10 значениями:
сумма_a=a1+a2+a3+a4+a5+a6+a7+a8+a9+a10
среднее = сумма_a/10
+1 выборка == а11
сумма_а = сумма_а+а11-а1
среднее = сумма_a/10
аналогично если у вас не +1 а +N выборок -- прибавляете новые и вычитаете старые
единственное условие что требуется это чтобы -- размер выборки по которой считаете среднее было больше... как там для восстановления по Котельникову == в два раза больше чем добавляемых новых...
Автору надо определиться ему среднее нужно НЕПРЕРЫВНО или только когда СПРОСИТ основной цикл...
грубо говоря -- у него индикатор или регистратор
разница в том что регистратор ДОЛЖЕН точно в в заданые интервалы что-то регистрировать -- а подпрограмма усредняющая и индицирующая и тд -- будет с обязана уложится между тактами регистрации...
А индикатор должен по запросу дать последнее значение (среднее последних ххх значений), при этом что он прое.. пропустит значения пока будет считать средние -- это не важно.
с индикатором логика работы с ДМА и кольцевым буфером все очевидно --
включаем ДМА и до окончания первого заполнения буфера == индикатор == показывает 0 и никто не имеет права прервать заполнение, после заполнения буфера следующий такт идет БЕЗ очистки от предыдущих значений == и разрешены в любой момент прерывания от любой программы -- О запрос! ДМА остановилось, в нем лежат последние N отсчетов (кольцо).
Все пока шло усреднение-индикация забыли про входные отсчеты закончили усреднять индицировать == ОБНУЛИЛИ буфер и опять пока заполняем буфер новыми значениями == все в сад, после взвода опять готовы...
Для регистратора -- главное подобрать так чтобы любая обработка усреднение-индикация ГАРАНТИРОВАНО укладывалась между тактами оцифровки.
Если такты "усреднения" и "оцифровки" будут пересекаться друг с другом -- то у вас и "среднее" будет с ошибкой и пропущеные такты оцифровки будут вносить ошибку...
|
|
|
|
19.09.2013, 22:43
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Что я хочу получить от этого всего - в любой момент, в основном цикле программы, я мог бы обратится к определенной ячейке массива и узнать значение аналогового сигнала. Без необходимости запуска преобразования, подсчета среднего.
Получается мне нужен индикатор.
Сейчас я запускаю преобразование, при заполнении буфера в прерывании ПДП я выставляю флаг и выключаю прерывания ПДП. В основном цикле смотрю этот флаг, если он установлен - начинаю обработку полученного массива 1 с перезаписью результата в массив 2.
После обработки устанавливаю флаг - "готовности данных" и читаю его в основном цикле. После чтения результата - включаю опять прерывания от ПДП.
Вызывать подпрограмму усреднения из прерывания ПДП не получается, т.к. на это уходит много времени. По нормальному только с флагом...
В массиве 1 у меня получается 7 каналов расположены друг за другом. И таких выборок 700 штук. Нахожу среднее для каждого из каналов полностью прохождением всего массиву. Т.е. для всех каналов массив 1 проходится 7 раз с шагом 7.
Gaaaaaad попробую переписать так как Вы написали.
Это получается кольцевой буфер, в котором прибавляя а11 мы вычитаем а1, а прибавляя а12 - вычитаем уже а2, сдвигаем все элементы на один влево, правильно я понял нахождение среднего?
Последний раз редактировалось swat24; 19.09.2013 в 22:58.
|
|
|
|
20.09.2013, 20:55
|
|
Частый гость
Регистрация: 07.03.2011
Сообщений: 38
Сказал спасибо: 1
Сказали Спасибо 19 раз(а) в 16 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от swat24
|
Gaaaaaad попробую переписать так как Вы написали.
Это получается кольцевой буфер, в котором прибавляя а11 мы вычитаем а1, а прибавляя а12 - вычитаем уже а2, сдвигаем все элементы на один влево, правильно я понял нахождение среднего?
|
вроде да...
Только вот по 100 семплов на канал это ни туды ни сюды... уже или 64 или 128 ![Улыбка](images/smilies/icon_smile.gif) а то не по хардкодингу получается
вычисление среднего в таком случае будет просто сдвигом вместо деления...
Ну и весь цикл думаю легко укладывается без проблем с доступом
выделяете массив [129 7] для исходных данных, указатель i=от 1 до 128 для запоминания текущего положения и семь "сумм" крупнее размером (в битах ![Улыбка](images/smilies/icon_smile.gif) )
по прерыванию ДМА заполняет всегда 0 ряд, потом вычитаем из "сумм" значения находящиеся по i-индексу, прибавляем из 0 ряда, и записываем по i-индексу значениями из 0 ряда. == думаю 14 арифметических операций и 7 копирований проблем не вызовут и гарантировано уложатся между вызовами прерывания АЦП.
Ну и конечно наращиваем i на единицу убеждаясь что она не стала больше 129
а да последнее 7 volatile переменным присваиваете значение со сдвигом из "сумм" таким образом без разницы когда вы их запросите снаружи -- у этих переменных значение будет меняться одной единственной "атомной" операцией... гарантировано не вызывая конфликтов на уровне железа...
|
|
|
|
20.09.2013, 23:16
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Gaaaaaad, спасибо за разъяснение ![Улыбка](images/smilies/icon_smile.gif)
на счет сдвига и операции деления.
Сегодня решил сократить время обработки массива - отказом от деления. Все переписал, выбирал 128 семплов на каждый канал, сдвигал на 7. Все хорошо делилось, все правильно.
После этого решил проверить в отладчике сколько по времени занимает каждый вариант обработки.
результаты:
1) со сдвигом - 353918 циклов, 0.00210666 сек.(2106 мкс)
2) с делением - 355490 циклов, 0.00211601 сек. (2116 мкс)
10 мкс разницы на обработку массива из 896 элементов с подсчетом среднего и перезаписью в другой массив, мне кажется не сильно страшно.
Попробую переписать как Вы сказали, посмотрю на разницу во времени обработки. По идее должно быть намного быстрее, чем мое
Есть еще вариант искать среднее с помощью функции
PHP код:
|
arm_mean_q31(test_mass,numb_elements,&mean);
|
Судя по отладчику она выполняется за 167 циклов
А следующий вариант выполнятся за 194 цикла
PHP код:
|
for(i=0;i‹=20;i++)
{
mean+=test_mass[i];
}
mean/=sizeof(test_mass);
|
Последний раз редактировалось swat24; 20.09.2013 в 23:24.
|
|
|
|
20.09.2013, 23:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.06.2005
Сообщений: 3,399
Сказал спасибо: 5
Сказали Спасибо 431 раз(а) в 306 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
А какова скорость сэмплирования?
Не проще без ДМА просто по прерыванию добавлять к сумме новый и вычитать старый и сдвинуть на 7?
ДМА немного для других целей.
|
|
|
|
20.09.2013, 23:51
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
В данный момент я пробую все, что меня интересует и пригодится примерно через месяц ![Улыбка](images/smilies/icon_smile.gif) В это входит максимально быстрая оцифровка, с записью в массив во внешний СРАМ.
А вообще я использовал ДМА, что бы заполнить массив с 7 каналов и после сделать обработку, нахождение среднего. Т.е. то, что сейчас и сделал.
Теперь буду пробовать усреднение ускорить. Но без ДМА все равно быстро не переписать значения 7 каналов АЦП в массив. Так включил и оно пишет постоянно, когда разрешен ДМА.
|
|
|
|
02.10.2013, 15:46
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Пустячковый вопрос: а есть ли в Corteх-M3 функция переключения вывода как в AVR, когда в PINx пишешь "1" ?
|
|
|
|
02.10.2013, 16:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Нет
И не в Кортексе, а в АРМ вообще
|
|
|
|
02.10.2013, 17:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от MaxiMuz79
|
функция переключения вывода как в AVR
|
Только в тиньках была, да и-то - не во всех.
__________________
There's always more than one way to skin a cat.
|
|
|
|
02.10.2013, 18:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Есть во всех АТмегах из обновленной линейки - мега48...328, 164...644, 325...645, 3250...6450, 329...649, 3290...6490, 640...2560, 1281...2561, и почти во всех тиньках. Если чего-то не знаете - не уточняйте
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:18.
|
|