Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/33: Рейтинг темы: голосов - 33, средняя оценка - 4.79
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
1

STM32F103 оцифровка одновременно нескольких сигналов

10.02.2017, 18:34. Показов 6816. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
И снова всем привет.

Пытаюсь перенести своё же изделие - 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
В 220 не пересчитывал - пока бесполезно.

Кто-нибудь поможет разобраться?
Спасибо.

[5.57 Кб]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2017, 18:34
Ответы с готовыми решениями:

Оцифровка сигналов спидометра, тахометра и т.д
Добрый день. Интересует такой вопрос вобщем по СТМ32. До этого раньше работал с АВР, и собственно...

Оцифровка нескольких датчиков
Есть задача, оцифровывать 2 датчика pt100 по трехпроводной схеме. Причем конфигурировать какой из...

STM32F103 не работает одновременно таймер и энкодер
На STM32F103 на 2 и 3 таймере висят энкодеры. Пример инициализации ниже: TIM_TimeBaseInitTypeDef...

оцифровка нескольких сигналов
Подскажите, как оцифровать 4 сигнала. Можно ли это сделать на встроенном АЦП и каким контроллером...

Прецизионная оцифровка аналоговых квазипостоянных сигналов..
Сразу задача: нужно оцифровать биполярный сигнал с максимальной амплитудой 10В с максимальной...

24
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
В STM32 (кроме F3) все ADC однополярные. Как вы завели туда переменку? Приведите _конкретную_ схему.
Ловите. ну, там, где 5в, везде 3.3в.
Поднимаю синусоиду вверх на полдиапазона АЦП (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
Если имеется в виду http://sxim.net/izmer/izmer90-9.png с соответствующей коррекцией, то все должно работать.
Да-да, именно она.

Цитата Сообщение от u37
Для начала, поставьте S&H не 0.5 тика, а что-то адекватное (например 13). Во-вторых, не надо считывать постоянно (хотя, вряд-ли вы так делаете). В-третьих, полезно поставить фильтрующие конденсаторы по каждому входу ADC, прямо на землю, вывод VssA. Как можно короче и отдельной трассой.
А что такое S&H? Оцифровка таймером 1kHz (если я не ошибся в делителях). Про RC цепочки я уже понял, завтра попробую спаять, попробовать. В той статье, как я понял, советуют 700Ом/330пФ.

Цитата Сообщение от u37
ADC довольно шумный. Поэтому стоит сделать считывание в N-раз чаще, чем надо и каждый осчет брать усреднением по N. При этом и разрядность повысится.
Поэтому всему и думаю про MCP3204 ...
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
Настройка S&H = ADC_SMPR1/2
010: 13.5 cycles
Если выйдет слишком долго, то "001: 7.5 cycles", но это уже существенно хуже.
Да, спасибо. Сейчас так и стоит.
Про аабв понял. Сперва 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
Цитата Сообщение от u37
ADC довольно шумный. Поэтому стоит сделать считывание в N-раз чаще, чем надо и каждый осчет брать усреднением по N. При этом и разрядность повысится.
Поэтому всему и думаю про MCP3204 ...Есть варианты использования бюджетных специализированных измерителей - там же теория и схемотехника съёма напряжения и тока

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
2. Должно быть более-менее чистое питание. На всех пинах питания по 0.1мкФ и два по 10мкФ на контроллер. Отдельного фильтра на VDDA обычно не требуется. Если всё питается от импульсного DCDC, то после него желателен ещё общий LC-фильтр на схему.
Не совсем верно. AN2586, раздел 1.2 явно говорит как подключать vdda и vref+
0
11.02.2017, 16:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2017, 16:55
Помогаю со студенческими работами здесь

Объединение нескольких сигналов в один в Simulink
Добрый вечер! Стоит такая задача: имеется 4 сигнала, выводятся графики этих сигналов. Нужно...

Генерация нескольких звуковых сигналов в цикле. Не доходит до конца
Всем доброго времени суток Вот столкнулся с проблемой Класс который генерирует сигналы ...

Движение нескольких объектов одновременно
При нажатии ЛКМ появляется новый мячик и вылетает в сторону курсора. При нажатии ЛКМ 2 раз всё...

Запуск одновременно нескольких потоков
Вот как запустить например сразу 20 потоков ? что бы работа, например http запроса или еще что-то...

Работа с БД нескольких клиентов одновременно
Здравствуйте! Есть программа которая работает с бд mysql. Нужно чтоб 2 и более человек могли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru