A/D 模拟信号/数字信号转换

AD.H

#ifndef __AD_H
#define __AD_H

void AD_Init(void);
uint16_t AD_GetValue(void);
uint16_t AD_GetValueFiltered(void);

#endif

AD.C

#include "stm32f10x.h" // Device header

/**
 * 初始化 ADC
 */
void AD_Init(void)
{
	// 开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// 设置 ADC 时钟
	RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 6分频,ADCCLK = 72MHz / 6 = 12MHz
	
	// 初始化 GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // PA7
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	// 配置规则组通道
	ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_55Cycles5);
	
	// 初始化 ADC
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	ADC_InitStructure.ADC_NbrOfChannel = 1;
	ADC_Init(ADC1, &ADC_InitStructure);
	
	// 使能 ADC1
	ADC_Cmd(ADC1, ENABLE);
	
	// ADC 校准
	ADC_ResetCalibration(ADC1);
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
}

/**
 * 获取 AD 转换结果(0~4095)
 */
uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发转换
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	// 等待转换结束
	return ADC_GetConversionValue(ADC1);// 读取结果
}

/**
 * 获取 AD 转换结果(0~4095)
 * 滑动窗口滤波
 */
#define BUFFER_SIZE 8

static uint16_t Buffer[BUFFER_SIZE] = {0};
static uint16_t Index = 0;
static uint16_t Sum = 0;

uint16_t AD_GetValueFiltered(void)
{
	uint16_t newVal = AD_GetValue();
	uint16_t oldVal = Buffer[Index];
	Buffer[Index] = newVal;
	Index = (Index + 1) % BUFFER_SIZE;
	Sum += newVal - oldVal;
	return Sum / BUFFER_SIZE + (Sum % BUFFER_SIZE > 0 ? 1 : 0);
}

posted on 2025-10-26 22:05  星辰河岳  阅读(8)  评论(0)    收藏  举报