Darren_pty

导航

13-STM32 ADC单通道单次采集

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_NbrOfChannelAD 转换通道数目

单通道单次采集:
 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 }

 

 
 

 

posted on 2020-12-06 20:14  Darren_pty  阅读(903)  评论(0编辑  收藏  举报