ADC结构体
1 typedef struct 2 { 3 uint32_t ADC_Mode; // ADC 工作模式选择 4 FunctionalState ADC_ScanConvMode; /* ADC 扫描(多通道)或者单次(单通道)模式选择 */ 6 FunctionalState ADC_ContinuousConvMode; // ADC 单次转换或者连续转换选择 7 uint32_t ADC_ExternalTrigConv; // ADC 转换触发信号选择 8 uint32_t ADC_DataAlign; // ADC 数据寄存器对齐格式 9 uint8_t ADC_NbrOfChannel; // ADC 采集通道数 10 } ADC_InitTypeDef;
ADC_Mode:当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选
ADC_ScanConvMode:配置是否使用扫描。如果是单通道 AD 转 换 使 用 DISABLE , 如 果 是 多 通 道 AD 转 换 使 用 ENABLE , 具 体 配 置ADC_CR1:SCAN 位
ADC_ContinuousConvMode:可选参数为 ENABLE 和 DISABLE,配置是启动自动连续转换还是单次转换。使用 ENABLE 配置为使能自动连续转换;使用 DISABLE 配置为单次转换,转换一次后停止需要手动控制才重新启动转换, 具体配置 ADC_CR2:CON 位。
ADC_ExternalTrigConv:外部触发选择,可根据项目需求配置触发来源。实际上,我们一般使用软件自动触发。
ADC_DataAlign:转换结果数据对齐模式,可选右对齐ADC_DataAlign_Right或者左对齐 ADC_DataAlign_Left。一般我们选择右对齐模式。
ADC_NbrOfChannel: AD 转换通道数目
单通道单次采集:
1 //ADC单通道单次转换 2 void ADC_Config(void) 3 { 4 GPIO_InitTypeDef GPIO_InitStructure; 5 ADC_InitTypeDef ADC_InitStructure; 6 NVIC_InitTypeDef NVIC_InitStructure; 7 8 //开启ADC1和GPIO的时钟,两者都在APB2总线上挂载着 9 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1, ENABLE); 10 11 12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入 14 GPIO_Init(GPIOC, &GPIO_InitStructure); 15 16 17 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//第二组 18 NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; 19 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;//抢占优先级 20 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级 21 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能 22 NVIC_Init(&NVIC_InitStructure); 23 24 25 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式(一个ADC工作) 26 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单通道扫描模式(只有一个通道) 27 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //DISABLE--单次转换模式 ENABLE--连续转换模式 28 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不受外界决定,软件触发模式 29 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐 30 ADC_InitStructure.ADC_NbrOfChannel = 1; //扫描通道数--1 31 RCC_ADCCLKConfig(RCC_PCLK2_Div8);//配置ADC采样参考时钟的预分频值 72M÷8=9M <14M 32 ADC_Init(ADC1,&ADC_InitStructure); 33 34 ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);//使能ADC中断 35 36 //规则通道配置(ADCx 通道 采样次序 采样时间) 37 ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 1, ADC_SampleTime_55Cycles5);//ADC1, 38 ADC_Cmd(ADC1,ENABLE);//使能ADC1 39 40 41 //采样校准 42 ADC_ResetCalibration(ADC1); //初始化ADC采样校准器 43 while(ADC_GetResetCalibrationStatus(ADC1));//等待初始化完成 44 ADC_StartCalibration(ADC1); //开始校准 45 while(ADC_GetCalibrationStatus(ADC1));//等待校准完成 46 47 48 ADC_SoftwareStartConvCmd(ADC1,ENABLE);//启动软件转换(没有采用外部触发) 49 } 50 51 52 53 void ADC1_2_IRQHandler(void) 54 { 55 if(ADC_GetITStatus(ADC1,ADC_IT_EOC)==SET) 56 57 ADC_Value =ADC_GetConversionValue(ADC1);//获取转换的结果 58 59 ADC_ClearITPendingBit(ADC1,ADC_IT_EOC); 60 }