64 lines
2.0 KiB
C
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);
|
|
}
|
|
|