STM32的ADC是:12 位 ADC 是一种逐次逼近型模拟数字转换器。它有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行。ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值值。【详细介绍可以看数据手册中文版第16章节】
利用原子的精英开发板实现ADC1的通道1进行单次转化,测量外部电压。
void Adc_Init(void)
{
//第一步:开启PA时钟(属于GPIOA即APB2的时钟)和ADC1的时钟,设置APB1为输入模式
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//第二步:复位iADC1,并设置ADC1的分频因子
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_DeInit(ADC1);
//第三步:初始化ADC1的相关参数,设置ADC1的工作模式以及规则序列相关信息。
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //工作在单一模式而不是循环模式
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换是由软件转换而不是硬件转换
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转化的通道数目
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //扫描模式关闭,扫描模式是y用来扫描一组模拟通道,我们这里用一个通道,所以用单一模式就ok,用不到扫描模式。
ADC_Init(ADC1,&ADC_InitStructure);//ADC1初始化
//第四步:使能ADC1并校准
ADC_Cmd(ADC1,ENABLE);
ADC_GetResetCalibrationStatus(ADC1);//校准复位ADC1
while(ADC_GetResetCalibrationStatus(ADC1)); //检测ADC1校准复位是否完成
ADC_StartCalibration(ADC1);//,脚注复位完成,开始校准
while(ADC_GetCalibrationStatus(ADC1));//检测是否校准完成
}
u16 Get_Adc(u8 ch)
{
//第五步:配置规则通道参数,设置指定ADC的规则通道,一个序列,采样时间 ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);//ADC1,ADC通道1,采样时间HSI239.5个周期
//第六步:开启软件转换
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的ADC的软件转换功能,我们的是ADC1
while(ADC_GetSoftwareStartConvStatus(ADC1));//检测软件转换是否完成
return ADC_GetDualModeConversionValue();//返回最后一次读到的AD值。 返回最近一次规则组的转换结果。
}
//为了AD的转换值更加准确,我们采用多次采集求平均的方式
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}