STM32
直播中

yqdedli

9年用户 984经验值
擅长:控制/MCU
私信 关注
[问答]

stm32f030的AD转换,如何调用一次getadcvalue() 就采集一次数据?

  void adcinit(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        ADC_InitTypeDef ADC_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;        
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, GPIO_InitStruct);

        ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
        ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
        ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
        ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Upward;
        ADC_Init(ADC1, ADC_InitStruct);

        ADC_ChannelConfig(ADC1,ADC_Channel_0,ADC_SampleTime_55_5Cycles);        
        ADC_ChannelConfig(ADC1,ADC_Channel_1,ADC_SampleTime_55_5Cycles);
        ADC_ChannelConfig(ADC1,ADC_Channel_2,ADC_SampleTime_55_5Cycles);

        ADC_GetCalibrationFactor(ADC1);

        ADC_Cmd(ADC1,ENABLE);

}

/**************************************************************
*  Function Name         :   getadcvalue
*  Param                 :   void
*  Return Param          :   void
*  Description           :   获取adc转换结果
***************************************************************/
void getadcvalue(void)
{
    UINT32 idx;
        while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADRDY) == DISABLE);
        ADC_StartOfConversion(ADC1);
        for(idx = 0;idx < 3;idx++)
        {
      // while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == DISABLE);
           ADC1ConvValue[idx] = ADC_GetConversionValue(ADC1);
        }
        if(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOSEQ) == ENABLE)
        {
       ADC_ClearFlag(ADC1,ADC_FLAG_EOSEQ);
        }

}

用上面的代码可以实现序列通道单次转换吗?
目的:调用一次getadcvalue()  就采集一次数据
求大神指点,while(EOC)不注释掉的话,好像只能调用一次,手册上写,EOC不是读取数据后才会清零吗?




回帖(1)

1653339509.516700

2024-5-13 18:08:42
为了实现在STM32F030上使用ADC转换,并在调用一次`getadcvalue()`函数时采集一次数据,您需要完成以下步骤:

1. 初始化ADC和GPIO。
2. 配置ADC通道。
3. 启动ADC转换。
4. 读取ADC转换结果。

以下是详细的步骤和代码示例:

步骤1:初始化ADC和GPIO

```c
void adcinit(void) {
    GPIO_InitTypeDef GPIO_InitStruct;
    ADC_InitTypeDef ADC_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能ADC1时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // 使能GPIOA时钟

    // 配置PA1为模拟输入
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 初始化ADC
    ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; // 12位分辨率
    ADC_InitStruct.ADC_ScanConvMode = DISABLE; // 单通道模式
    ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; // 连续转换模式
    ADC_Init(ADC1, &ADC_InitStruct);

    // 配置ADC通道
    ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_3Cycles); // 选择PA1作为ADC通道

    // 使能ADC
    ADC_Cmd(ADC1, ENABLE);

    // 启动ADC校准
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1) == RESET) {
        // 等待校准完成
    }

    // 使能ADC DMA请求
    ADC_DMACmd(ADC1, ENABLE);
}
```

步骤2:配置ADC通道(已在步骤1中完成)

步骤3:启动ADC转换(已在步骤1中使能ADC)

步骤4:实现`getadcvalue()`函数,读取ADC转换结果

```c
uint16_t getadcvalue(void) {
    __HAL_ADC_ENABLE(&hadc1); // 使能ADC
    HAL_ADC_Start(&hadc1); // 启动ADC转换

    while (__HAL_ADC_GET_STATE(&hadc1) != HAL_ADC_STATE_EOC) {
        // 等待转换完成
    }

    return HAL_ADC_GetValue(&hadc1); // 返回转换结果
}
```

在您的主函数中,调用`adcinit()`进行初始化,然后通过调用`getadcvalue()`函数来获取ADC转换结果。

```c
int main(void) {
    adcinit(); // 初始化ADC

    while (1) {
        uint16_t adc_value = getadcvalue(); // 获取ADC转换结果
        // 根据需要处理adc_value
    }
}
```

这样,每次调用`getadcvalue()`函数时,都会采集一次ADC数据。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分