|
#include "stm32h7xx_hal.h"
ADC_HandleTypeDef hadc1;
void ADC_Init(void) {
// 使能ADC时钟
__HAL_RCC_ADC12_CLK_ENABLE();
// ADC配置
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B; // 12位分辨率
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // 禁用扫描模式
hadc1.Init.ContinuousConvMode = DISABLE; // 禁用连续转换
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc1.Init.NbrOfConversion = 1; // 单次转换
HAL_ADC_Init(&hadc1); // 初始化ADC
}
uint32_t Read_ADC_Value(void) {
HAL_ADC_Start(&hadc1); // 启动ADC转换
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // 等待转换完成
return HAL_ADC_GetValue(&hadc1); // 返回ADC值
}
float moving_average(float new_value) {
static float avg = 0;
static int count = 0;
count++;
avg += (new_value - avg) / count; // 计算平均值
return avg;
}
static int32_t offset = 0;
void Calculate_Offset(void) {
for (int i = 0; i < 100; i++) {
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
offset += HAL_ADC_GetValue(&hadc1); // 累加ADC值
}
offset /= 100; // 计算平均偏移量
}
uint32_t Get_Corrected_ADC_Value(void) {
uint32_t adc_value = Read_ADC_Value(); // 读取ADC值
return adc_value - offset; // 返回校正后的值
}
UART_HandleTypeDef huart1;
void UART_Init(void) {
// 使能USART1时钟
__HAL_RCC_USART1_CLK_ENABLE();
// USART配置
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200; // 波特率
huart1.Init.WordLength = USART_WORDLENGTH_8B; // 字长
huart1.Init.StopBits = USART_STOPBITS_1; // 停止位
huart1.Init.Parity = USART_PARITY_NONE; // 无奇偶校验
huart1.Init.Mode = USART_MODE_TX_RX; // 发送接收模式
HAL_UART_Init(&huart1); // 初始化UART
}
void UART_Send_Data(uint32_t data) {
char buffer[20];
sprintf(buffer, "ADC Value: %lu\n", data); // 格式化输出
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY); // 发送数据
}
int main(void) {
HAL_Init(); // 初始化HAL库
ADC_Init(); // 初始化ADC
UART_Init(); // 初始化UART
Calculate_Offset(); // 计算偏移量
while (1) {
uint32_t corrected_value = Get_Corrected_ADC_Value(); // 获取校正后的ADC值
float smoothed_value = moving_average(corrected_value); // 平滑处理
UART_Send_Data(corrected_value); // 发送ADC值
}
}
DMA_HandleTypeDef hdma_adc1;
void DMA_Init(void) {
__HAL_RCC_DMA2_CLK_ENABLE(); // 使能DMA时钟
hdma_adc1.Instance = DMA2_Stream0;
hdma_adc1.Init.Channel = DMA_CHANNEL_0; // 选择通道
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; // 从外设到内存
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; // 禁用外设地址递增
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; // 启用内存地址递增
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; // 外设数据对齐
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; // 内存数据对齐
hdma_adc1.Init.Mode = DMA_CIRCULAR; // 循环模式
hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH; // 高优先级
HAL_DMA_Init(&hdma_adc1); // 初始化DMA
__HAL_LINKDMA(&hadc1, DMA_Handle, hdma_adc1); // 连接DMA与ADC
}