如何读取多个ADC输入并以C语言为STM32F4打印

问题描述 投票:0回答:1

我正在使用MCU STM32F4,我想使用Hal库读取ADC输入,并在终端上显示它们。我的ADC输入正在连续转换模式下运行,并且通过计时器的滴答来调用转换。

ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim2;
char buffer[10];
uint32_t adc1, adc2, adc3;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
{
    if(htim->Instance == TIM2)
    {
        HAL_ADC_Start(&hadc1);

        HAL_ADC_PollForConversion(&hadc1,300);
        adc1 = HAL_ADC_GetValue(&hadc1);
        sprintf(buffer,"A1: %d ",(int)adc1);
        CDC_Transmit_FS((uint8_t*)buffer,9);

        HAL_ADC_PollForConversion(&hadc1,300);
        adc2 = HAL_ADC_GetValue(&hadc1);
        sprintf(buffer,"A2: %d  ",(int)adc2);
        CDC_Transmit_FS((uint8_t*)buffer,5);

        HAL_ADC_Stop(&hadc1);

        if(adc1  > 1000)
        {
            HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,1);
        }
        else
        {
            HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,0);
        }
    }
}

如果我有一个要监视的频道,则上面的代码有效。但是,如果我使用多个通道,则输出仅显示通道2的值,如下图所示。

Terminal Output

我不知道发生了什么。你能帮我吗?

c adc stm32f4
1个回答
0
投票

event handler function中,您可以通过状态机建立索引,即switch语句,其中包含要监视的每个事件的用例,在这种情况下,您要读取的每个通道:

内部事件处理程序功能:(伪代码示例)

enum {
    INIT,
    ADC1,
    ADC2,
    //and so on
};  

while(gRunning) {

    switch(state) {
        case INIT:
           //call init function
           state = ADC1;
           break;
        case ADC1:
          //read value for ADC1
          state = ASC2;
          break;
          //and so on
          //...
        case ADCn
          //read ADCn
          state = ADC1;
          break;
    }
    sleep(<some small value>);
}

也请考虑使用C volatile modifier

© www.soinside.com 2019 - 2024. All rights reserved.