Files
2026-10-19 15:47:18 +08:00

64 lines
2.0 KiB
C

#include "adc.h"
// ADC1 初始化
void adc1_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
ADC_InitTypeDef ADC_InitStruct;
// 使能 ADC 和 PC0 的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1, ENABLE);
// 初始化 PC0 为模拟输入
// 模拟输入
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOC, &GPIO_InitStruct);
// 配置 ADC 的时钟主频为 12MHz(72M 六分频)
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
// 初始化 AADC
// 独立模式
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
// 扫描模式(禁用)
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
// 连续转换(禁用)
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
// 外部转换出发源(禁用),使用软件出发
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
// 右对齐方式
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
// 通道个数(1 个通道)
ADC_InitStruct.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStruct);
// 使能 ADC
ADC_Cmd(ADC1,ENABLE);
// 复位校准(初次使用必须使用校准)
ADC_ResetCalibration(ADC1);
// 等待复位校准结束
while (ADC_GetResetCalibrationStatus(ADC1));
// 开始校准
ADC_StartCalibration(ADC1);
// 等待校准结束
while (ADC_GetCalibrationStatus(ADC1));
// 设置成软件触发转换模式
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
// ADC 转换取值
// channal 表示通道
uint16_t adc1_get_value(uint8_t channal)
{
// 设置规则通道的转换配置,采样周期为 239.5个 ADC 时钟周期
ADC_RegularChannelConfig(ADC1, channal, 1, ADC_SampleTime_239Cycles5);
// 开始软件转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
// 返回转换结果
return ADC_GetConversionValue(ADC1);
}