使用STM32F1进行ADC实验的整理

芯片型号:STM32F103VE

首先实验单个ADC的规则通道和注入通道。

1个ADC两个通道:

	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;//非单通道
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	
	ADC_InitStructure.ADC_NbrOfChannel = 2;	//2个通道
	ADC_Init(ADC1, &ADC_InitStructure);


        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );		    
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);			
	 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

	return ADC_GetConversionValue(ADC1);	

1个ADC,两个规则通道一个注入通道(软件启动):

在上面配置的基础上加入注入通道的代码:

    ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);//不用中断事件启动
    ADC_InjectedSequencerLengthConfig(ADC1, 1);//通道长度
    ADC_InjectedChannelConfig(ADC1,ADC_Channel_15,1,ADC_SampleTime_28Cycles5);//配置注入组,这里的通道选实际的ADC通道

    ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_1,0);//偏移,这里的注入通道共有1-4四条
    ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);//软件启动转换
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
    return ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);//获取注入通道1的转换结果

 值得注意的是要仔细阅读库函数的注释说明,若将ADC_InjectedChannel_1错填成ADC的实际的通道ADC_Channel_15就不行了(编译器不会报错)。

ADC_SampleTime_239Cycles5是采样时间,采样时间越长越精确。

ADC_InjectedSequencerLengthConfig(ADC1, 1);与规则通道配置类比,结合注释猜想应该是有几个注入通道的意思。

ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_1,0);注入通道转换数据的偏移,转换结果为原始数据减去偏移量。例如写偏移为1000,转换结果便从原来的两千多变为一千多了。

 

简单说明一下ADC初始化配置的结构体:

typedef struct
{
  uint32_t ADC_Mode;                      /*设置ADC模式 。有独立模式和其他好几个模式(两个及以上ADC)*/

  FunctionalState ADC_ScanConvMode;       /*设置是否开启扫描模式,即单通道或多通道*/

  FunctionalState ADC_ContinuousConvMode; /*设置是否开启连续转换模式,即只转换一次或者连续转换*/

  uint32_t ADC_ExternalTrigConv;          /*设置启动规则转换组转换的外部事件,即软件触发转换还是外部事件触发*/

  uint32_t ADC_DataAlign;                 /*设置 ADC 数据对齐方式是左对齐还是右对齐*/

  uint8_t ADC_NbrOfChannel;               /*设置规则序列的长度,即有几个通道*/
}ADC_InitTypeDef;

ADC_Mode:在有两个及以上ADC的MCU,可使用双ADC模式,通过这些模式的选择决定是主从交替触发或同步触发。

#define ADC_Mode_Independent                       独立模式,一个ADC
#define ADC_Mode_RegInjecSimult                   同步注入+同步规则
#define ADC_Mode_RegSimult_AlterTrig           同步规则+交替触发
#define ADC_Mode_InjecSimult_FastInterl         同步注入+快速交替
#define ADC_Mode_InjecSimult_SlowInterl        同步注入+慢速交替
#define ADC_Mode_InjecSimult                          同步注入

#define ADC_Mode_RegSimult                           同步规则
#define ADC_Mode_FastInterl                             快速交替
#define ADC_Mode_SlowInterl                            慢速交替
#define ADC_Mode_AlterTrig                              交替触发

同步即同时触发多个ADC的转换,交替是不同时触发的。详细解释参看参考手册。

下面实验双ADC:

同步规则:

只需将模式改成同步规则,添加进ADC2的初始化代码(凡带有ADC1的都复制一遍),然后读取结果即可。

注意不要转换两个ADC的相同通道。

同步注入:类似改法。

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(STM32)