ADC框图
ADC框图很重要看明白可以节约很多时间
ADCx引脚
可以初始化ADC通道的引脚,ADC1和ADC2都是一样的通道,ADC3与ADC1和ADC2的Channel4-Channel8是不一样的其他都是一样的。
ADC初始化结构体
定义的ADC初始化结构体,写对应的寄存器。
//ADC结构体
typedef struct
{
uint32_t ADC_Mode; /* 配置ADC模式 */
FunctionalState ADC_ScanConvMode; /*多通道扫描模式或者单通道模式 */
FunctionalState ADC_ContinuousConvMode; /* 连续转化模式还是单次转换模式*/
uint32_t ADC_ExternalTrigConv; /*定义规则通道的外部触发方式*/
uint32_t ADC_DataAlign; /*设置数据对齐方式*/
uint8_t ADC_NbrOfChannel; /*设置ADC模拟通道个数*/
}ADC_InitTypeDef;
ADC_Mode ADC的模式
在结构体ADC_InitTypeDef中ADC_Mode可以设置的值:
ADC_Mode_Independent //独立模式
ADC_Mode_RegInjecSimult //混合的同步规则+注入同步模式
ADC_Mode_RegSimult_AlterTrig //混合的同步规则+交替出发模式
ADC_Mode_InjecSimult_FastInterl //混合同步注入+快速交叉模式
ADC_Mode_InjecSimult_SlowInterl //混合同步注入+慢速交叉模式
ADC_Mode_InjecSimult //注入同步模式
ADC_Mode_RegSimult //规则同步模式
ADC_Mode_FastInterl //快速交叉模式
ADC_Mode_SlowInterl //慢速交叉模式
ADC_Mode_AlterTrig //交替触发模式
ADC_ScanConvMode
**在结构体ADC_InitTypeDef中ADC_ScanConvMode可以设置的值: **
DISABLE 不开启扫描模式(单通道采集)
ENABLE 开启扫描模式
ADC_ContinuousConvMode
在结构体ADC_InitTypeDef中ADC_ContinuousConvMode可以设置的值:
DISABLE 单次转换
ENABLE 连续转换
注:在固件库中只要变量类型为FunctionalState一般就只有2个值DISABLE和ENABLE
ADC_ExternalTrigConv
在结构体ADC_InitTypeDef中ADC_ExternalTrigConv可以设置的值:
ADC_DataAlign
在结构体ADC_InitTypeDef中ADC_DataAlign可以设置的值:
ADC_DataAlign_Right 右对齐
ADC_DataAlign_Left 左对齐
ADC_NbrOfChannel
在结构体ADC_InitTypeDef中ADC_NbrOfChannel可以设置的值:
1-16
固件库中ADC的常用函数
//ADC时钟分频函数
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//RCC_PCLK2的值为2、4、6、8
//注:一般不要超过14MHZ,对于不熟悉时钟树的正常情况下只能配置12MHZ
//ADC通道初始化函数
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
//恢复指定ADC的外部寄存器初始值
void ADC_DeInit(ADC_TypeDef* ADCx);
//为ADCx的通道使能采集等级和采集时间
//ADC模拟通道采集时间=12.5+ADC_SampleTime/ADC时钟(us)
//ADC模拟通道最小采集时间是1us (12.5+1.5)/14MHZ=1us
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
//ADC外部设备使能函数
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
//使能软件触发
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
//使能外部触发
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
//使能DMA转化
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); //返回单通道ADC采集的值
//注:此函数可以准确返回单通道ADC采集的值,但是双通道需要使用中断或者DMA带回ADC采集的值
规则通道软件触发
从上面的ADC框图可以看出好像没有软件触发的方式也没有软件触发的寄存器配置,只有外部触发。看库函数的底层就可以知道软件触发是配置ADC_CR2寄存器的第20位和第22位,开启外部中断和开始转换规则通道(SWSTART)。
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_ADC_ALL_PERIPH(ADCx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Enable the selected ADC conversion on external event and start the selected
ADC conversion */
ADCx->CR2 |= CR2_EXTTRIG_SWSTART_Set; //((uint32_t)0x0050 0000)
}
else
{
/* Disable the selected ADC conversion on external event and stop the selected
ADC conversion */
ADCx->CR2 &= CR2_EXTTRIG_SWSTART_Reset; // ((uint32_t)0xFFAFFFFF)
}
}
ADC初始化(代码)
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ADC分频因子6,ADC最大时间不能超过14M
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 ); //采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
uint16_t ADC_ConvertedValueLocal;
ADC_ConvertedValueLocal=ADC_GetConversionValue(ADC1);
printf("%d",ADC_ConvertedValueLocal);