在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 */ }

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; }
上面為代碼。
首先要開啟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.
即可。