1.理论部分
STM32的ADC是12位,通过硬件过采样扩展到16位,模数转换器嵌入到STM32器件中。有16个外部通道和2个内部通道(温度传感器、电压基准)。
ADC以单次或扫描模式执行转换。在扫描模式下,自动在选定的一组模拟输入上执行转换。
ADC频率与MCU频率无关,允许最大采样,即使在低MCU速度下,速率也为1.14MSPS。ADC功耗极低
2.STM32CUBeMX配置
3.Keil编程
uint16_t ADC_Get(void)
{
uint16_t adc_val;
HAL_ADC_Start(&hadc);
adc_val = HAL_ADC_GetValue(&hadc);
return adc_val;
}
#include "main.h"
#include "adc.h"
#include "i2c.h"
#include "rtc.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "oled.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
RTC_DateTypeDef sdata;
RTC_TimeTypeDef stime;
uint8_t oled_str[24];
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int fputc(int ch,FILE *p)
{
HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,0xffff);
return ch;
}
uint16_t ADC_Get(void)
{
uint16_t adc_val;
HAL_ADC_Start(&hadc);
adc_val = HAL_ADC_GetValue(&hadc);
return adc_val;
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
MX_USART2_UART_Init();
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_RTC_Init();
MX_ADC_Init();
/* USER CODE BEGIN 2 */
OLED_Init();
printf("this is iic_oled init\r\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
ADC_Get();
HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sdata, RTC_FORMAT_BIN);
sprintf((char *)oled_str,"%02d:%02d:%02d",stime.Hours,stime.Minutes,stime.Seconds);
OLED_ShowString(0, 0, oled_str, 16);
sprintf((char *)oled_str,"ADC:%4.2f",(3.3f*ADC_Get())/4095.f);
OLED_ShowString(0, 2, oled_str, 16);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}