Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 1
Регистрация: 27.06.2022
Сообщений: 8

Влияние на АЦП (STM32) сигналов с других ног

27.06.2022, 20:02. Показов 2356. Ответов 16

Студворк — интернет-сервис помощи студентам
Всем, привет.

Пытаюсь, принятые от АЦП данные по одному каналу, передать по сети с помощью модуля w5500.

Алгоритм простой: АЦП настроен на непрерывное преобразование, данные забирает DMA, как только заполнена одна из половинок буфера, она отправляется по SPI в сетевой модуль w5500. В итоге график полученных данных выглядит так, как будто передача по SPI влияет на АЦП, может ли такое быть?

Использую МК stm32f103c8

Вид принятого сигнала.


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "system_stm32f10x.h"
#include "stm32f10x.h"
#include "adc1.h"
 
static uint16_t ADC1_Data[ADC_DATA_WORK_COUNT*2];     // Массив для приёма данных с АЦП (массив в 2 раза больше, чтобы обеспечить двойную буферизацию)
static uint16_t *pADC_Data = 0;                       // Адрес с которого нужно будет забирать данные АЦП
static uint32_t ADC_Done = 0;                         // Признак готовности данных
 
void ADC1_Init(uint32_t chnum, uint32_t tp) // Инициализация АЦП1 на оцифровку с частотой 1 МГц
{
  // chnum - номер канала с которого будут поступать аналоговые данные (нумеруется с 0)
  // tp - Кол-во тактов АЦП за которое выполняется преобразование из аналогового значения в цифровое
 
  // АЦП можно настроить на преобразование регулярных групп - последовательное преобразование нескольких каналов АЦП и помещение результата в один регистр для всех каналов ( естественно нужно успеть забрать данные прежде чем они затерлись преобразованием от другого канала )
  // АЦП можно настроить на преобразование инжекторных групп - тоже, что и регулярные, только для результата выделенно 4 регистра
 
  // Делитель для АЦП (тактирование АЦП по документации не должно превышать 14 МГц )
  // Тактирование АЦП1 выполняется от шины APB2 с делением устанавливаемым в регистре RCC->CFGR
  RCC->CFGR &= ~RCC_CFGR_ADCPRE_DIV8;  // тут сбрасываются 2 бита, которые отвечают за делитель для АЦП
  RCC->CFGR |= RCC_CFGR_ADCPRE_DIV8;   // тут устанавливаются биты т.о., чтобы делитель был 8 (112000000 / 8 = 14000000) (предполагается, что частота тактирования APB2 (PCLK2) равна 112МГц)
 
  RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // Разрешаем тактирование АЦП
  RCC->AHBENR |= RCC_AHBENR_DMA1EN;   // Включаем тактирование DMA1  (DMA1 будет забирать данные с АЦП1)
 
  // Настройка DMA (настраивается первый канал DMA1 т.к. этот канал выделен для АЦП)
  DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR;      // Адрес с которого будут браться данные ( адрес регистра переферии )
  DMA1_Channel1->CMAR = (uint32_t)&ADC1_Data[0];  // Адрес массива в который будут поступать данные
  DMA1_Channel1->CNDTR = ADC_DATA_WORK_COUNT*2;   // Количество передаваемых отсчётов из АЦП в память
  DMA1_Channel1->CCR &= ~DMA_CCR1_DIR;            // Направление передачи из перефирии в память
  DMA1_Channel1->CCR |= DMA_CCR1_MINC;            // Увеличение адреса памяти
  DMA1_Channel1->CCR |= DMA_CCR1_CIRC;            // Циклический режим
  DMA1_Channel1->CCR |= DMA_CCR1_PSIZE_0;         // Будет передаваться по 16 бит из переферийного устройства
  DMA1_Channel1->CCR |= DMA_CCR1_MSIZE_0;         // Будет передаваться по 16 бит в память
  DMA1_Channel1->CCR |= DMA_CCR1_HTIE;            // Разрешение прерывания по передаче половины данных
  DMA1_Channel1->CCR |= DMA_CCR1_TCIE;            // Разрешаем прерывание по завершению передачи
  DMA1_Channel1->CCR |= DMA_CCR1_EN;              // Включаем DMA (передача начнётся, когда АЦП начнёт передавать данные)
 
  NVIC_EnableIRQ(DMA1_Channel1_IRQn);
 
  ADC1->CR2 &= ~ADC_CR2_ADON; // Перед тем как всё настраивать выключаем АЦП
 
  ADC1->CR1 = 0; // Такое значение подходит
 
  // Эти регистры указывают за сколько циклов будет определено значение аналогового сигнала (возможные варианты 1.5, 7.5, 13.5, 28.5, 41.5, 55.5, 71.5, 239.5)
  // при этом полное преобразование для одного канала будет выполняться за 12.5 + x (x - то, что задаётся в регистр)
  // Т.о. минимальное время преобразования для одного канала составляет 12.5 + 1.5 = 14 тактов АЦП, если АЦП тактируется с частотой 14 МГц, то преобразование будет занимать 1 мкс.
  // чем больше время выборки, тем точнее результат
  ADC1->SMPR1 = 0; ADC1->SMPR2 = tp;
 
  // Далее настраивается последовательность в которой будут выполняться преобразования
  ADC1->SQR1 = ((1-1)<<20);  // Указываем количество преобразований (указывается на 1 меньше) (будет выполняться одно преобразование)
  ADC1->SQR3 = chnum;  // будет выполняться преобразование по регулярному каналу c номером chnum
 
  // Первая установка бита ADC_CR2_ADON пробуждает АЦП (АЦП выходит из режима Power Down), последующие установки ADC_CR2_ADON запускают преобразования, если их нужно запускать вручную.
  ADC1->CR2 = ADC_CR2_ADON;
 
  // Калибровка АЦП
  ADC1->CR2 |= ADC_CR2_RSTCAL; // Установка бита сброса калибровки ( для подготовки регистра калибровки )
  while(ADC1->CR2 & ADC_CR2_RSTCAL); // Ожидание установки регистра для калибровки
  ADC1->CR2 |= ADC_CR2_CAL; // Установка бита для начала калибровки
  while(ADC1->CR2 & ADC_CR2_CAL); // Ожидание окончания калибровки
 
  ADC1->CR2 |= ADC_CR2_DMA;  // Данные будет забирать DMA
  ADC1->CR2 |= ADC_CR2_CONT; // Установка непрерывного режима преобразования (АЦП выполняет преобразования автоматически с частотой, которая определяется частотой тактирования и временем преобразования)
  ADC1->CR2 |= ADC_CR2_ADON; // Т.к. задан непрерывный режим, то АЦП начинает непрерывно выполнять преобразование, которое сохраняется с помощью DMA
}
 
void DMA1_Channel1_IRQHandler(void) // Обработчик прерывания от 1-го канала DMA1
{
  if(DMA1->ISR & DMA_ISR_HTIF1)     // Если преобразование произошло по причине окончания половины передачи, то
  {
    DMA1->IFCR |= DMA_IFCR_CHTIF1;  // это, чтобы флаг прерывания (DMA_ISR_HTIF1) сбросить
    pADC_Data = &ADC1_Data[0];      // т.к. заполнена 1-я половина, то указатель на данные устанавливается в начало массива
    ADC_Done = 1;                   // установка признака, который означает, что данные заполнены
    return;
  }
 
  if(DMA1->ISR & DMA_ISR_TCIF1) // Если преобразование произошло по причине окончания передачи, то
  {
    DMA1->IFCR |= DMA_IFCR_CTCIF1;                // это, чтобы флаг прерывания (DMA_ISR_TCIF1) сбросить
    pADC_Data = &ADC1_Data[ADC_DATA_WORK_COUNT];  // т.к. заполнена 2-я половина, то указатель устанавливается на начало 2-й части массива (для данных было выделено в 2 раза больше памяти, чем передаётся на обработку)
    ADC_Done = 1;                                 // установка признака, который означает, что данные заполнены
    return;
  }
}
 
uint16_t *ADC1_CheckADCData(void)
{
  if(ADC_Done) // Если данные от АЦП заполнены, то
  {
    ADC_Done = 0; // Сбрасывается признак, чтобы больше не попадать сюда
    return pADC_Data; // Возвращается адрес на массив с готовыми данными
  }
  return 0; // Если данные с АЦП не готовы, то возвращаем ноль
}

Могу выложить весь проект если необходимо.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.06.2022, 20:02
Ответы с готовыми решениями:

В одной банке 80 ног тараканьих и паучьих. Выведите варианты сочетаний количество пауков и тараканов. Паук 6 ног, таракан 8 ног
В одной банке 80 ног тараканьих и паучьих. Выведите варианты сочетаний количество пауков и тараканов. Паук 6 ног, таракан 8 ног

ATmega32, АЦП, опрос неподключенных ног
Вопрос, скорее академический. Итак, есть код: Инициализация АЦП: DDRA=0x00; //все на вход //настраиваем АЦП...

Влияние АЦП на тактовую частоту МК
Добрый день! Сделал термоконтроллер на amega88pa -- контроллер, таймер, часы для духовки. В процессе отладки столкнулся с тем, что...

16
3758 / 2637 / 580
Регистрация: 11.09.2009
Сообщений: 9,414
27.06.2022, 21:49
Цитата Сообщение от XSany Посмотреть сообщение
Могу выложить весь проект если необходимо.
Проект-то тут при чём? Наводки хотите убрать программным способом?
Вы фото монтажа покажите. А то "Использую МК stm32f103c8" - это ни о чём.
0
1 / 1 / 1
Регистрация: 27.06.2022
Сообщений: 8
27.06.2022, 22:50  [ТС]
Наводки программно убрать можно. Сначала принимать, потом передавать и так далее, я так сделал и получилось гораздо лучше.


Но это фиговый вариант, разрывы будут.
Попробовал перекинуть SPI на другой порт (порт B), но проблема не ушла.

Монтаж это просто макетная плата, рядом с ногой A0 воткнут средний провод переменного резистора. На той же макетке модуль w5500.
0
3758 / 2637 / 580
Регистрация: 11.09.2009
Сообщений: 9,414
28.06.2022, 08:50
Цитата Сообщение от XSany Посмотреть сообщение
макетная плата ... воткнут ... провод
Обсуждать дальше тему борьбы с наводками бессмысленно.
0
1 / 1 / 1
Регистрация: 27.06.2022
Сообщений: 8
28.06.2022, 10:12  [ТС]
Как раз смыл есть, если такой вариант монтажа даёт такие наводки, может вы подскажите как уменьшить это влияние?
0
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
28.06.2022, 16:21
XSany, логично же.
Если такие провода ловят наводки, разработать новую плату.
Если и этого мало, ставить внешнее АЦП. И возможно экранировать часть схемы.
0
3758 / 2637 / 580
Регистрация: 11.09.2009
Сообщений: 9,414
28.06.2022, 16:32
Цитата Сообщение от XSany Посмотреть сообщение
Как раз смыл есть
Это вам кажется по благостному незнанию.

Цитата Сообщение от XSany Посмотреть сообщение
подскажите как уменьшить это влияние?
Развести печатную плату в соответствии с рекомендациями раздела радиотехники "Sygnal Integrity" - "Целостность сигналов". Естественно, сначала изучив этот раздел. Начните с Эрика Богатина "Signal integrity - Simplified. Prentice Hall PTR, США 2003. ISBN: 0-13-066946-6". После этого сможете подобрать себе подходящие под ваши вопросы обучающие курсы.
0
1 / 1 / 1
Регистрация: 27.06.2022
Сообщений: 8
28.06.2022, 18:03  [ТС]
Grey, Может такое быть, что наводки происходят в самом МК? и разводка платы эту проблему не решит.
0
3758 / 2637 / 580
Регистрация: 11.09.2009
Сообщений: 9,414
29.06.2022, 04:42
XSany, вам мои ответы не нравятся, вероятно Grey вам ответит более близко к тому, что вы хотите услышать, но может. Особенно в длинных многоножечных DIP-корпусах.
0
 Аватар для COKPOWEHEU
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
29.06.2022, 09:06
Цитата Сообщение от XSany Посмотреть сообщение
Grey, Может такое быть, что наводки происходят в самом МК?
Может, конечно, особенно если питание на плате криво разведено. Ведь любое переключение ножки это импульс потребления. И если у вас аналоговая часть питается от того же источника, что и цифровая, да еще без фильтров, естественно эти импульсы будут и на показания АЦП влиять.
Цитата Сообщение от XSany Посмотреть сообщение
и разводка платы эту проблему не решит.
Может, до конца и не решит, но лишней точно не будет. В том смысле, что ваша макетка в любом случае ловит дикое количество помех откуда только может, и пока вы не справитесь с этим, бесполезно устранять более мелкие помехи: вы их просто не увидите.
0
1 / 1 / 1
Регистрация: 27.06.2022
Сообщений: 8
29.06.2022, 11:49  [ТС]
i8085, Ответы ваши нормальные, просто я не могу менять макетку т.к. это китайская синяя таблетка, сам я плату сделать не могу.

МК stm32f103c8 имеет 48 ножек и как оказалось у него есть отдельные ноги с аналоговым питанием и аналоговой землёй, но они подключены к цифровому питанию и цифровой земле соответственно, поэтому самое простое, как я вижу, это оторвать эти ноги от платы и приделать к ним отдельное питание.
0
3758 / 2637 / 580
Регистрация: 11.09.2009
Сообщений: 9,414
29.06.2022, 12:32
Цитата Сообщение от XSany Посмотреть сообщение
самое простое, как я вижу, это оторвать эти ноги от платы и приделать к ним отдельное питание.
И здесь я вас разочарую. Я конечно не вижу, как у вас всё собрано, но поверьте, по сказанному вами очень хорошо представляю, что у вас происходит со схемой. Даже если вы не отломаете ножки и сделаете всё очень аккуратно, вы впустую потратите время и будете расстроены результатом.

Цитата Сообщение от XSany Посмотреть сообщение
сам я плату сделать не могу.
Именно так я вас и понял, поэтому и написал:
Цитата Сообщение от i8085 Посмотреть сообщение
Обсуждать дальше тему борьбы с наводками бессмысленно.
Попробуйте применить фильтрацию, если это допускают условия задачи. Хотя бы простейшее усреднение в скользящем окне. Судя по эпюрам, сигнал у вас вроде медленно меняется.
0
1 / 1 / 1
Регистрация: 27.06.2022
Сообщений: 8
29.06.2022, 14:20  [ТС]
i8085, чтобы вы не гадали как выглядит схема, выложу её фотку.



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

Сам сигнал импульсный 1-10 мкс с периодом 50-1000 мкс.
0
Эксперт по электронике
6500 / 3130 / 331
Регистрация: 28.10.2011
Сообщений: 12,305
Записей в блоге: 7
29.06.2022, 15:22
Неудивительно что в этой конструкции АЦП ловит много шума.
0
1 / 1 / 1
Регистрация: 27.06.2022
Сообщений: 8
29.06.2022, 15:50  [ТС]
locm, Если ногами МК не дёркать во время оцифровки сигнала, то результат вполне приемлемый.

https://www.cyberforum.ru/atta... 1656359130
0
1 / 1 / 1
Регистрация: 27.06.2022
Сообщений: 8
30.06.2022, 19:38  [ТС]
Лучший ответ Сообщение было отмечено i8085 как решение

Решение

Цитата Сообщение от i8085 Посмотреть сообщение
И здесь я вас разочарую. Я конечно не вижу, как у вас всё собрано, но поверьте, по сказанному вами очень хорошо представляю, что у вас происходит со схемой. Даже если вы не отломаете ножки и сделаете всё очень аккуратно, вы впустую потратите время и будете расстроены результатом.
Зря вы так. Нужно проверять на практике. На работе нашёлся "человек с руками" и сделал мне эту ювелирную работу:


И результатом я очень даже доволен, думал что будет значительно хуже.


Цитата Сообщение от locm Посмотреть сообщение
Неудивительно что в этой конструкции АЦП ловит много шума.
Дело не в конструкции.

Тему можно считать закрытой.
1
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
01.07.2022, 09:45
Стало значительнее лучше. Но обычно жалуются, что последние разряды АЦП шумят. А тут ещё какие то выбросы остались.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.07.2022, 09:45
Помогаю со студенческими работами здесь

Найти количество жуков и пауков, сидящих на берегу реки, по известному количеству ног тех и других
На берегу реки сидят жуки и пауки, у которых вместе N ног. У каждого жука по 6 ног, у паука по 8 ног. Известно, что ног у всех жуков в K...

Найти количество жуков и пауков, сидящих на берегу реки, по известному количеству ног тех и других
На берегу реки сидят жуки и пауки, у которых вместе N ног. У каждого жука по 6 ног, у паука по 8 ног. Известно, что ног у всех жуков в K...

Найти количество ног N у K-главого дракона, если у всех вместе A голов и B ног
добрый день. проблема с задачей. У каждой S-ножки 1 голова. Найти количество ног N у K-главого дракона, если у всех вместе A голов и B...

Согласование сигналов для АЦП
Приветствую! Помогите придумать схему согласования сигналов. В схемотехнике я новичок-любитель. Дано: 1. Вся схема питается...

Согласование сигналов для АЦП
Здравствуйте форумчане. Нужна помощь. Есть задача принять 8 аналоговых сигналов в диапазоне +10В до -10В и оцифровать его 24-битной АЦП....


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru