1. 程式人生 > >【STM32CubeMX】5,STM32之ADC

【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

/*##-3- Start the conversion process ######/

if(HAL_ADC_Start(&AdcHandle) != HAL_OK)

{ Error_Handler(); }

/*##-4- Wait for the end of conversion ######/

HAL_ADC_PollForConversion(&AdcHandle, 10);

if(HAL_ADC_GetState(&AdcHandle) == HAL_ADC_STATE_EOC_REG)

{

/*##-5- Get the converted value of channel ##*/

uhADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);

}

     2  中斷模式

1

2

3

4

5

6

7

/*##-3- Start the conversion process ######/

if(HAL_ADC_StartIT(&AdcHandle) != HAL_OK)

{ Error_Handler(); }

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)

{ /* Get the converted value of regular channel */

uhADCxConvertedValue = HAL_ADC_GetValue(AdcHandle);

}

     3  DMA模式

1

2

3

4

5

6

7

/*##-3- Start the conversion process ######/

if(HAL_ADC_StartDMA(&AdcHandle,&uhADCxConvertedValue,1) != HAL_OK)

{ Error_Handler(); }

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)

{ /* Turn LED1 on: Transfer process is correct */

BSP_LED_On(LED1);

}

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溫度。加入溫度等式,如下圖