#include "stm32l0xx_hal.h"
#include <stdio.h>
ADC_HandleTypeDef hadc1;
UART_HandleTypeDef huart1;
// 重定向printf到串口
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 100);
return ch;
}
// 读取ADC原始值
uint32_t Read_ADC(void) {
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
return HAL_ADC_GetValue(&hadc1);
}
// ADC值转换为气体浓度(ppm)
float ADC_to_PPM(uint32_t adc) {
// 线性换算:12位ADC(0-4095)对应0-10000ppm
return (float)adc / 4095.0f * 10000.0f;
}
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_Init();
while (1) {
uint32_t adc_val = Read_ADC();
float ppm = ADC_to_PPM(adc_val);
printf("ADC原始值: %lu \r\n", adc_val);
printf("气体浓度 : %.1f PPM \r\n\r\n", ppm);
HAL_Delay(500);
}
}
// ADC初始化(PA0通道)
static void MX_ADC1_Init(void) {
__HAL_RCC_ADC1_CLK_ENABLE();
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
// 串口初始化(波特率115200)
static void MX_USART1_Init(void) {
__HAL_RCC_USART1_CLK_ENABLE();
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX;
HAL_UART_Init(&huart1);
}
static void MX_GPIO_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE();
}
void SystemClock_Config(void) {
// Wokwi仿真默认配置,此处省略
}Loading
st-nucleo-l031k6
st-nucleo-l031k6