2025-01-18 01:58 AM
During simple task I need to measure Vrefint and Vbat, so, I open CubeMX and configure ADC to read Vrefint and Vbat
Than I setup a DMA to read values...
I write a really simple program:
/* USER CODE BEGIN PD */
#define ADC_BUF_SIZE 20
/* USER CODE END PD */
/* USER CODE BEGIN PV */
uint32_t adc_buffer [ADC_BUF_SIZE];
/* USER CODE END PV */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start_DMA (&hadc1, adc_buffer, ADC_BUF_SIZE);
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
HAL_Delay (200);
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
HAL_Delay (200);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
But I faced with really strange issue
When I configure Rank1 and Rank2 as Vrefint and run my program I get such results (i.e. ref value is 1492)
(value stored at 0x1FFF 7A2A close to this value, so, reading is correct)
When I configure Rank1 and Rank2 as Vbat and run my program I get such results (i.e. Vbat value is 1021)
But when I configure Rank1 as Vbat and Rank2 as Vrefint I get such values (also I can configure Rank1 as Vrefint and Rank2 as Vbat):
i.e. Vbat is 1021 (as previously) and Vrefint is 656 (previously 1492)
I try to change sampling time - doesn't help
I try to change resolution of ADC - doesn't help
I try to disable DMA - doesn't help
I try to use Enable/Disable Continuous Conversion Mode - doesn't help
I try to disable DMA and read ADC with polling mode - doesn't help
I try to use manual channel selection Vrefint like this
sConfig.Channel = ADC_CHANNEL_VREFINT;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_144CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
than run ADC, get result in polling mode, than change ADC channel to Vbat
sConfig.Channel = ADC_CHANNEL_VBAT;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_144CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
and Run ADC again in polling mode - doesn't help
I try to add pause for 10ms, 100ms, 1 seconds between conversions - doesn't help
I can remove Vbat from measuring and add more ADC channels to sequence (like IN0, IN1, Vrefint, IN4) - in this situation I get Vrefint 1492, but when I add Vbat to such sequence (i.e. IN0, Vbat, IN1, Vrefint, IN4) I get Vrefint as ~600, or some other values, but never 1492
Firstly I try it on my own PCB (STM32F401RCT) and faced with this problem, but now I run NUCLEO-F401RE board and see the same problem...
I think I'm doing something wrong, but I doesn't understanding what I missing in such simple task...
2025-01-18 02:06 AM