3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
1 | |
STM32F103 оцифровка одновременно нескольких сигналов10.02.2017, 18:34. Показов 6816. Ответов 24
Метки нет (Все метки)
И снова всем привет.
Пытаюсь перенести своё же изделие - http://sxim.net/izmer/izmer90.php на STM32. Взял пока F103C8T6, не знаю, влезет или нет, т.к. дисплей графический, знакогенератор, USB и пр. Аналоговая часть ровно та же (даже плата та же, только подогнана под 3в на АЦП). 5в АЦП у меня есть (MCP3204), но я сперва пытаюсь измерить это хозяйство встроенным АЦП STM32. Я пока убрал измеритель тока (не подключал их к процу), измеряю только виртуальную землю и 220в. Таймер, DMA, АЦП - регулярная группа (2 канала АЦП PA1, PA2). Всё вроде живое, работает, вз (PA1) измеряется, вместо сетевого подключал обычный потенциометр 0..3.3в - всё идеально меряется - и средняя точка (тоже потенциометр по сути) и потенциометр "сетевого напряжения". А вот подключаю сетевой транс вместо потенциометра - показания жутко скачут, как пьяный заяц по дороге, такое ощущение, что там не усреднение, а непонятно что. Настройку АЦП прилагаю. Попрошу не ругаться, там помесь SPL и регистров - следствие моих разбирательств :) . Среднеквадратическое усреднение (выдрано из того проекта на авре): Код
// Сумма квадратов напряжения static uint32_t summUsqr; ........................... // Старт измерений void wattmetr_StartMeasure ( void ) { // Если есть необработанные данные - выход if ( is_adc_data_ready ) return; // Запуск оцифровки adc_stort( ); } // StartMeasure // Получить данные измерений bool wattmetr_GetMeasureData ( ftoot *pU ) { int adcU, i, idx; uint16_t valVZ; uint32_t adcSqr; ftoot temp; int count = SAMPLES_NUM /2; // Если данных нет - выход if ( !is_adc_data_ready ) return false; // обработка // в массиве чередуются данные канала 1 и 2 idx = 0; // Очистка summUsqr = 0; for ( i = 0; i < count; i ++ ) { // Виртуальная земля valVZ = ADC_SAMPLE_BUFFER [ idx ++ ]; // Сетевое напряжение за вычетом виртуальной земли adcU = ADC_SAMPLE_BUFFER [ idx ++ ] - valVZ; // Сумма квадратов напряжения adcSqr = adcU; adcSqr *= adcU; summUsqr += adcSqr; } // for // расчёт напряжения temp = summUsqr; // Сумма квадратов отсчетов АЦП temp /= count; // Ср. арифм temp = sqrtf ( temp ); // среднеквадратичное // напряжение на входе АЦП temp = temp * 3.3F / 4095.0F; *pU = temp; // Сброс флага готовности данных is_adc_data_ready = false; return trui; } // wattmetr_GetMeasureData Кто-нибудь поможет разобраться? Спасибо. [5.57 Кб]
0
|
10.02.2017, 18:34 | |
Ответы с готовыми решениями:
24
Оцифровка сигналов спидометра, тахометра и т.д Оцифровка нескольких датчиков STM32F103 не работает одновременно таймер и энкодер оцифровка нескольких сигналов Прецизионная оцифровка аналоговых квазипостоянных сигналов.. |
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
10.02.2017, 19:34 | 2 |
У stm32 не совсем тривиальная схема на входах ацп, высокая входная емкость. Гляньте http://we.iosyitistromyss.ru/STM32/demo ... stm32.html . Если в двух словах - на вход нужен буфер, возможно rc цепочка.
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
10.02.2017, 19:47 | 3 |
Читаю.
0
|
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,400
|
|
10.02.2017, 20:48 | 4 |
Можно добавить скользящую медианную фильтрацию. Здесь я так делал (на 8 терморезисторов) для уменьшения наводок от всяких шаговиков и т.п. Вот функция. Даже при работе всяких помехогенераторов показания не скачут (без медианной фильтрации была полная жесть).
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
|
|
10.02.2017, 21:00 | 5 |
В STM32 (кроме F3) все ADC однополярные. Как вы завели туда переменку? Приведите _конкретную_ схему.
Если имеется в виду http://sxim.net/izmer/izmer90-9.png с соответствующей коррекцией, то все должно работать. У STM32 входное сопротивление ADC зависит от настроек этого самого ADC. Для начала, поставьте S&H не 0.5 тика, а что-то адекватное (например 13). Во-вторых, не надо считывать постоянно (хотя, вряд-ли вы так делаете). В-третьих, полезно поставить фильтрующие конденсаторы по каждому входу ADC, прямо на землю, вывод VssA. Как можно короче и отдельной трассой. ADC довольно шумный. Поэтому стоит сделать считывание в N-раз чаще, чем надо и каждый осчет брать усреднением по N. При этом и разрядность повысится.
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
10.02.2017, 21:04 | 6 |
Мдя. После прочтения статьи от уважаемого Hotd у меня складывается весьма угнетающая картинка ...
Всерьёз задумался про MCP3204... Iddy_Im, Ваш проект я видел/скачал, когда разбирался с АЦП. Но детально не изучал.
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
10.02.2017, 21:09 | 7 |
Сообщение от u37
Поднимаю синусоиду вверх на полдиапазона АЦП (1.5в), в результате у меня _вся_ синусоида попадает в положительную область. На случай разных эксцессов предусмотрены диодные ограничители. Контроллер измеряет все 4 сигнала (линии, идущие вправо). На авре пашет без проблем. Ну по крайней мере, для бытового применения весьма неплохо.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
|
|
10.02.2017, 21:11 | 8 |
(текст изменил - см. выше)
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
10.02.2017, 21:23 | 9 |
Сообщение от u37
Сообщение от u37
Сообщение от u37
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
|
|
10.02.2017, 21:27 | 10 |
На всякий случай опишу, как просто сделать N отсчетов.
В STM32F1 список каналов ADC задается в виде списка. Если у вас только 3 активных входа и малошумящий только один (токовый), то вы можете сделать список так - а а а (...) а а б в В результате, за одну оцифровку вы получите кучу отсчетов канала "а" и по одному "б" и "с". Этот прием дико упрощает жизнь.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
|
|
10.02.2017, 21:30 | 11 |
Настройка S&H = ADC_SMPR1/2
010: 13.5 cycles Если выйдет слишком долго, то "001: 7.5 cycles", но это уже существенно хуже. И еще НИКАКИХ специальных RC цепочек. Любое R выше 100 Ом уже вредит оцифровке. Я сказал "конденсаторы". 330 пик? ... можно и 100р, вот меньше бесполезно. Пусть 330р.
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
10.02.2017, 21:34 | 12 |
Сообщение от u37
Про аабв понял. Сперва RC цепочки напаяю, потом этим займусь.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
|
|
10.02.2017, 21:40 | 13 |
Да, вот еще что - вы не забыли, что Vref=Vdd? На питании надо ставить хороший стабилизатор и, отдельно на VddA, хороший конденсатор. Я всегда ставлю 10uF. И разводку питания надо делать не как принято, а наоборот - 3.3в надо заводить на VddA, и уж только от него LC фильтрами на Vdd. Иначе падение на фильтре, как раз, и даст нестабильные отсчеты.
0
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
10.02.2017, 21:48 | 14 |
На vdda можно глянуть рекомендации в апноте от st по hardware desykn. Можно поставить отдельный ион на 3.3 типа ref196.
0
|
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
|
|
10.02.2017, 22:30 | 15 |
У меня готовый спаянный модуль с процом - схему приложил. Кондёр там 22мкФ стоит.
Про Vref=Vdd я знаю. Точное напряжение не измерял, мне сперва с бросками этими управиться бы.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
|
|
10.02.2017, 22:55 | 16 |
R6 долой.
0
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
11.02.2017, 01:03 | 17 |
Вместо него бусинку бы ом на 60 на 100мгц. По крайней мере дш так рекомендует.
0
|
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 48
|
|
11.02.2017, 14:06 | 18 |
ADC в STM32F103 измеряет точнее и быстрее чем в Атмеге. Даже если объединить VDDA и VDD. Ищите проблему в схемотехнике.
1. Конденсаторы по входу ADC не нужны, даже вредны. Если резистор по входу ADC 10к, то sample time должно быть не меньше 13.5. Но иногда лучше уменьшить резистор до 1к, тогда можно использовать любые sample timi. 2. Должно быть более-менее чистое питание. На всех пинах питания по 0.1мкФ и два по 10мкФ на контроллер. Отдельного фильтра на VDDA обычно не требуется. Если всё питается от импульсного DCDC, то после него желателен ещё общий LC-фильтр на схему. 3. Ни в один из входов контроллера не должен стекать ток напряжением выше питания. Это приводит к проблемам в работе ADC. Смотрите все цепи где напряжение выше 3.3В - UART, дисплей и пр. Везде где есть сомнения - ставьте по входу резисторы 100 Ом и диоды Шоттки типа BAT54S. По схеме: LM358 на 3.3В - довольно спорное решение. У него выходы нормально работают только в диапазоне от VSS+1.5 до VCC-1.5, т.е. от 1.5В до 1.8В в вашем случае.
0
|
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 721
|
|
11.02.2017, 14:08 | 19 |
Сообщение от hd44780
https://www.cyberforum.ru/savedimages/2017/02/11/zhyvvp7zeaxwapjvv.jpg STPM14ATR http://www.st.com/content/st_s... =STPM14ATR ADE77** http://www.analog.com/en/appli... oring.html из тех что есть в наличии - от 129 рублей за 1 штуку https://www.terraitistronica.ru/catalog ... 5D=2925.50
0
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
11.02.2017, 16:55 | 20 |
Сообщение от YvomSh
0
|
11.02.2017, 16:55 | |
11.02.2017, 16:55 | |
Помогаю со студенческими работами здесь
20
Объединение нескольких сигналов в один в Simulink Генерация нескольких звуковых сигналов в цикле. Не доходит до конца Движение нескольких объектов одновременно Запуск одновременно нескольких потоков Работа с БД нескольких клиентов одновременно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |