Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 12.11.2018
Сообщений: 362
1

Некорректные данные АЦП

20.01.2021, 13:17. Просмотров 1077. Ответов 9

Настроил несколько каналов АЦП по запуску от таймера, для проверки соединил с землей все входа АЦП. Данные отправляю по USART. Получаю примерно такой результат:
ADC0: 11
ADC1: 862
ADC2: 0

ADC0: 0
ADC1: 1032
ADC2: 24

ADC0: 1
ADC1: 0
ADC2: 0

ADC0: 0
ADC1: 299
ADC2: 0

ADC0: 0
ADC1: 704
ADC2: 0

Может кто знает почему такие значения?

Плата stm32f746 nucleo
Цикл while
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
      if(AdcDataReady == 1)
      {
          snprintf(send_str, 50, "ADC0: %lu\r\n", adcDataBuf[0]);
          HAL_UART_Transmit(&huart3, (uint8_t*)send_str, strlen(send_str), 100);
 
          snprintf(send_str, 50, "ADC1: %lu\r\n", adcDataBuf[1]);
          HAL_UART_Transmit(&huart3, (uint8_t*)send_str, strlen(send_str), 100);
 
          snprintf(send_str, 50, "ADC2: %lu\r\n", adcDataBuf[2]);
          HAL_UART_Transmit(&huart3, (uint8_t*)send_str, strlen(send_str), 100);
 
          snprintf(send_str, 50, "\r\n");
          HAL_UART_Transmit(&huart3, (uint8_t*)send_str, strlen(send_str), 100);
 
          AdcDataReady = 0;
      }
      else
      {
          HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
          HAL_Delay(1000);
      }
main
C
1
2
  HAL_ADC_Start_DMA(&hadc3, (uint16_t*)&adcDataBuf, 3);
  HAL_TIM_OC_Start(&htim4, TIM_CHANNEL_4);
Прерывание от DMA
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    if(hadc->Instance == ADC3)
    {
        AdcDataReady = 1;
 
        //HAL_UART_Transmit(&huart3, (uint8_t*)adcDataBuf, sizeof(adcDataBuf), 100);
 
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
    }
    else
    {
        __NOP();
    }
}
0
Миниатюры
Некорректные данные АЦП   Некорректные данные АЦП   Некорректные данные АЦП  

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.01.2021, 13:17
Ответы с готовыми решениями:

stm32f4 discovery некорректные данные в USART_DR
Добрый день! разбираюсь с работой USORT, проект пишу в IAR. Настроил UART, отсылаю в терминале на...

RTC портит данные АЦП
Разрабатываю полумедицинский прибор на основе stm32l151. Носимый, то есть требуется и какая-никакая...

Данные с двух каналов АЦП по очередно.[Решено]
Всем привет. Столкнулся с непоняткой, чип stm8s003f на время теста подцепил два переменных...

Прочитать данные с ацп AD7799
Привет народ! Всех с наступающим!В общем не могу прочитать данные с ацп AD7799, когда датчик не...

9
1856 / 1181 / 114
Регистрация: 04.01.2010
Сообщений: 4,208
20.01.2021, 13:24 2
смущает
C
1
HAL_ADC_Start_DMA(&hadc3, (uint16_t*)&adcDataBuf, 3);
adcDataBuf у Вас и так указатель на массив.
0
2721 / 1236 / 166
Регистрация: 28.10.2011
Сообщений: 4,577
Записей в блоге: 6
20.01.2021, 18:06 3
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
Прерывание от DMA
Это прерывание от АЦП.
0
2 / 2 / 0
Регистрация: 12.11.2018
Сообщений: 362
21.01.2021, 06:52  [ТС] 4
Цитата Сообщение от locm Посмотреть сообщение
Это прерывание от АЦП
Ну там в HAL для прерывания от АЦП и от DMA используется один и тот же коллбэк, поэтому не суть, но все-таки генерируется он по окончанию работы DMA, ну и глобальные прерывания настроены только у DMA. Но опять же, мне не принципиально как его называть, прерывание от DMA или от АЦП

Добавлено через 37 минут
Voland_,
Цитата Сообщение от Voland_ Посмотреть сообщение
adcDataBuf у Вас и так указатель на массив.
Во всех примерах вроде так и пишут
C
1
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc, 20);
https://istarik.ru/blog/stm32/113.html
0
Модератор
Эксперт по электронике
8333 / 6185 / 829
Регистрация: 14.02.2011
Сообщений: 21,482
21.01.2021, 08:56 5
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
Во всех примерах вроде так и пишут
разницу видишь?
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
adc
и
Цитата Сообщение от DmitryDDDD Посмотреть сообщение
&adcDataBuf
что означает значок & ?
1
2 / 2 / 0
Регистрация: 12.11.2018
Сообщений: 362
21.01.2021, 09:57  [ТС] 6
ValeryS, Ага, указатель на область памяти, в данном случае на массив, куда писать данные с АЦП
Но мне кажется проблема в другом, т.к. изменила на
C
1
HAL_ADC_Start_DMA(&hadc3, (uint16_t*)adcDataBuf, 3);
Пока не помогло
ADC0: 97
ADC1: 0
ADC2: 0

ADC0: 0
ADC1: 1092
ADC2: 0

ADC0: 0
ADC1: 562
ADC2: 0
0
2 / 2 / 0
Регистрация: 12.11.2018
Сообщений: 362
22.01.2021, 07:30  [ТС] 7
Voland_, locm, ValeryS, Настроил просто АЦП для единичного измерения по программному запуску, и ЦАП на выход в половину напряжения, т.е. 2048
Получаю
ADC0 2084
ADC0 2041
ADC0 2022
ADC0 2053
ADC0 2023
ADC0 1869
ADC0 1948
Разброс больше чем на 2 сотни значений, что примерно 156 млВ. Это нормально для АЦП в подобных платах (stm32f746 nucleo)?
0
Модератор
Эксперт по электронике
8333 / 6185 / 829
Регистрация: 14.02.2011
Сообщений: 21,482
22.01.2021, 09:48 8
DmitryDDDD, посмотри ка осциллографам питающее и опорное напряжение
0
1856 / 1181 / 114
Регистрация: 04.01.2010
Сообщений: 4,208
22.01.2021, 10:40 9
Лучший ответ Сообщение было отмечено DmitryDDDD как решение

Решение

Цитата Сообщение от DmitryDDDD Посмотреть сообщение
Это нормально для АЦП в подобных платах (stm32f746 nucleo)?
думаю нет. Нужно поизучать причину такого результата. Про референц Вам уже сказали, но посмотрите по схеме - может на плате что-то еще сидит на ноге АЦП? Ну, и для тестов - попробуйте померять какой-то внешний сигнал (от батарейки 1,5В, например), попробуйте померять температуру и собственное напряжение (это внутренние сигналы). Это много может разъяснить.
1
2 / 2 / 0
Регистрация: 12.11.2018
Сообщений: 362
27.01.2021, 11:21  [ТС] 10
Voland_, ValeryS,
Цитата Сообщение от Voland_ Посмотреть сообщение
но посмотрите по схеме - может на плате что-то еще сидит на ноге АЦП?
Да, действительно на используемых ногах мк что-то сидело (уже точно не помню что), изменил ножки, все стало работать нормально, всем спасибо за помощь). С этими платами всегда надо внимательным быть.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2021, 11:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как усреднить данные с АЦП по 4м значениям?
atmega 16 сделать усреднение результата оцифровки (среднее арифметическое) по четырем измерениям....

Как получить данные с АЦП? (WinAvr)
сабж. пробовал всякие глупости но ничего толкового не получил. хочу сделать контролируемое...

Данные АЦП в ATmega128 надо отобразить на MT-16S2H по 8-ми линиям. На Assembler
Имеются микроконтроллер ATmega128 и индикатор MT-16S2H. Надо данные с выхода АЦП микроконтроллера...

Некорректные данные из com порта
Добрый день. ПК ОС Windows 10 x64. Есть линия на rs 485, на линии 4 устройства, каждое...

Отправляются некорректные данные на COM порт
Добрый день. У меня есть некое устройство которое подключено к COM23. Если на устройство передается...

Программа не распознаёт некорректные данные
Программа распознает ввод типа:"123 123 123 12 321 312 312 фав фвыа 2". А должна выдавать ошибку....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.