А не может ли здесь произойти так, что CurrentChannel поменялся с 1 на 2, а EOSEQ флаг остался равен 0 (не успел, например, выставиться)?
Соотвественно, сброс индекса в 0 не происходит на этой итерации, происходит ещё одна, когда данные пишутся в ADC_array[2], по сути, портя память.
Ну и сдвиг каналов происходит при этом.
Я бы в этом коде не стал надеятся на то, что ADC_ISR_EOSEQ будет в нужном состоянии, как только будет прочитан последний канал в последовательности. Вещи-то по сути не связанные.
Ну, как минимум, сброс счётчика каналов сделать самостоятельным и независящим от флагов:
Может, как-то так:
Код:
while ((ADC1->ISR & ADC_ISR_EOC) == 0) /* wait end of conversion */ { /* For robust implementation, add here time-out management */ }
if ((ADC1->ISR & ADC_ISR_EOC) != 0) /* checks EOC has triggered the IT */ { ADC_array[CurrentChannel] = ADC1->DR; /* reads data and clears EOC flag */ CurrentChannel++; /* increments the index on ADC_array */
if (CurrentChannel >= 2) { CurrentChannel = 0; /* reinitialize the CurrentChannel */ out_adc = ADC_array[0];in_adc = ADC_array[1]; } }
if ((ADC1->ISR & ADC_ISR_EOSEQ) != 0) /* checks EOSEQ has triggered the IT */ { ADC1->ISR |= ADC_ISR_EOSEQ; /* clears the pending bit */ }
Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов.
будем полагать, что не знаем какой канал сейчас оцифровывается, поэтому считав DR проверяем EOSEQ - если 1 то это последний в очереди. и я полагаю, что в последующем это все таки массив (с чередованием каналов) - иначе зачем массив, это просто две переменные.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Сб авг 19, 2023 12:46:31
Потрогал лапой паяльник
Карма: 8
Рейтинг сообщений: 54
Зарегистрирован: Вс мар 03, 2019 08:18:34 Сообщений: 350 Откуда: Волгоград
Рейтинг сообщения:0 Медали: 1
a797945, да в том и проблема, что как писал WiseLord, тот самый EOSEQ то взлетает а то нет. я конечно решил проблему при помощи костыля: каждый раз перед запуском преобразования, меняю значение регистра ADC1->CFGR1 |= ADC_CFGR1_SCANDIR что меняет направление сканирования каналов ацп, но осадчик остался, а если больше 2-х каналов...
выстраивайте ожидание: 1 снимаем флаг EOSEQ, если был 2 ждем когда EOSEQ=1 - текущая очередь заканчивается, 3 снимаем флаги EOSEQ, EOC , 4 ждем EOC первого из новой очереди ...
да и очередь лучше как-то так задавать (не через |=) ADC1->CHSELR = ADC_CHSELR_CHSEL2 | ADC_CHSELR_CHSEL5;
Здравствуйте! Вопрос по STM32F103C8 Хочу настроить ADC следующим образом" 8 каналов - медленные (датчики давления, температуры и т. п.) и два канала для оцифровки звука. Представился такой вариант: Двойным преобразованием ADC1 и ADC2 c DMA с регулярных каналов заполнять массив датчиков 4Х2 непрерывно без прерываний вообще. Считывать их в свободное время. Плюс для оцифровки звука два инжектированных канала, также двойным преобразованием ADC1 и ADC2, периодически запускать по таймеру и считывать результат в прерывании от ADC по завершению преобразования. Можно так сконфигурировать Blue Pill? Или есть другие варианты попроще?
Частота дискретизации звука (приём тональных сигналов) выбрана 14080. Получается 852 такта ADC между прерываниями таймера для старта преобразования ижектированных каналов. Если sampling time выставить максимальным 239,5, то в этот промежуток укладываются три преобразования - один инжектированный (два канала) и два регулярных (четыре канала). Вроде проблем нет.
Представился такой вариант: Двойным преобразованием ADC1 и ADC2 c DMA с регулярных каналов заполнять массив датчиков 4Х2 непрерывно без прерываний вообще. Считывать их в свободное время. Плюс для оцифровки звука два инжектированных канала, также двойным преобразованием ADC1 и ADC2
Все поставлено с ног на голову... Под ДМА должен работать звук, а не датчики. А датчики можно считывать в прерываниях. Они медленные и потому редкие. Только вот возник вопрос. А куда потом этот звук?
КРАМу Спасибо за отклик. Звук не под DMA так как планируются некоторые вычисления после приёма каждого сэмпла. это будут команды тональными сигналами, по полсекунды длиной. Думаю использовать синхронное детектирование, для простоты и кажется минимум ресурсов понадобится на вычисления. А датчики под DMA для того же, чтобы минимум ресурсов на них тратить. Как-то так.
Добавлено after 13 minutes 58 seconds: То есть процесс будет выглядеть примерно так: Сканируются два оегулярных преобразования и складываются куда надо под ДМА без прерываний, затем как только начинается третье регулярное преобразование, оно прерывается инжектированным преобразованием, данные которого извлекаются через прерывание. После окончания инжектированного преобразования, сканируются третье и четвёртое регулярные преобразования, а как только вновь начинается первое, оно прерывается на инжектированное преобразование и так дальше.
Звук не под DMA так как планируются некоторые вычисления после приёма каждого сэмпла. это будут команды тональными сигналами, по полсекунды длиной.
Так и принимайте окнами. Тональные сигналы - это классический ДПФ приемник. Окно приема должно иметь длину рассчитанную из полосы пропускания фильтров. В зависимости от оконной функции оно будет немного больше чем величина обратная полосе фильтра. Скажем, для полосы в 100 Гц окно потребуется примерно 12...15 мс. При частоте дискретизации, например, 8 кГц количество отсчетов в одном окне составит примерно 128. Захватили окно - сделали N-канальный ДПФ - обнаружили сигнал - приняли решение. За полсекунды можно накопить аж 32 окна и получить 32 скалярных значения фильтров. Ну и зачем вам обрабатывать каждый отсчет? Скажу больше. У АРМов прерывания - полный тормоз. Вы получите на каждом отсчете кучу потерянного времени на вход-сохранение контекста-восстановление контекста-выход... Оно вам зачем?
Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Вс окт 08, 2023 13:39:05
Встал на лапы
Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 102 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Добрый день. Решил на досуге заняться портированием драйвера АЦП ADS1256, который написан для STM32 (С) на 8-и битную архитектуру ATmega(С++14). Но вот оказия - в STM32 не петрю. А драйверок то хороший, полнофункциональный - есть все, что надо и ни чета Ардуиновским библиотекам. Вопрос мой конечно немного глуповатый: Регистр данный в SPI на STM32 тридцатидвухбитный? У мег 8-битный. И для передачи/приема чисел более 8-и бит на AVR-ках их передают кусочками по 8 бит, а потом уже склеивают в одно число. Для АЦП ADS1256 необходимы определенные тайминги при общении с МК по SPI. Напр. отправил 8 бит - перекур в несколько тактов(или микросекунд). Вот по этому и вкрались сомнения по необходимости таймингов после отправки каждого байта. Регистр данный в SPI на STM32 тридцатидвухбитный? это для мегСпойлер
Камень stm32f103cb В ардуинке попался код настройки таймера TIM1 с первым каналом. Хотел поиграть со всеми четырьмя каналами, с инверсией и выравниванию по центру. Три канала работают, четвёртый не хотит, CHxN тоже молчит. Где накосячил, пока не разобрался Опыта с регистрами всего пару дней.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения