serglg 0 18 января, 2018 Опубликовано 18 января, 2018 · Жалоба Там в каких единицах? ADC1 у меня задан 12-бит. При 0,4 вольта на входе считываю 25. При 3,3 вольта - 204. Я увидел, что там Vbat/4. Но всё равно при 3,3В получается 816. Опорное у меня - VDDA=3,3V. У них там разрядность особая для этого входа? Монотонность видна, но как считать? Так и принять 3300мВ=816? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 января, 2018 Опубликовано 18 января, 2018 · Жалоба Вот так вычисляю напряжение батареи в милливольтах. Перед этим внутреннее опорное измеряю (храню в Sensors.Ref). Вот с ним и сравниваю. Там еще делитель напряжения с батареи (он на 2 делит) включаю перед измерением, а после измерения выключаю. Потому и сдвигаю результат. uint32_t Bat = (ADC1->DR << 1) * 1210 / Sensors.Ref; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serglg 0 18 января, 2018 Опубликовано 18 января, 2018 · Жалоба Вот так вычисляю напряжение батареи в милливольтах. Перед этим внутреннее опорное измеряю. Вот с ним и сравниваю. Там еще делитель напряжения с батареи (он на 2 делит) включаю перед измерением, а после измерения выключаю. uint32_t Bat = (ADC1->DR << 1) * 1210 / Sensors.Ref; А что такое 1210? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 января, 2018 Опубликовано 18 января, 2018 · Жалоба А что такое 1210? Внутреннее опорное напряжение в милливольтах, согласно datasheet. Проверьте еще, к какому краю данные в АЦП прижаты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 23 19 октября, 2019 Опубликовано 19 октября, 2019 · Жалоба кристалл 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 бит с каким то смещением нуля Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serglg 0 20 октября, 2019 Опубликовано 20 октября, 2019 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 20 октября, 2019 Опубликовано 20 октября, 2019 · Жалоба Зачем магические числа, если у МК есть регистры, где хранятся эти калибровочные величины? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 23 20 октября, 2019 Опубликовано 20 октября, 2019 · Жалоба Зависимость получается вот такая. Хоть полиномом по ней проеззжай 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 октября, 2019 Опубликовано 20 октября, 2019 · Жалоба Как насчет этого? Из руководства на подобный микроконтроллер. Цитата 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 подаёте? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 23 20 октября, 2019 Опубликовано 20 октября, 2019 · Жалоба да мне было удобно с pc3 3.3 подавать. но я мультиметром смотрю, что подавать. хотя, можно напрямую от питания подавать. я уже смотрел что непосредственно на ножку процессора приходит. вообще говоря , то, что там намерял ацп очень похоже на прямое напряжение на диоде. при этом какой то ток с ножки процессора не потребляется (на ножке спокойно регулируется от 0 до 33). и ни о каких 1/3 как в документации написано тоже говорить не получается. только если очень очень пофантазировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 октября, 2019 Опубликовано 20 октября, 2019 · Жалоба А регулируете от 0 до 3,3 В как? Если высокоомным делителем, тогда не годится. И про делитель пополам я выше писал. Чтобы измерять напряжение выше питания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 23 20 октября, 2019 Опубликовано 20 октября, 2019 · Жалоба килоомный переменный резистор и 340 ом с движка на вывод vbat/ по документации пишут что делитель делит напряжение на 3. да, меняю от 0 до 3.3 на ножке процессора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 октября, 2019 Опубликовано 20 октября, 2019 · Жалоба Возможно, в вашем МК делитель на 3. Хотя, зачем на 3, не понимаю. Вы его включили, когда измеряете? Потом лучше выключить, чтобы не тратить батарейку. И дальше, что-то питается от этой цепи Vbat внутри МК? Если те ножки, что выше ссылку давал, закорочены на землю, к примеру, значит, будут забирать ток с той ножки через тот резистор, о которых говорите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 23 20 октября, 2019 Опубликовано 20 октября, 2019 · Жалоба делитель на 3. питаются регистры. да я специально акцентировал что подключаю делитель к выводу vbat/ пример использования измерения напряжения с этого вывода так и не нашел. слежу чтобы от ножки отключились резисторы заряда батареи. ну. очень много времени угрохал. казалось что этот узел работает и просто надо разобраться. похоже, идея с реле или коммутатором с измерением обычным входом ацп гораааздо правильная. попробую полиномом прикрыть все эти стмовские косяки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 октября, 2019 Опубликовано 20 октября, 2019 · Жалоба 25 минут назад, firstvald сказал: да я специально акцентировал что подключаю делитель к выводу vbat Я говорю про внутренний делитель в МК. Снаружи ничего не надо. У меня всё измеряется, как положено. Как выше писал, сравниваю код измерения Vbat/2 с кодом измерения внутреннего опорного напряжения. Снаружи, естественно, ничего не цеплял, даже для эксперимента. Только батарейка. 25 минут назад, firstvald сказал: попробую полиномом прикрыть все эти стмовские косяки Не спешите гнать на STM. Соедините Vbat с Vdd и добейтесь, что Vbat измеряется как 3,3 В или сколько там у вас. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться