STM32對HAL庫的ADC(單通道非DMA)


在cubemx中進行設置。

 

 

 

模式設置成Independent mode, Date Alignment設置為數據右對齊。

右對齊跟左對齊的區別:12位二進制最大值為 0x0FFF 左對齊操作后的結果是 0xFFF0,右對齊后還是0x0FFF。反過來看 ,若寄存器里左對齊的數據值X (相當於實際數據*16,所以左對齊轉換的值要/16才是實際的值),則X>>4才是實際的數據。而右對齊,則是數據保持不變,采集到多少就多少。至於是按左對齊保存到寄存器還是按照右對齊,就看你的配置里如何選了。

然后Sampling Time選擇較高的采集時間,一般采樣時間越長,采集到的adc精度越高。

 while(1)
  {
        HAL_ADC_Start(&hadc1);
        HAL_ADC_PollForConversion(&hadc1, 50);
        if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
        {
        adcx =Get_Adc_Average(ADC_CHANNEL_3, 20);
        printf("%d\r\n", adcx);
        ADC_Value=adcx*3.3/4096;
        printf("測量電壓值為%.1fV\r\n", ADC_Value);
    //    HAL_UART_Transmit(&huart1,(uint8_t*)&ADC_Value, sizeof(ADC_Value), 0xffff);
        }
            HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
View Code
int fputc(int ch,FILE *f)
{
    uint8_t temp[1]={ch};
    HAL_UART_Transmit(&huart1,temp,1,2);
    return(ch);
}

uint16_t Get_Adc_Average(uint32_t ch,uint8_t times)
{
    uint32_t temp_val=0;
    uint8_t t;
    for(t=0;t<times;t++)
    {
        temp_val+=(uint16_t)HAL_ADC_GetValue(&hadc1);
        HAL_Delay(5);
    }
    return temp_val/times;
} 
View Code

上面為代碼。

首先要開啟ADC,

HAL_ADC_Start(&hadc1);

然后再等待ADC轉換完成。

HAL_ADC_PollForConversion(&hadc1, 50);

判斷轉換完成標志位是否設置。

HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)

HAL_ADC_STATE_REG_EOC表示轉換完成標志位,轉換數據可用。

 

在這里寫了一個adc取平均值的函數。主要用到了

HAL_ADC_GetValue(&hadc1)

即讀取ADC轉換數據,數據為12位。查看數據手冊可知,寄存器為16位存儲轉換數據,數據右對齊,則轉換的數據范圍為0~2^12-1,即0~4095。

 

 

 最后的adc值要轉換成標准的電壓值,即ADC_Value*3.3/4096。滿量程的adc值為2^12 = 4096.

即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM