Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 760
1

Как работает ADC в STM32 ?

16.06.2018, 13:01. Просмотров 3987. Ответов 24
Метки нет (Все метки)

Добрый день !

Я тут балуюсь с Нуклео бордом и хочу замерить напряжение через ADC. Недолго думая взял питание с платы 3.3В, подвел к двум одинаковым сопротивлениям на матрице и второй конец посадил на граунд. Нашел пример кода в интернете и пытаюсь замерить напряжения на гроунд, середине сопротивлений и на максимуме. Получаю какие то числа типа 40XX. Что они означают ? Это милливольты или что ? И почему у меня значения во всех 3-х точках примерно одинаковые, типа 40ХХ ?

Буду рад за обьяснения...

Добавлено через 53 минуты
Пока непонятно следующее - почему, когда я сажаю лапку ADC_IN3 на GND на плате, то все равно выдает значение типа 40ХХ, то есть считывает не 0 вольт, а почти максимум ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2018, 13:01
Ответы с готовыми решениями:

Adc в stm32
Нужно подключить аналоговый датчик и снять с него показания. Раньше делал это через ацп в атмеге,...

Stm32 adc
Столкнулся с таким проблемой, запускаю ацп 2-х канальная, работает только один канал если меняю...

Stm32, ADC
Имеется отладочная плата с STM32F100RB. Немного поигрался, помигал диодиком по таймеру, теперь...

STM32, HAL & ADC
Подскажите, в чем проблема в следующем коде инициализации и вывода значений АЦП? Проект успешно...

24
823 / 501 / 164
Регистрация: 30.07.2015
Сообщений: 1,655
16.06.2018, 14:02 2
max_sk, неправильная настройка АЦП или пинов. Тут провидцев нет, скидывай код. Числа которые выдает АЦП это код соответствующий напряжению. Почитай про АЦП хоть на википедии
1
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 760
16.06.2018, 15:32  [ТС] 3
Спасибо за ответ. Код выложить не могу, пишу с телефона.

Я вообще то сделал это упражнение в CubeMX. Задал ножку ADC_IN3 и запустил сделать код. Я правильно понимаю, что там нужно еще Vref как то задать ?
0
823 / 501 / 164
Регистрация: 30.07.2015
Сообщений: 1,655
16.06.2018, 15:37 4
max_sk, смотря какой камень, у некоторых он задается на пине Vref. У некоторых он желехно привязан к пину VDDA. Vref - опорное напряжение относительно которого измеряется напряжения на входах АЦП.

Формула преобразования в напряжения такая https://www.cyberforum.ru/cgi-bin/latex.cgi?U =\frac{{V}_{ref}X}{{2}^{n}} где X - код АЦП, n - разрядность АЦП, Vref - опорное напряжение
1
Модератор
Эксперт по электронике
8229 / 6096 / 814
Регистрация: 14.02.2011
Сообщений: 21,170
16.06.2018, 15:50 5
Цитата Сообщение от max_sk Посмотреть сообщение
Я вообще то сделал это упражнение в CubeMX.
а как запускал?
прерывания используешь?
какой канал инжекторный или регулярный?
используешь или нет DMA?
калибровку провел?
1
823 / 501 / 164
Регистрация: 30.07.2015
Сообщений: 1,655
16.06.2018, 15:52 6
ValeryS, да я так понимаю, там просто собранный проект в кубе, в виде одной галочки - включить АЦП канал 3)) Что там внутри происходит автор особо не знает да и мы тоже. Нужен код )
1
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 760
16.06.2018, 18:49  [ТС] 7
Не, ну я даташит и теорию почитал. Делаю методом поллинга, DMA не использую... Насчет канала перечитаю референс мануал еще раз...

А вот насчет калибровки можно поподробнее ?

Добавлено через 56 минут
Пока что мне точность не важна. Я хочу понять, почему, когда я сажаю ADC_IN3 на GND дает теже результаты, как и когда я сажаю ADC_IN3 на 3.3V.
0
Модератор
Эксперт по электронике
8229 / 6096 / 814
Регистрация: 14.02.2011
Сообщений: 21,170
16.06.2018, 19:11 8
Цитата Сообщение от max_sk Посмотреть сообщение
когда я сажаю ADC_IN3
adc то какой? там их может быть до трех штук
камень то какой?
1
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 760
16.06.2018, 19:38  [ТС] 9
Камень STM32L152RE. ADC первый.
0
Модератор
Эксперт по электронике
8229 / 6096 / 814
Регистрация: 14.02.2011
Сообщений: 21,170
16.06.2018, 20:56 10
Цитата Сообщение от max_sk Посмотреть сообщение
Камень STM32L152RE. ADC первый.
осталось посмотреть код
хотя бы инициализацию и вызов функции начала преобразования

Добавлено через 5 минут
Цитата Сообщение от max_sk Посмотреть сообщение
STM32L152RE
там ADC один единственный а вот канал ADC_IN3 очень хитрый, попробуй для начала канал попроще
1
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 760
17.06.2018, 12:24  [ТС] 11
Таки мне разрешили выложить код, на этом этапе.

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
/* ADC init function */
static void MX_ADC_Init(void)
{
 
  ADC_ChannelConfTypeDef sConfig;
  
  __ADC1_CLK_ENABLE(); // by me
 
    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) 
    */
  hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  hadc.Init.LowPowerAutoWait = ADC_AUTOWAIT_DISABLE;
  hadc.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_DISABLE;
  hadc.Init.ChannelsBank = ADC_CHANNELS_BANK_A;
  hadc.Init.ContinuousConvMode = DISABLE;
  hadc.Init.NbrOfConversion = 1;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; // ???
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = DISABLE;
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
 
    /**Configure the channel speed in Fast mode 
    */
  __HAL_ADC_CHANNEL_SPEED_FAST(ADC_CHANNEL_3);
 
    /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. 
    */
  sConfig.Channel = ADC_CHANNEL_3;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_4CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
 
}
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
void prvADCTask ( void *pvParameters )
{
uint32_t AdcValue=0, error=0;
int AdcResult=0;
char buff[25];
 
 
while(1){
    if( (ADC_Enable(&hadc))==HAL_OK){
        HAL_UART_Transmit( &huart1, "ADC is ENABLED\r\n", 17, 100);
    }else{
        HAL_UART_Transmit( &huart1, "ADC is NOT enabled\r\n", 21, 100);
        error=HAL_ADC_GetError( &hadc );
    }
    
    if( (HAL_ADC_Start(&hadc))==HAL_OK){
        HAL_UART_Transmit( &huart1, "ADC is STARTED\r\n", 17, 100);
    }else{
        HAL_UART_Transmit( &huart1, "ADC is NOT started\r\n", 21, 100);
        error=HAL_ADC_GetError( &hadc );
    }
    
    if( (HAL_ADC_PollForConversion(&hadc, 100))==HAL_OK){
        HAL_UART_Transmit( &huart1, "ADC is made conversion\r\n", 25, 100);
    }else{
        HAL_UART_Transmit( &huart1, "ADC is NOT made conversion\r\n", 29, 100);
        error=HAL_ADC_GetError( &hadc );
    }
    
    AdcValue=HAL_ADC_GetValue( &hadc );
    AdcResult+=1;
    HAL_Delay(100);
    //memset( buff, '\0', sizeof(buff));
    //sprintf(buff, "Value of ADC is %d\r\n", (int)value );
    HAL_UART_Transmit( &huart1, (uint8_t *)&AdcValue, 25, 100);
    
    if( (ADC_ConversionStop_Disable(&hadc))==HAL_OK){
        HAL_UART_Transmit( &huart1, "End of ADC conversion\r\n", 24, 100);
    }else{
        HAL_UART_Transmit( &huart1, "NOT end of ADC conversion\r\n", 28, 100);
        error=HAL_ADC_GetError( &hadc );
    }
    
    if( (HAL_ADC_Stop(&hadc))==HAL_OK){
        HAL_UART_Transmit( &huart1, "END of ADC\r\n", 13, 100);
    }else{
        HAL_UART_Transmit( &huart1, "NOT end of ADC\r\n", 17, 100);
        error=HAL_ADC_GetError( &hadc );
    }
}
}
Добавлено через 1 час 3 минуты
Только сейчас дошло скачать примеры от производителя !!! Буду разбираться...

Но если подскажете, в чем моя ошибка в коде, тоже буду рад.
0
Модератор
Эксперт по электронике
8229 / 6096 / 814
Регистрация: 14.02.2011
Сообщений: 21,170
17.06.2018, 12:32 12
Цитата Сообщение от max_sk Посмотреть сообщение
HAL_UART_Transmit( &huart1, (uint8_t *)&AdcValue, 25, 100);
и что ты здесь хочешь получить?
нужно что то типа
C
1
2
3
char buf[80];
sprintf(buf,"%d",AdcValue);
HAL_UART_Transmit( &huart1,buf, 25, 100);
как у тебя в закомментированой строчке
Цитата Сообщение от max_sk Посмотреть сообщение
C
1
2
//memset( buff, '\0', sizeof(buff));
//sprintf(buff, "Value of ADC is %d\r\n", (int)value );
только вот зачем memset не понятно
1
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 760
17.06.2018, 12:52  [ТС] 13
Пока вывод не важен. Я значение переменной смотрю в Watch.

Я сделал так. Указал в Кубе лапку ADC_IN3, которая на плате обозначена как PA3. И нажал создать код. Потом в коде создал prvADCTask(). Я протянул джампер от PA3 сначала к входу 3.3V, затем к GND и начал смотреть в Watch'e, какие результаты выдает переменная AdcValue. А она показывает значения от 4036 до 4075, независимо от напряжения. А на самом деле разброс должен быть шире - от плюс минус нуля до 4095. Вот с этим и воюю.

А вывод на UART и перевод в напряжение - это следующий этап.
0
Модератор
Эксперт по электронике
8229 / 6096 / 814
Регистрация: 14.02.2011
Сообщений: 21,170
17.06.2018, 16:13 14
Цитата Сообщение от max_sk Посмотреть сообщение
Указал в Кубе лапку ADC_IN3, которая на плате обозначена как PA3.
а теперь зайди на третью вкладку и нажми кнопку ADC, увидишь еще кучу настроек
лапку ты как включал? через меню слева, или просто на лапке включил режим?

Добавлено через 2 минуты
Цитата Сообщение от max_sk Посмотреть сообщение
Но если подскажете, в чем моя ошибка в коде, тоже буду рад.
инициализации самой ножки не вижу
1
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 760
17.06.2018, 16:37  [ТС] 15
Я зашел в Куб, слева в Pinout открыл ADC, выбрал IN3 в выпадающем окне, установил скорость Fast. Затем зашел в Configuration , выбрал ADC, выбрал Parameters Settings, но там ничего не менял ( резолюция стояла 12 бит ), затем зашел в GPIO settings, но там ничего не дает менять.

Я тоже у себя в коде лапки не вижу. Сейчас выложу GPIO_init ()...

Добавлено через 1 минуту
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
static void MX_GPIO_Init(void)
{
 
  GPIO_InitTypeDef GPIO_InitStruct;
 
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_13 
                          |GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9, GPIO_PIN_RESET);
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_RESET);
 
  /*Configure GPIO pins : PA0 PA1 PA2 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
  /*Configure GPIO pins : PB1 PB12 */
  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
  /*Configure GPIO pins : PB2 PB10 PB11 PB13 
                           PB14 PB15 PB9 */
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_13 
                          |GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
  /*Configure GPIO pin : PC7 */
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 
  /*Configure GPIO pin : PC8 */
  GPIO_InitStruct.Pin = GPIO_PIN_8;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 
  /*Configure GPIO pins : PA11 PA12 */
  GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
  /*Configure GPIO pins : PB5 PB8 */
  GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_8;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
}
Добавлено через 4 минуты
Пробовал дописывать код настроек вручную, но нужного результата не получил...
0
823 / 501 / 164
Регистрация: 30.07.2015
Сообщений: 1,655
18.06.2018, 09:31 16
max_sk, вы говорите про пин PA3, а на деле настраиваются какие угодно пины только не PA3
C
1
2
3
4
5
6
7
8
9
10
11
  /*Configure GPIO pins : PA0 PA1 PA2 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
  /*Configure GPIO pins : PB1 PB12 */
  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
Разберитесь все таки уже, на каком пине какой канал, ибо если у вас измерительный пин висит "в воздухе" он легко может давать 4000-4095 результата
1
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 760
18.06.2018, 10:08  [ТС] 17
_SayHello, спасибо за ответ. Просто у меня по проекту задан ряд пинов как аналоговые входы. Хорошо, я попробую выбрать какой нибудь свободный пин и запрограммировать его как вход ADC. Надеюсь, Куб создаст код...
0
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 760
19.06.2018, 12:49  [ТС] 18
Я выбрал другой пин, ADC_IN11, это пин PC1, но опять же, код не был создан. Выкладываю :

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
static void MX_GPIO_Init(void)
{
 
  GPIO_InitTypeDef GPIO_InitStruct;
 
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_13 
                          |GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9, GPIO_PIN_RESET);
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
 
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_RESET);
 
  /*Configure GPIO pins : PA0 PA1 PA2 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
  /*Configure GPIO pins : PB1 PB12 */
  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
  /*Configure GPIO pins : PB2 PB10 PB11 PB13 
                           PB14 PB15 PB9 */
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_13 
                          |GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
  /*Configure GPIO pin : PC7 */
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 
  /*Configure GPIO pin : PC8 */
  GPIO_InitStruct.Pin = GPIO_PIN_8;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 
  /*Configure GPIO pins : PA11 PA12 */
  GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
  /*Configure GPIO pins : PB5 PB8 */
  GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_8;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
}
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
static void MX_ADC_Init(void)
{
 
  ADC_ChannelConfTypeDef sConfig;
 
    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) 
    */
  hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  hadc.Init.LowPowerAutoWait = ADC_AUTOWAIT_DISABLE;
  hadc.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_DISABLE;
  hadc.Init.ChannelsBank = ADC_CHANNELS_BANK_A;
  hadc.Init.ContinuousConvMode = DISABLE;
  hadc.Init.NbrOfConversion = 1;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = DISABLE;
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
 
    /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. 
    */
  sConfig.Channel = ADC_CHANNEL_VREFINT;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_4CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
 
}
0
Модератор
Эксперт по электронике
8229 / 6096 / 814
Регистрация: 14.02.2011
Сообщений: 21,170
19.06.2018, 14:11 19
Цитата Сообщение от max_sk Посмотреть сообщение
это пин PC1, но опять же, код не был создан.
не там смотришь
при инициализации АЦП должна вызываться функция которая и инициализирует ножку
1
86 / 13 / 2
Регистрация: 11.04.2015
Сообщений: 760
19.06.2018, 14:48  [ТС] 20
Тупой я, что ли... :-((((

Во первых, из main.c сначала вызывается функция MX_ADC_Init(), которая инициализирует ADC. Я ее выложил выше. Где там вызов функции, которая инициализириует ножку ? Я просмотрел функции HAL_ADC_Init() и HAL_ADC_ConfigChannel(), но инициализации лапки там не увидел.


Во вторых, когда я запускаю код, у меня переменная AdcValue получает значения от 1510 до 1512, независимо, запитана ли лапка PC1 на GND или на 3.3V.


Обьясните мне, что я делаю не так ? :-(((((
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2018, 14:48

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

Настройка ADC в STM32
Есть возможность использовать откоректированное значение опорного напряжения. VREFINT_CAL как я...

STM32 Проблемы с ADC (АЦП)
Здравствуйте, подскажите пожалуйста где ошибка. Была написана простая программа для...

stm32 adc Scan (multichannels)
Столкнулся с таким проблемой, запускаю ацп 2-х канальная, работает только один канал если меняю...

STM32 ADC Int to String
Добрый вечер! В моем проекте необходимо отправлять данный с АЦП по USORT. Столкнулся со следующей...


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

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

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