|
Настройка ADC в STM32 |
|
|
|
Jul 25 2017, 05:45
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Есть возможность использовать откоректированное значение опорного напряжения. Цитата Calculating the actual VDDA voltage using the internal reference voltage The VDDA power supply voltage applied to the microcontroller may be subject to variation or not precisely known. The embedded internal voltage reference (VREFINT) and its calibration data acquired by the ADC during the manufacturing process at VDDA = 3.3 V can be used to evaluate the actual VDDA voltage level. The following formula gives the actual VDDA voltage supplying the device: VDDA = 3.3 V ₓ VREFINT_CAL / VREFINT_DATA Where: • VREFINT_CAL is the VREFINT calibration value • VREFINT_DATA is the actual VREFINT output value converted by ADC VREFINT_CAL как я понимаю мы берем из ADC1->CALFACT а VREFINT_DATA - откуда берем?
|
|
|
|
|
 |
Ответов
|
Jul 25 2017, 06:11
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Данные из канала АЦП, вестимо (ADC1_IN17). P.S. Я так понял, VREFINT_CAL есть только у L-серий. А у обычных F нужно это значение измерить. Т.е. если, скажем, мерить с точностью до сотых вольты (только зачем?), то VDDA = X / CH17 → X = VDDA * CH17 (считать лучше в uint32_t). Скажем, дает нам вольтметр 3.25В, а внутреннее опорное — 1540ADU, тогда X = 325*1540 = 500500, и в любой момент просто делим 500500 на данные с CH17, получая VDD.
Сообщение отредактировал Эдди - Jul 25 2017, 06:20
|
|
|
|
|
Jul 25 2017, 06:50
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Эдди @ Jul 25 2017, 11:11)  Данные из канала АЦП, вестимо (ADC1_IN17). P.S. Я так понял, VREFINT_CAL есть только у L-серий. А у обычных F нужно это значение измерить. Т.е. если, скажем, мерить с точностью до сотых вольты (только зачем?), то VDDA = X / CH17 → X = VDDA * CH17 (считать лучше в uint32_t). Скажем, дает нам вольтметр 3.25В, а внутреннее опорное — 1540ADU, тогда X = 325*1540 = 500500, и в любой момент просто делим 500500 на данные с CH17, получая VDD. только для L-серий? не знаю, у меня в STM32F303VCT6 есть ADC1->CALFACT. смотрим формулу Цитата VCHANNELx = 3.3 V * VREFINT_CAL * ADCx_DATA / VREFINT_DATA * FULL_SCALE
Where: • VREFINT_CAL is the VREFINT calibration value • ADCx_DATA is the value measured by the ADC on channel x (right-aligned) • VREFINT_DATA is the actual VREFINT output value converted by the ADC • FULL_SCALE is the maximum digital value of the ADC output. For example with 12-bit resolution, it will be 212 - 1 = 4095 or with 8-bit resolution, 28 - 1 = 255. "Данные из канала АЦП, вестимо" - это ADCx_DATA а VREFINT_DATA откуда?
|
|
|
|
|
Jul 25 2017, 07:26
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Jenya7 @ Jul 25 2017, 09:50)  VCHANNELx = 3.3 V * VREFINT_CAL * ADCx_DATA / VREFINT_DATA * FULL_SCALE Очевидно же. VREFINT_CAL - калибровка из ПЗУ. VREFINT_DATA - измеренное на канале АЦП Vrefint ADCx_DATA - измеренное на ином канале АЦП, результат именно этого измерения корректируется, приводится к вольтам и присваивается переменной VCHANNELx.
|
|
|
|
|
Jul 25 2017, 07:49
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(scifi @ Jul 25 2017, 12:26)  Очевидно же. VREFINT_CAL - калибровка из ПЗУ. VREFINT_DATA - измеренное на канале АЦП Vrefint ADCx_DATA - измеренное на ином канале АЦП, результат именно этого измерения корректируется, приводится к вольтам и присваивается переменной VCHANNELx. ааа понял. спасибо. то есть я должен измерить канал #define ADC_Channel_Vrefint ((uint8_t)ADC_Channel_18) я могу передать его в функцию в качестве аргумента? Код uint32_t ADC_Read(uint32_t channel) { uint32_t adc_val; ADC_RegularChannelConfig(ADCx, channel, 1, ADC_SampleTime_7Cycles5); /* Start ADC1 Software Conversion */ ADCx->CR |= ADC_CR_ADSTART; /* Test EOC flag */ while(ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC) == RESET); /* Get ADC1 converted data */ adc_val = (uint16_t)ADCx->DR; return adc_val; }
Сообщение отредактировал Jenya7 - Jul 25 2017, 07:49
|
|
|
|
|
Jul 25 2017, 07:53
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Jenya7 @ Jul 25 2017, 10:49)  я могу передать его в функцию в качестве аргумента? Это как хотите. Есть множество способов всё это организовать. Кстати, что за нездоровое увлечение типом uint32_t? Есть отличный тип int - всего 3 буквы, и работает ничуть не хуже. Код int ADC_Read(int channel) { ... return ADCx->DR; }
|
|
|
|
|
Jul 25 2017, 07:58
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(scifi @ Jul 25 2017, 12:53)  Это как хотите. Есть множество способов всё это организовать. Кстати, что за нездоровое увлечение типом uint32_t? Есть отличный тип int - всего 3 буквы, и работает ничуть не хуже. Код int ADC_Read(int channel) { ... return ADCx->DR; } рекомендуют так - uint32_t, для портабилити. int он signed вообще то.
|
|
|
|
|
Jul 25 2017, 08:07
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Jenya7 @ Jul 25 2017, 10:58)  рекомендуют так - uint32_t, для портабилити Это глупости и танцы с бубном. Какая такая портабилити кода, написанного для STM32? На другой STM32 он перенесётся и так, и эдак. Цитата(Jenya7 @ Jul 25 2017, 10:58)  int он signed вообще то. Ну и что? Почему-то это никому не мешает делать, к примеру, вот так: for (int i = 0; i < 10000; i++) С другой стороны, я не настаиваю. Просто int короче. Ну и красивше, но это субъективное.
|
|
|
|
Сообщений в этой теме
Jenya7 Настройка ADC в STM32 Jul 25 2017, 05:45       Jenya7 Цитата(scifi @ Jul 25 2017, 13:02) Это гл... Jul 25 2017, 08:07  Эдди Цитата(Jenya7 @ Jul 25 2017, 09:50) тольк... Jul 25 2017, 08:15 scifi Прошу прощения, что нечаянно набросил про int. Бою... Jul 25 2017, 08:30 Jenya7 Цитата(scifi @ Jul 25 2017, 13:30) Прошу ... Jul 25 2017, 08:45  Эдди Цитата(Jenya7 @ Jul 25 2017, 11:45) ADC1-... Jul 25 2017, 09:55 scifi Здрассте, приехали.
ADC1->CALFACT - это совсем ... Jul 25 2017, 09:55 Jenya7 Цитата(scifi @ Jul 25 2017, 14:55) Здрасс... Jul 25 2017, 10:16  scifi Цитата(Jenya7 @ Jul 25 2017, 13:16) ой. ч... Jul 25 2017, 10:40   Jenya7 Цитата(scifi @ Jul 25 2017, 15:40) 0x1FFF... Jul 25 2017, 11:00    scifi Цитата(Jenya7 @ Jul 25 2017, 14:00) нету.... Jul 25 2017, 11:07     Jenya7 Цитата(scifi @ Jul 25 2017, 16:07) Фигасе... Jul 25 2017, 11:46      Obam Цитата(Jenya7 @ Jul 25 2017, 15:46) спаси... Jul 25 2017, 12:15       Jenya7 Цитата(Obam @ Jul 25 2017, 17:15) Аграмад... Jul 25 2017, 12:21        Obam Цитата(Jenya7 @ Jul 25 2017, 16:21) как э... Jul 25 2017, 12:40      scifi Цитата(Jenya7 @ Jul 25 2017, 14:46) спаси... Jul 25 2017, 12:16       Jenya7 Цитата(scifi @ Jul 25 2017, 17:16) А поче... Jul 25 2017, 12:52    Эдди Цитата(Jenya7 @ Jul 25 2017, 14:00) весь ... Jul 25 2017, 11:12
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|