

spirit_1
Участник-
Posts
416 -
Joined
-
Last visited
Reputation
0 ОбычныйAbout spirit_1
-
Rank
Местный
Информация
-
Город
Array
Recent Profile Visitors
2,204 profile views
-
Вопросы по CST
spirit_1 replied to Pir0texnik's topic in RF & Microwave Design
давно хотел спросить такой момент как цст решает вопрос с накладками. Например есть две микрополосковые линии из одного материала концами наложенные одна на другую, т.е нарисована одна линия а вторая нарисована не в притык а с нахлестом Понимаю что их надо соеденить по нормальному через логические операции но все же.. Другой пример если эти две линии будут иметь разный матерал кому ЦСТ отдаст приоритет в месте нахлеста? или будет чтото среднее при расчете? Насколько это влияет на скорость вычисления? -
Ищу возможность поработать c платой Zynq в реальных проектах
spirit_1 replied to baumanets's topic in Ищу работу
Знакомый так работает. Под управлением несколько реле из разряда- питание, резет итд. Один раз человек подключает куда надо на той стороне и потом знакомый когда надо посылает команду и дергает релюху какую надо) -
Si4463 бьются пакеты на 1000 kbps
spirit_1 replied to repstosw's topic in RF & Microwave Design
Попробуйте какой то UWB трансивер Например спарк дает до 20 мрс или • 50 meter range @ 3Mbps https://www.sparkmicro.com/wp-content/uploads/2020/03/Product-Brief_v6.6.pdf -
Si4463 бьются пакеты на 1000 kbps
spirit_1 replied to repstosw's topic in RF & Microwave Design
Не знаю какой у вас запас на замирания но я как то тестировал в пределах 2-3 метров две антенны подключенные одна на выход трекинг генератора анализатора спектра вторая на вход анализатор. Даже простое перемещение руки на расстоянии метра от антенн могла вызвать замирания 15 дб а уж перемещение в пределах комнаты 40дб как пить дать Если скорость большая и запас на бюджет небольшой то скорее всего это замирания от многолучевости -
Note: ADC conversion abort (ADABRT) cannot be used in master/slave mode. In this mode, each of the ADCEN bit of the ADCs must be cleared in order to stop ADC conversions. У меня как раз этот самый master/slave mode/ с битом ADCEN не работает, попробовал , надо именно выключить включить с ДМА вы правы в случае если туда писать ничего не надо, а еслы вы делаете старт с новыми значениями счетчика ДМА и указателем на память что бы изменения вступили в силу надо именно дернуть ДМА
-
Да. могу добавить что если перейдете в китайскеую версию сайта , станут доступны другие аппноты на китайской, их там поболее и можно кое что высосать Так же облазил китайский форум на который идет ссылка производителя, ничегно. На форуме в одной теме поднят подобный вопрос без ясного ответа. В аппнотах всех без исключения нет варианта остановки и рестарта сейчас понятно что у меня завелось только а этом режиме /* config common dma request repeat */ adc_common_struct.common_dma_request_repeat_state = TRUE;// Как я понимаю АЦП валит запросы не зависимо от окончания цикла ДМА, по завершении цикла надо успеть остановить в прерывании АЦП между последним и первым запросами ДМА в цикле, если проскочит то зависает Так по нормальному должно быть, тогда АЦП не шлет запросы по окончании цыкла ДМА, adc_common_struct.common_dma_request_repeat_state = FALSE У меня в таком варианте проходит один раз колько ДМА но я не могу перезапустить, надо корректно остановить и потом загрузить новые параметры в ДМА и запустить все АЦП и ДМА как это в СТМ происходит.
-
Путем некоторых тыков удалось запустить этот режим. Однако сам вариант не совсем хорош. Презапуск заработал только когда в прерывании ДМА сразу останавливаю АЦП, причем даже небольшая задержка переводит ДМА в замороженное состояние из которого можно вывести толлько резетом контроллера Спустя время обнаружилось переодически подвисания, вероятно проскакиевает иногда небольшая задержка в прерывании ДМА что приводит к заморозке Убрал в ДМА проверку на флаг, после этого стабильность возрасла, пока без глюков но сама идея работы в таком режиме хреновая, написал на поддержку, нужна корректная последовательность остановки и перезапуска /==================ADC============================= void DMA2_Channel3_IRQHandler(void) { //if(dma_flag_get(DMA2_FDT3_FLAG) != RESET) //{ // HAL_GPIO_TogglePin(GPIOD, GPIO_PINS_10); // TEST // HAL_GPIO_TogglePin(GPIOD, GPIO_PINS_10); // TEST // HAL_GPIO_TogglePin(GPIOD, GPIO_PINS_10); // TEST //HAL_GPIO_TogglePin(GPIOD, GPIO_PINS_10); // TEST // -в прерывании по заполнению ДМА останавливаем АЦП.. Цикл передачи ДМА закончен adc_enable(ADC1, FALSE); adc_enable(ADC2, FALSE); dma_channel_enable(ADC12_DMA_CHANNEL, FALSE); dma_flag_clear(DMA2_FDT3_FLAG); //HAL_GPIO_TogglePin(GPIOD, GPIO_PINS_10); // TEST // } }
-
Ну так должно работать. То что написал jcxz выше верно но вас в данный момент волновать особо не должно Если ДМА у вас работает и вы уверенны что в массиве по прерыванию принятый верный сигнал, частота выборки ацп правильная то все должно работать а приведением в порядок кода зайиетесь потом Наверное проще было бы гомнокод индийский HAL использовать и в коллбэке это делать
-
2.То что вы показали , в цикле это протосто заполнение буфера тестовым сигналом вместо ДМА,поскольку у вас теперь это сделает ДМА, может удалить или закоментировать этот цил for (float Fin.....){ } 3. Весь инит поместите перед main #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define PI 3.14159265358979323846 #define buffer_size 1000 uint16_t samples[buffer_size]; float FS = 4000.0; //fréquence d'échantillonnage float FDETECT = 1000.0; // частота фильтрации int K; float coefficient; float W; float sine; float cosine; float Q0, Q1, Q2; float real; float imag; float magnitude; float scalingFactor; в прерывании по заполнеии буфкпа ДМА void DMA1_Channel1_IRQHandler (void){ DMA1_Channel1->CCR &= ~DMA_CCR1_EN; DMA1->IFCR |= DMA_IFCR_CGIF1; Q0 = 0; Q1 = 0; Q2 = 0; for ( uint32_t i=0; i<buffer_size; i++) { Q0 = (float)samples1[i] + (coefficient * Q1) - Q2; Q2 = Q1; Q1 = Q0; } real = (Q0 - (Q1 * cosine)) / scalingFactor; imag = (- Q1 * sine) / scalingFactor; magnitude = sqrt(real * real + imag * imag); printf(" Freq_Hz= %f Amplituda = %f \n", Fin , (float)magnitude ); f = 1; DMA1_Channel1->CCR |= DMA_CCR1_EN; } У вас ДМА в normal или циркуляр? Если в циркуляр то можете не успеть обработать буфер до следующего вызова. Лучше сделать нормал , и по необходимости запусать ДМА
-
рабочий пример ниже запускаете в любом компиляторе Си Пример свипирует диапазон 900-1100 гц, диапазон АЦП 0-2000 (введено смещение 1000) результат работы ниже , четко виден максимум на 1000 гц можете поиграться.. Да и не делайте слишком большой буфер. Отношение частоты дискретизации к буферу дает нечто вроде полосы фильтра , вы по сути дали полосу в герцы шириной, короче поиграйтесь полосой (через длинну буфера) найдите оптимальную для вас . Затем запустите как есть пример на контроллере, он должен отработать в режиме симуляции, после этого уже можете подсунуть данные из ДМА
-
посчитайте все коэфициенты отдельно и просто впишите их готовые, потом разьеретесь почему криво синус считает
-
главно АЦП затактируйие от таймера правильной частотой , идеальный вариант если постоянно обраьатывать , делать прерывания по половине и по полному буферу дма, тогда дма можно запустить в циркуляре, по прерыванию половины буфера обрабатывате первую половину, по прерыванию всего буфера обрабатываете вторую половину и так по кругу. В результате 2 раза за прохождение буфера дма у вас будут свежие данные по амплитуде
-
Все неправильно ) 1. АЦП должно работать на той частоте что у вас задана = 4000гц. Задать тактирование АЦП в СТМ32 можно настроив один из таймеров на данную частоту и затем выбрав в качестве тригера для АЦП данный таймер. Один раз стартуете АЦП и тймер , после этого АЦП будет запускаться с частотой таймера 2. Если не хотите или не понимаете DMA , хотя с точки зрения программирования это наилучший вариант , используйте прерывания АЦП т.е при каждом срабатывании ацп от таймера и завершении приеобразования вы попадаете в коллбэк прерывания где имеете свежую выборку в колбэке делате одно вычисление , Q0 = samples + (coefficient * Q1) - Q2; Q2 = Q1; Q1 = Q0; переменные Q0, Q1,Q2 делаете ОБЯЗАТЕЛЬНО статичискими в функции колбэка или глобальными, если у вас постоянно пристуствует сигнал то через bufer_size выборок вы начнете получать результат амплитуды вашего сигнала для bufer_size последних выборок для каждой последующей выборки. Т.е в каждом коллбеке у вас будет свежие Q0, Q1, Q2 из которых вы можете посчитать амплитуду если необходимо real = (Q0 - (Q1 * cosine)) / scalingFactor; imag = (- Q1 * sine) / scalingFactor; magnitude = sqrt(real * real + imag * imag); например при каждой выборки, для каждой 10 выборки или как вам хочеться..
-
я бы сделал так на стм32 1. Пишем данные из ацп в дма буфер 2. По заполнению буфера дма вычисляем как в примере амплитуду вашей частоты. Затем запускаем опять дма. Если еще быстрее считать по полловине заполнения буфера ДМА потом вторую половину в циркулярном режиме ДМА Да, подставляем прямо данные из ацп, частоту дискрктизации ацп подствте в пример, запусите STM32Cube Monitor , выведите в качесте бина (столбика) расчитанную амплитуду. Подавайте сигнал с генератора , меняйте частоту и амплитуду, увидите как меняеться ваш сигнал. Можете даже ачх снять) то что до цикла вычисляет для двух частот , все дублируете. В цикле соотвественно тоже вычисляете для двух частот синхронно два куска идентичных , каждый для своей частоты
-
Портирую проект из СТМ32 на at32f435 все практически получилость без особых проблем, но небольшая загвоздка в режиме ADC_Dual mode +DMA Из примера производителя немного переделал и запустил. Два АДС 1.2 стартуют синхронно и пушут данные через дма в массив. Это работает только один раз. Но повторно запустить я их не могу. В примере нет такого.Только один раз после все инициализации. АЦП работают постоянно(проверял, пишут), Пытался выключать -включать канал ДМА, делать полную инициализацию как в начале, выключать в ДМА все что можно. Без толку. ДМА не пишет в массив .Может у кого есть опыт по этому режиму