注意事项
暂时只做了单通道中断方式的采集
1.选择输入引脚时就已经确定了后面ADC的转换通道ADC_Channel
编程步骤
1.初始化ADC用到的GPIO
2.初始化ADC并设置其工作参数
3.设置ADC的时钟(分频因子)
4.设置ADC通道、顺序以及采样时间
5.使能ADC中断,并设置中断方式
6.使能ADC,并校准
7.使用软件触发ADC转换
代码实现
(1)配置GPIO
static void ADC_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
(2)配置中断NVIC
#define ADC_IRQ ADC1_2_IRQn
static void ADC_NVIC_Config()
{
NVIC_InitTypeDef NVIC_InitStructure;
// 优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
// 配置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
(3)配置ADC工作方式并初始化
static void ADC_Mode_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
// 禁止扫描模式,多通道才要,单通道不需要
ADC_InitStructure.ADC_ScanConvMode = DISABLE ;
// 连续转换模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
// 不用外部触发转换,软件开启即可
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
// 转换结果右对齐
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
// 转换通道1个
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1,&ADC_InitStructure);
//设置分频因子
RCC_ADCCLKConfig(RCC_PCLK2_Div8 );
//设置ADC通道为1,第一个转换,采样周期为55.5个时钟周期
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);
//ADC转换结束后产生中断
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
//开启ADC,并开始转换
ADC_Cmd(ADC1,ENABLE);
//初始化ADC校准寄存器
ADC_ResetCalibration(ADC1);
//
while(ADC_GetResetCalibrationStatus(ADC1));
//ADC开始校准
ADC_StartCalibration(ADC1);
//
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
(4)完成ADC初始化
void ADC_Config(void)
{
ADC_GPIO_Config();
ADC_Mode_Config();
ADC_NVIC_Config();
}
(6)编写中断服务函数
#define ADC1_2_IRQHandler
void ADC_IRQHandler(void)
{
if(ADC_GetITStatus(ADC1,ADC_IT_EOC)==SET)
{
ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
ADCvalue=ADC_GetConversionValue(ADC1);
}
}
(7)主函数
利用printf打印出AD转换得到的结果
int main(void)
{
USART_Config();
ADC_Config();
printf("hello,world!");
while(1)
{
ADCvalueLocal=(float)ADCvalue/4096*3.3;
printf("\r\n The current AD value = %f V \r\n",ADCvalueLocal);
Delay(0xffffff);
}
}