【STM32CubeMX】5,STM32之ADC
1,初步配置。對於滑動變阻器的電壓輸出
還有就是printf、scanf的重定向,在uart.c中
int fputc (int ch ,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xfff);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
HAL_UART_Receive(&huart1,(uint8_t *)&ch,1,0xfff);
return ch;
}
2,以輪尋模式來執行
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_ADC_Start(&hadc2); HAL_ADC_PollForConversion(&hadc2, 50); if(HAL_ADC_STATE_REG_EOC)//²»»á×Ô¶¯¸´Î» { ADC_ConvertedValue=HAL_ADC_GetValue(&hadc2); ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue); printf("\r\n The current AD value = %f V \r\n",ADC_ConvertedValueLocal); } HAL_Delay(1000); } /* USER CODE END 3 */ 使用下面函式中的一個啟用ADC外設: HAL_ADC_Start() -- 輪詢模式 HAL_ADC_Start_IT(), -- 中斷模式 HAL_ADC_Start_DMA(). -- DMA模式 ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; //不同的型別有不同的轉換公式,但一般都要除以4096
3,不同的模式進入賦值的判斷語句不同
例子,ADC工作狀態均為非阻塞
1 輪詢模式 -- 非阻塞
1 2 3 4 5 6 7 8 9 10 |
|
2 中斷模式
1 2 3 4 5 6 7 |
|
3 DMA模式
1 2 3 4 5 6 7 |
|
4、幾個函式
callback函式
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc);
void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc);
void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc);
ADC中斷、DMA傳輸、看門狗超過閥值、發生Adc錯誤,這些函式返回前都呼叫了Callback函式,
用來在非中斷模式下處理Adc資料,如果想進行一些操作可以直接修改Callback函式。
/**HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
官方給的解釋說明很好用
* @brief Get ADC regular group conversion result.
* @note Reading register DR automatically clears ADC flag EOC
* (ADC group regular end of unitary conversion).
* @note This function does not clear ADC flag EOS
* (ADC group regular end of sequence conversion).
* Occurrence of flag EOS rising:
* - If sequencer is composed of 1 rank, flag EOS is equivalent
* to flag EOC.
* - If sequencer is composed of several ranks, during the scan
* sequence flag EOC only is raised, at the end of the scan sequence
* both flags EOC and EOS are raised.
* To clear this flag, either use function:
* in programming model IT: @ref HAL_ADC_IRQHandler(), 在中斷模式下,參考HAL_ADC_IRQHandler()
in programming model polling: @ref HAL_ADC_PollForConversion() or @ref __HAL_ADC_CLEAR_FLAG(&hadc, ADC_FLAG_EOS).
在輪詢模式下,參考HAL_ADC_PollForConversion()或者__HAL_ADC_CLEAR_FLAG(&hadc, ADC_FLAG_EOS)
* @param hadc: ADC handle
* @retval ADC group regular conversion data
*/
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
{
/* Check the parameters */
assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
/* Note: EOC flag is not cleared here by software because automatically */
/* cleared by hardware when reading register DR. */
/* Return ADC converted value */
return hadc->Instance->DR;
}
uint32_tEOCSelection -- EOC(EndOfConversion),用來做輪詢或中斷標記;每個rank轉換結束,或序列轉換結束;
MSP:MCU Specific Package
5,DMA多通道的ADC
PC0對應ad1,PC1對應ad2,
看串列埠的資料,ad2的資料是對的。ad1是不是接了高電平???
5.2 增加ADC1的溫度通道
可以看到ad1,ad2與上面只有兩個時的數字是一樣的,ad3溫度。加入溫度等式,如下圖