Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Работа с ADC канали в STM32F4xx
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=19278
Страница 1 от 2

Автор:  RM [ Сря Сеп 25, 2024 8:33 pm ]
Заглавие:  Работа с ADC канали в STM32F4xx

Имам конфигурирани 4 канала в ADC-то. Каналите са sConfig.Channel=ADC0-4 sConfig.Rank =Rank1-4 и sConfig.SamplingTime
Линкнал съм ги през DMA към буфер [12000] по 2 баита(12 бит адц) и 4 канала ...
Работи както трябва.
За нов канал имат HAL_ADC_ConfigChannel(.... Но когато искам да намаля каналите, преиницялизирам наново ADC-то с клонинг на MX_ADC1_Init(void)...

Друг начин не намерих!!! Въпроса ми де ... има ли друг начин?

времето смятам по датата. ADCCLK = 42 MHz and a sampling time of 3 cycles: Tconv = 3 + 12.5 = 15,5 cycles = 0.369 µs μs
Мисля после да вдигна APB2 на 84МHz.

Автор:  VPavlov [ Чет Сеп 26, 2024 9:08 am ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

Здрасти,
имам съвсем малко опит, но все пак ще споделя: При инициализацията се извършват множество конфигурации и чак в края й се активира АДЦ и ДМА потокът. Тоест АДЦ и ДМА не работят докато биват конфигурирани, така че ако се интересуваш за друг начин (освен тяхната повторна инициализация) мисля че е малко вероятно да има. Иначе редът на конфигурация е следния:
Пуска се сигнал до портовете на пиновете, поставят се съответните пинове в "analog mode". Пуска се сигнал до АДЦ и се конфигурира броят на преобразуванията. После конфигурираме последователността на изпълнение, mod на работа и работа с ДМА. След това се конфигурира ДМА и на края се пускат и двете да работят. Ако те интересува по-подробно ще ти опиша кои регистри се ползват.
Циклите броиш много точно с DWT.
Ако търсиш да става по-бързо. Би могъл да преконфигурираш само регистрите, които се отнасят за броя на конверсии и редът на отчитане, след като си инициализирал един път АДЦ-то. Отново ще трябва да спреш и пуснеш АДЦ и ДМА, както и да промениш броя на каналите.

Автор:  RM [ Чет Сеп 26, 2024 9:51 am ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

Трябва да почета по подробно документите. Има правила ...
В биб. има и функций за Init и DeInit ... Ще опитам първо
да променя само броя на каналите.

Автор:  VPavlov [ Чет Сеп 26, 2024 10:10 am ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

Просто ги спираш, преправяш някоя настройка и пускаш. Ако го деинициализираш сигурно ще върне всички ползвани регистри в стойностите им по подразбиране, което няма да ти спести цикли, тъй като отново ще трябва да се направят всички конфигурации. ADC то се пуска (enable) от ADC1->CR2 първия бит, и стартира с 30тия от същия регистър. За съжаление нямам опит с HAL.

Автор:  RM [ Нед Окт 06, 2024 7:56 am ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

Трябва ми да изследвам един синусоидален сигнал, който отива на майка си в г--а и се връща. Генерирам го с AD9834. Имам всички сметки които трябва да направя.
Поне така си мисля. Нещо такова.

Код:
float find_max(const uint16_t *buf, size_t len)
float find_min(const uint16_t *buf, size_t len)
float calculate_average(const uint16_t *buf, size_t len)
float calculate_frequency(const uint16_t *buf, size_t len, float sampling_rate)
void generate_ideal_sine(float *ideal_sine, size_t len, float amplitude, float frequency, float sampling_rate, float phase)
float calculate_rms(const uint16_t *buf, size_t len)
float calculate_snr(const uint16_t *adcBuf, const float *ideal_sine, size_t len)

Най-вероятно ще махна резултатите със запетайките където е възможно.
Нямам си на идея как да извлеча от буфера шума насложен върху синусоидата. Шума не е симетрично насложен върху синусоидалния сигнал.
Имам някакви фантазии, да изчисля допълнително спрямо реалния период на сигнала и по реалното семплиране на всяка точка от предполагаемата вярна синусоида и да сравнявам със реалната от ADC-то. 8O Ама нямам толкова "багаж".

Автор:  VPavlov [ Нед Окт 06, 2024 10:28 pm ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

Разбирам си уловил сигналът, изчислил си му параметри, филтрирал си шума, така че вече разполагаш с търсената синусоида и сега се интересуваш от амплитудата на шума. Не разбирам какво правят (calculate_rms, и calculate_snr). Ако те разбирам правилно, то можеш да извадиш замерената моментна стойност на сензора, от филтрираната амплитуда. Ще се получи положително или отрицателно число, в зависимост от коя страна е шумът. След като е несиметрично разположен, можеш да ги третираш отделно и да сметнеш средно аритметично за амплитудата на шума.

Автор:  TheWizard [ Нед Окт 06, 2024 10:56 pm ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

пускаш сигнал мериш амплитудата
спираш сигнала мериш шума ... общо взето с 12 битово ADC нищо няма да премериш
SNR = 10 log (S ÷ N) за напрежение. за мощност е 20 log...

теоретично 72 db е без да бараш усилване или опорно

Автор:  RM [ Сря Окт 09, 2024 4:38 pm ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

Като за начало, без да съм тествал е това ... разделям ги на по малки стъпки за да мога да дебъгвам. Иначе ми е трудно. Това долното не знам дали изобщо ще работи.
Код:
float calculate_rms(volatile float *buf, size_t len) {
    float sum = 0.0f;
    for (size_t i = 0; i < len; i++) {
        sum += buf[i] * buf[i];
    }
    return sqrt(sum / len);
}

float calculate_snr(volatile uint16_t *adcBuf, volatile float *ideal_sine, size_t len) {
    float signal_rms = calculate_rms(ideal_sine, len);
   
    float noise_sum = 0.0f;
    for (size_t i = 0; i < len; i++) {
        float error = (float)adcBuf[i] - ideal_sine[i];
        noise_sum += error * error;
    }
    float noise_rms = sqrt(noise_sum / len);
    return 20 * log10(signal_rms / noise_rms);
}



не съм много сигурен но ще опитам да мине буфера през медианен филтър или LP филтър

Автор:  TheWizard [ Сря Окт 09, 2024 4:49 pm ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

Цитат:
Иначе ми е трудно

ако не е - няма да се научиш

какви точности гониш с това "чудо"

Автор:  RM [ Сря Окт 09, 2024 5:15 pm ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

Сега като изпратя чиста синусоида 70000Hz от изхода на DDS (само единия изход, сигнала е от 2 пина за диференциален инструментален операционен) и го прекарам през 12 битовия ADC1 през DMA канал с най-бързото семплиране, данните са направо отчайващо лоши. Трябва ми да изследвам един датчик. С мерене с обикновени уреди не става. Трябва да хвана шумове и изкривявания. Сега не искам да хардуерно да правя нищо за подобряване на сигнала. Лошия сигнал на този етап ми е добре дошъл.

"ако не е - няма да се научиш" Нямам никакви напъни да се уча защото не ставам за това, но понякога се налага.


Е това с 20 log10 дали не съм го объркал ??? Отношението на амплитуди наистина ли е така.

Автор:  ToHu [ Сря Окт 09, 2024 5:33 pm ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

Дай при ер за отчайващо лоши, дай картинка на синусуида възстановена само по точки, без фурие, или просто файл с 300-400 семпъла.

Автор:  TheWizard [ Сря Окт 09, 2024 5:35 pm ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

70000Hz тактова или синусоида

Автор:  itso.t [ Сря Окт 09, 2024 6:16 pm ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

Да не се бъркам в проекта, но на пазара отдавна има звукови карти семплиращи на 384 или 768 кила, 24 бита. Няма да се учудя ако има и с 32 бита, най-вече "на хартия".
Ако картата е по-лачена, има балансни (диференциални) входове и изходи.

Софтуери за измерване на шумове, изкривявания и куп други параметри също не е като да няма. Че и добре направени, безплатни...

Отделно има анализатори за аудио работещи до 250 кила или мегахерц, но за тях трябва малко по-сериозен бюджет.

Автор:  RM [ Сря Окт 09, 2024 7:03 pm ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

примерно при 105kHz шумовете са около 5-10% от сигнала. Изобразявам синусоидата на цветно дисплейче 3,2 инчово ILI9341, само информативно. Сигнала ми идва от AD9834.
Искам да хвана отделно от генератора, въпреки че знам винаги каква честота пускам- честотата, дефазирането, амплитудата и по натам ще сложа серийно и активно за да хвана и реактивното от импеданса . Трябва ми възможно най верен сигнал поне от 2 честоти, за да хвана достатъчно точно шумовете и да сметна и индуктивността. Сега съм още в началото.
Сега на точно 105kHz , 70kHz ..35kHz изчислява честотата със 100% точност. Но чета ADC-то непрекъснато, хващам буфера в прекъсването при изчетени всички зададени броя семпли. Ще преправя четенето от адц-то да бъде само когато другата периферия мълчи - USB , SPI и предполагам всичко ще си дойде на място.

Автор:  TheWizard [ Сря Окт 09, 2024 7:28 pm ]
Заглавие:  Re: Работа с ADC канали в STM32F4xx

шума ли ще мериш или изкривяването на сигнала

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/