Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 19.09.2013, 22:21  
Gaaaaaad
Частый гость
 
Регистрация: 07.03.2011
Сообщений: 38
Сказал спасибо: 1
Сказали Спасибо 19 раз(а) в 16 сообщении(ях)
Gaaaaaad на пути к лучшему
По умолчанию 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 отсчетов (кольцо).

Все пока шло усреднение-индикация забыли про входные отсчеты закончили усреднять индицировать == ОБНУЛИЛИ буфер и опять пока заполняем буфер новыми значениями == все в сад, после взвода опять готовы...

Для регистратора -- главное подобрать так чтобы любая обработка усреднение-индикация ГАРАНТИРОВАНО укладывалась между тактами оцифровки.

Если такты "усреднения" и "оцифровки" будут пересекаться друг с другом -- то у вас и "среднее" будет с ошибкой и пропущеные такты оцифровки будут вносить ошибку...
Реклама:
Gaaaaaad вне форума  
Непрочитано 19.09.2013, 22:43  
swat24
Гражданин KAZUS.RU
 
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
swat24 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Что я хочу получить от этого всего - в любой момент, в основном цикле программы, я мог бы обратится к определенной ячейке массива и узнать значение аналогового сигнала. Без необходимости запуска преобразования, подсчета среднего.

Получается мне нужен индикатор.
Сейчас я запускаю преобразование, при заполнении буфера в прерывании ПДП я выставляю флаг и выключаю прерывания ПДП. В основном цикле смотрю этот флаг, если он установлен - начинаю обработку полученного массива 1 с перезаписью результата в массив 2.
После обработки устанавливаю флаг - "готовности данных" и читаю его в основном цикле. После чтения результата - включаю опять прерывания от ПДП.
Вызывать подпрограмму усреднения из прерывания ПДП не получается, т.к. на это уходит много времени. По нормальному только с флагом...

В массиве 1 у меня получается 7 каналов расположены друг за другом. И таких выборок 700 штук. Нахожу среднее для каждого из каналов полностью прохождением всего массиву. Т.е. для всех каналов массив 1 проходится 7 раз с шагом 7.

Gaaaaaad попробую переписать так как Вы написали.
Это получается кольцевой буфер, в котором прибавляя а11 мы вычитаем а1, а прибавляя а12 - вычитаем уже а2, сдвигаем все элементы на один влево, правильно я понял нахождение среднего?

Последний раз редактировалось swat24; 19.09.2013 в 22:58.
swat24 вне форума  
Непрочитано 20.09.2013, 20:55  
Gaaaaaad
Частый гость
 
Регистрация: 07.03.2011
Сообщений: 38
Сказал спасибо: 1
Сказали Спасибо 19 раз(а) в 16 сообщении(ях)
Gaaaaaad на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от swat24 Посмотреть сообщение
Gaaaaaad попробую переписать так как Вы написали.
Это получается кольцевой буфер, в котором прибавляя а11 мы вычитаем а1, а прибавляя а12 - вычитаем уже а2, сдвигаем все элементы на один влево, правильно я понял нахождение среднего?
вроде да...
Только вот по 100 семплов на канал это ни туды ни сюды... уже или 64 или 128 а то не по хардкодингу получается

вычисление среднего в таком случае будет просто сдвигом вместо деления...

Ну и весь цикл думаю легко укладывается без проблем с доступом
выделяете массив [129 7] для исходных данных, указатель i=от 1 до 128 для запоминания текущего положения и семь "сумм" крупнее размером (в битах )

по прерыванию ДМА заполняет всегда 0 ряд, потом вычитаем из "сумм" значения находящиеся по i-индексу, прибавляем из 0 ряда, и записываем по i-индексу значениями из 0 ряда. == думаю 14 арифметических операций и 7 копирований проблем не вызовут и гарантировано уложатся между вызовами прерывания АЦП.
Ну и конечно наращиваем i на единицу убеждаясь что она не стала больше 129

а да последнее 7 volatile переменным присваиваете значение со сдвигом из "сумм" таким образом без разницы когда вы их запросите снаружи -- у этих переменных значение будет меняться одной единственной "атомной" операцией... гарантировано не вызывая конфликтов на уровне железа...
Gaaaaaad вне форума  
Непрочитано 20.09.2013, 23:16  
swat24
Гражданин KAZUS.RU
 
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
swat24 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Gaaaaaad, спасибо за разъяснение
на счет сдвига и операции деления.
Сегодня решил сократить время обработки массива - отказом от деления. Все переписал, выбирал 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.
swat24 вне форума  
Непрочитано 20.09.2013, 23:30  
Gnider
Почётный гражданин KAZUS.RU
 
Регистрация: 30.06.2005
Сообщений: 3,399
Сказал спасибо: 5
Сказали Спасибо 431 раз(а) в 306 сообщении(ях)
Gnider на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

А какова скорость сэмплирования?
Не проще без ДМА просто по прерыванию добавлять к сумме новый и вычитать старый и сдвинуть на 7?

ДМА немного для других целей.
Gnider вне форума  
Непрочитано 20.09.2013, 23:51  
swat24
Гражданин KAZUS.RU
 
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
swat24 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

В данный момент я пробую все, что меня интересует и пригодится примерно через месяц В это входит максимально быстрая оцифровка, с записью в массив во внешний СРАМ.

А вообще я использовал ДМА, что бы заполнить массив с 7 каналов и после сделать обработку, нахождение среднего. Т.е. то, что сейчас и сделал.
Теперь буду пробовать усреднение ускорить. Но без ДМА все равно быстро не переписать значения 7 каналов АЦП в массив. Так включил и оно пишет постоянно, когда разрешен ДМА.
swat24 вне форума  
Непрочитано 02.10.2013, 15:46  
MaxiMuz79
Гражданин KAZUS.RU
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Пустячковый вопрос: а есть ли в Corteх-M3 функция переключения вывода как в AVR, когда в PINx пишешь "1" ?
MaxiMuz79 вне форума  
Непрочитано 02.10.2013, 16:25  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Нет
И не в Кортексе, а в АРМ вообще
niXto вне форума  
Непрочитано 02.10.2013, 17:57  
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от MaxiMuz79 Посмотреть сообщение
функция переключения вывода как в AVR
Только в тиньках была, да и-то - не во всех.
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Непрочитано 02.10.2013, 18:14  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Есть во всех АТмегах из обновленной линейки - мега48...328, 164...644, 325...645, 3250...6450, 329...649, 3290...6490, 640...2560, 1281...2561, и почти во всех тиньках. Если чего-то не знаете - не уточняйте
niXto вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Школа АRMрестлинга Uragan90 Микроконтроллеры, АЦП, память и т.д 54 22.08.2011 16:13
ARM Cortex M3 + Linux SiMiLya Микроконтроллеры, АЦП, память и т.д 10 17.06.2011 17:20
Помогите с STM32 - очень нужно... yakuzaa Микроконтроллеры, АЦП, память и т.д 60 04.08.2010 11:04
Как добавить поддержку для STM32 SFHK Микроконтроллеры, АЦП, память и т.д 11 18.12.2009 18:09


Часовой пояс GMT +4, время: 11:18.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot