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);
}
浙公网安备 33010602011771号