Перейти к содержанию
    

кто-нибудь измерял вход Vbat у STM32?

Там в каких единицах? ADC1 у меня задан 12-бит. При 0,4 вольта на входе считываю 25. При 3,3 вольта - 204. Я увидел, что там Vbat/4. Но всё равно при 3,3В получается 816. Опорное у меня - VDDA=3,3V. У них там разрядность особая для этого входа? Монотонность видна, но как считать? Так и принять 3300мВ=816?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так вычисляю напряжение батареи в милливольтах. Перед этим внутреннее опорное измеряю (храню в Sensors.Ref). Вот с ним и сравниваю.

Там еще делитель напряжения с батареи (он на 2 делит) включаю перед измерением, а после измерения выключаю. Потому и сдвигаю результат.

uint32_t Bat = (ADC1->DR << 1) * 1210 / Sensors.Ref;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Там еще делитель напряжения с батареи (он на 2 делит) включаю перед измерением, а после измерения выключаю.

uint32_t Bat = (ADC1->DR << 1) * 1210 / Sensors.Ref;

 

А что такое 1210?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что такое 1210?

Внутреннее опорное напряжение в милливольтах, согласно datasheet.

Проверьте еще, к какому краю данные в АЦП прижаты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кристалл L476/ по обычным входам читаю при 0 вольт  код 0 при 3. 3  в на входе  близкое к 0xfff. а вот попробовал почитать напряжение на vbat и получаю при 0 вольт код 0x25a, а при 3,3 вольтах 0x33a/ 

до измерения поставил

ADC1->CR|= ADC_CCR_VBATEN;//

 

/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_ADC1_Init();
  MX_RTC_Init();
  /* USER CODE BEGIN 2 */
	GPIOC->ODR|=GPIO_PIN_2|GPIO_PIN_3;// 1
	
	ADC1->CR|= ADC_CCR_VBATEN;//â ATM32L476xx.h
  /* USER CODE END 2 */


while (1)
  {
    /* USER CODE END WHILE */
    HAL_ADC_Start(&hadc1);
		
   
		GPIOC->ODR|=GPIO_PIN_8;// 1
		
    HAL_ADC_PollForConversion(&hadc1, 100);// 21 mks
		
    
		GPIOC->ODR&=~GPIO_PIN_8;// 1
		
    adcResult = HAL_ADC_GetValue(&hadc1);
		in_mv=(pwr_mv*adcResult)/0xfff;
    //bat_mv=(pwr_mv*adcResult*3)/0xfff;
		
    HAL_ADC_Stop(&hadc1);
    /* USER CODE BEGIN 3 */
  }


static void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_MultiModeTypeDef multimode = {0};
  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /**Common config 
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc1.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure the ADC multi-mode 
  */
  multimode.Mode = ADC_MODE_INDEPENDENT;
  if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_VBAT ;//ADC_CHANNEL_5     ;//ADC_CHANNEL_TEMPSENSOR;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

т е то что я вижу это разрешение 8 бит с каким то смещением нуля

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, firstvald said:

кристалл L476/ по обычным входам читаю при 0 вольт  код 0 при 3. 3  в на входе  близкое к 0xfff. а вот попробовал почитать напряжение на vbat и получаю при 0 вольт код 0x25a, а при 3,3 вольтах 0x33a/ 

до измерения поставил

ADC1->CR|= ADC_CCR_VBATEN;//

 

т е то что я вижу это разрешение 8 бит с каким то смещением нуля

 

Там не то чтобы смещение нуля.

Там при напряжении на Vbat меньше определенной величины измеряется всегда это величина. Сейчас уже не помню. Что вроде 0,9В. 

А сверх этой величины уже всё адекватно и линейно. И НЕ НАДО отнимать эти 0,9В

То есть просто невозможно измерить около нуля.

И по поводу 8 бит. Измеренное значение надо умножать на 4. Исходя из величины опорного напряжения и отсчитанного значения (именно по 12 битам, то есть весь диапазон 4095) чтобы получить правильное значение в вольтах.

Ну по крайней мере у меня так было на F446.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем магические числа, если у МК есть регистры, где хранятся эти калибровочные величины?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зависимость получается вот такая. Хоть полиномом по ней проеззжай

 

U in U adc U in/U adc
0.512 0.484 1.06
1.025 0.506 2.03
1.469 0.535 2.75
2.025 0.575 3.52
2.496 0.61 4.09
3.025 0.649 4.66

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как насчет этого? Из руководства на подобный микроконтроллер. 

Цитата

Due to the fact that the switch only sinks a limited amount of current (3 mA), the use of 
PC13 to PC15 GPIOs in output mode is restricted: the speed has to be limited to 2 MHz with 
a maximum load of 30 pF and these I/Os must not be used as a current source (e.g. to drive 
an LED).

Хотя, вы же прямо от некоего источника напряжение на Vbat подаёте?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да мне было удобно с pc3 3.3 подавать. но я мультиметром смотрю, что подавать. хотя, можно напрямую от питания подавать. я уже смотрел что непосредственно на ножку процессора приходит. вообще говоря ,  то, что там намерял ацп очень похоже на прямое напряжение на диоде. при этом какой то ток с ножки процессора не потребляется (на ножке спокойно регулируется от 0 до 33). и ни о каких 1/3 как в документации написано тоже говорить не получается. только если очень очень пофантазировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А регулируете от 0 до 3,3 В как? Если высокоомным делителем, тогда не годится.

И про делитель пополам я выше писал. Чтобы измерять напряжение выше питания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

килоомный переменный резистор и 340 ом с движка на вывод vbat/

по документации пишут что делитель делит напряжение на 3.

да,  меняю от 0 до 3.3 на ножке процессора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно, в вашем МК делитель на 3. Хотя, зачем на 3, не понимаю. Вы его включили, когда измеряете? Потом лучше выключить, чтобы не тратить батарейку.

И дальше, что-то питается от этой цепи Vbat внутри МК? Если те ножки, что выше ссылку давал, закорочены на землю, к примеру, значит, будут забирать ток с той ножки через тот резистор, о которых говорите.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

делитель на 3. питаются регистры. да я специально акцентировал что подключаю делитель к выводу vbat/   пример использования измерения напряжения с этого вывода так и не нашел. слежу чтобы от ножки отключились резисторы заряда батареи.

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

попробую полиномом прикрыть все эти стмовские косяки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 минут назад, firstvald сказал:

да я специально акцентировал что подключаю делитель к выводу vbat

Я говорю про внутренний делитель в МК. Снаружи ничего не надо.

У меня всё измеряется, как положено. Как выше писал, сравниваю код измерения Vbat/2 с кодом измерения внутреннего опорного напряжения. Снаружи, естественно, ничего не цеплял, даже для эксперимента. Только батарейка.

25 минут назад, firstvald сказал:

попробую полиномом прикрыть все эти стмовские косяки

Не спешите гнать на STM. Соедините Vbat с Vdd и добейтесь, что Vbat измеряется как 3,3 В или сколько там у вас.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...