#include "ADC.h"
/* Delay between ADC end of calibration and ADC enable. */
/* Delay estimation in CPU cycles: Case of ADC enable done */
/* immediately after ADC calibration, ADC clock setting slow */
/* (LL_ADC_CLOCK_ASYNC_DIV32). Use a higher delay if ratio */
/* (CPU clock / ADC clock) is above 32. */
#define ADC_DELAY_CALIB_ENABLE_CPU_CYCLES (LL_ADC_DELAY_CALIB_ENABLE_ADC_CYCLES * 32)
#define VDDA_APPLI ((uint32_t)3300)//连接模拟电压的模拟参考电压(VREF)值,电源VDDA(单位:mV)
#define VAR_CONVERTED_DATA_INIT_VALUE (__LL_ADC_DIGITAL_SCALE(LL_ADC_RESOLUTION_12B) + 1)//ADC转换值范围
__IO uint16_t uhADCxConvertedData = VAR_CONVERTED_DATA_INIT_VALUE;//ADC转换数据
/***************************************************************************************
** 函数名称: ADC1_Init
** 功能描述: ADC1初始化
** 参 数: None
** 返 回 值: None
****************************************************************************************/
void ADC1_Init(void)
{
LL_ADC_InitTypeDef ADC_InitStruct;
LL_ADC_REG_InitTypeDef ADC_REG_InitStruct;
LL_ADC_CommonInitTypeDef ADC_CommonInitStruct;
LL_GPIO_InitTypeDef GPIO_InitStruct;
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC);//使能ADC时钟
//配置ADC采样引脚
GPIO_InitStruct.Pin = LL_GPIO_PIN_4;//PA4
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;//复用模式
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;//无上下拉
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);//初始化PA4引脚
//配置ADC1
ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;//12位分辨率
ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;//靠右对齐
ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE;//禁用低功耗ADC激活
LL_ADC_Init(ADC1, &ADC_InitStruct);//初始化ADC1
//配置ADC1其他特征
ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;//内部触发器
ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS;//2级序列发生器
ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;//禁用不连续模式
ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE;//单次转换模式
ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;//禁用DMA传输
ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_PRESERVED;//溢出时保留数据
LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct);//初始化Task_AD();
LL_ADC_DisableIT_EOC(ADC1);//禁用EOC中断
LL_ADC_DisableIT_EOS(ADC1);//禁用EOS中断
LL_ADC_DisableDeepPowerDown(ADC1);//禁用深度掉电模式
LL_ADC_EnableInternalRegulator(ADC1);//开启内部电压调节器
//配置ADC1公共参数
ADC_CommonInitStruct.CommonClock = LL_ADC_CLOCK_ASYNC_DIV1;//无预分频异步时钟
LL_ADC_CommonInit(__LL_ADC_COMMON_INSTANCE(ADC1), &ADC_CommonInitStruct);//初始化ADC1公共参数
//配置ADC1采样通道
LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_9);//ADC1通道9第一个转换
LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_9, LL_ADC_SAMPLINGTIME_2CYCLES_5);//ADC1通道9采样时间2.5 ADC时钟周期
LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_9, LL_ADC_SINGLE_ENDED);//ADC1通道9单端模式结束
LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_2, LL_ADC_CHANNEL_TEMPSENSOR);//ADC1温度传感器第二个转换
LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_TEMPSENSOR, LL_ADC_SAMPLINGTIME_640CYCLES_5);//ADC1温度传感器采样时间640.5 ADC时钟周期
LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_TEMPSENSOR, LL_ADC_SINGLE_ENDED);//ADC1温度传感器单端模式结束
LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_PATH_INTERNAL_TEMPSENSOR);
// Open_ADC(ADC1);//开启ADC1
// ConversionStartPoll_ADC_GrpRegular(ADC1);//开始ADC转换
}
/***************************************************************************************
** 函数名称: Open_ADC
** 功能描述: 开启ADC
** 参 数: ADCx ADC instance
** 返 回 值: None
****************************************************************************************/
void Open_ADC(ADC_TypeDef *ADCx)
{
__IO uint32_t wait_loop_index = 0;
if (LL_ADC_IsEnabled(ADCx) == 0)//检测ADC1是否开启
{
LL_ADC_DisableDeepPowerDown(ADCx);//禁用ADC1深断电模式
LL_ADC_EnableInternalRegulator(ADCx);//开启ADC1内部电压调节器
/* Delay for ADC internal voltage regulator stabilization. */
/* Compute number of CPU cycles to wait for, from delay in us. */
/* Note: Variable divided by 2 to compensate partially */
/* CPU processing cycles (depends on compilation optimization). */
/* Note: If system core clock frequency is below 200kHz, wait time */
/* is only a few CPU processing cycles. */
wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US * (SystemCoreClock / (100000 * 2))) / 10);
while(wait_loop_index != 0)
wait_loop_index--;
LL_ADC_StartCalibration(ADCx, LL_ADC_SINGLE_ENDED);//运行ADC自动校正
while (LL_ADC_IsCalibrationOnGoing(ADCx) != 0){}//等待ADC校准结束
/* Delay between ADC end of calibration and ADC enable. */
/* Note: Variable divided by 2 to compensate partially */
/* CPU processing cycles (depends on compilation optimization). */
wait_loop_index = (ADC_DELAY_CALIB_ENABLE_CPU_CYCLES >> 1);
while(wait_loop_index != 0)
wait_loop_index--;
LL_ADC_Enable(ADCx);//开启ADC
while (LL_ADC_IsActiveFlag_ADRDY(ADCx) == 0){}//等待ADC准备好
}
}
/***************************************************************************************
** 函数名称: Close_ADC
** 功能描述: 关闭ADC
** 参 数: ADCx ADC instance
** 返 回 值: None
****************************************************************************************/
void Close_ADC(ADC_TypeDef *ADCx)
{
LL_ADC_Disable(ADCx);//关闭ADC
LL_ADC_ClearFlag_ADRDY(ADCx);//清除ADRDY标志
}
/***************************************************************************************
** 函数名称: ConversionStartPoll_ADC_GrpRegular
** 功能描述: 开始ADC规则转换
** 参 数: ADCx ADC instance
** 返 回 值: None
****************************************************************************************/
void ConversionStartPoll_ADC_GrpRegular(ADC_TypeDef *ADCx)
{
if ((LL_ADC_IsEnabled(ADCx) == 1) &&
(LL_ADC_IsDisableOngoing(ADCx) == 0) &&
(LL_ADC_REG_IsConversionOngoing(ADCx) == 0) )
{
LL_ADC_REG_StartConversion(ADCx);//开始ADC转换
}
else
{
//*错误:无法执行ADC转换启动*/
}
while (LL_ADC_IsActiveFlag_EOC(ADCx) == 0){}//等待转换完成
LL_ADC_ClearFlag_EOC(ADCx);//清除转换完成标志
}
/***************************************************************************************
** 函数名称: Get_ADCVal
** 功能描述: 由ADC转换数据计算电压值
** 参 数: ADCx ADC instance
** 返 回 值: None
****************************************************************************************/
uint16_t Get_ADCVal(ADC_TypeDef *ADCx)
{
__IO uint16_t uhADCxConvertedData_Voltage_mVolt = 0;//由ADC转换数据计算的电压值 (单位: mV)
ConversionStartPoll_ADC_GrpRegular(ADCx);//开始ADC转换
uhADCxConvertedData = LL_ADC_REG_ReadConversionData12(ADCx);//获取ADC转换数据(12位)
uhADCxConvertedData_Voltage_mVolt = __LL_ADC_CALC_DATA_TO_VOLTAGE(VDDA_APPLI, uhADCxConvertedData, LL_ADC_RESOLUTION_12B);//计算电压值
return uhADCxConvertedData_Voltage_mVolt;
}
/***************************************************************************************
** 函数名称: Get_ADCTem
** 功能描述: 由ADC转换数据计算温度值
** 参 数: ADCx ADC instance
** 返 回 值: None
****************************************************************************************/
uint16_t Get_ADCTem(ADC_TypeDef *ADCx)
{
__IO uint16_t hADCxConvertedData_Temperature_DegreeC