STM32之ADC配置,ADC_Mode模式理解

对于STM32,在使用ADC的时候需要配置几个参数。

  1. 第一个参数是ADC_Mode,这里设置为独立模式:
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。

  1. 第二个参数是ADC_ScanConvMode,这里设置为DISABLE。
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;

如果只是用了一个通道的话,DISABLE就可以了,如果使用了多个通道的话,则必须将其设置为ENABLE。

  1. 第三个参数是ADC_ContinuousConvMode,这里设置为ENABLE,即连续转换。如果设置为DISABLE,则是单次转换。两者的区别在于连续转换直到所有的数据转换完成后才停止转换,而单次转换则只转换一次数据就停止,要再次触发转换才可以。所以如果需要一次性采集1024个数据或者更多,则采用连续转换。

  2. 第四个参数是ADC_ExternalTrigConv,即选择外部触发模式。这里只讲三种:

  • 第一种是最简单的软件触发,参数为ADC_ExternalTrigConv_None。设置好后还要记得调用库函数:
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);

这样触发才会启动。

  • 第二种是定时器通道输出触发。共有这几种:
ADC_ExternalTrigConv_T1_CC1、
ADC_ExternalTrigConv_T1_CC2、
ADC_ExternalTrigConv_T2_CC2、
ADC_ExternalTrigConv_T3_T 、
ADC_ExternalTrigConv_T4_CC4 、

定时器输出触发比较麻烦,还需要设置相应的定时器。ADC_ExternalTrigConv_T2_CC2触发为例设置相应的定时器:

void TIM2_Configuration(void){

		TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
		TIM_OCInitTypeDef         TIM_OCInitStructure;
		
		TIM_TimeBaseStructure.TIM_Prescaler = 4;
		TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
		TIM_TimeBaseStructure.TIM_Period = 0XFF;
		TIM_TimeBaseStructure.TIM_ClockDivision = 0;
		TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
		TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
		
		TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		TIM_OCInitStructure.TIM_Pulse = 0X7F;
		TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
		TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;        
		TIM_OC2Init(TIM2, &TIM_OCInitStructure);
		
		TIM_Cmd(TIM2, ENABLE);
		
		TIM_CtrlPWMOutputs(TIM2, ENABLE);
}

这样设置之后就可以用定时器2的输出触发了,至于触发的周期,设置TIM2的时间即可。这里不再赘述。

  • 第三种是外部引脚触发,对于规则通道,选择EXTI线11和TIM8_TRGO作为外部触发事件;而注入通道组则选择EXTI线15和TIM8_CC4作为外部触发事件。
  1. 第五个参数是ADC_DataAlign,这里设置为ADC_DataAlign_Right右对齐方式。建议采用右对齐方式,因为这样处理数据会比较方便。当然如果要从高位开始传输数据,那么采用左对齐优势就明显了。
  2. 第六个参数是ADC_NbrOfChannel,顾名思义:通道的数量。要是到多个通道采集数据的话就得设置一下这个参数。此外在规则通道组的配置函数中也许将各个通道的顺序定义一下,如:
      ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_13Cycles5);
      ADC_RegularChannelConfig(ADC1,ADC_Channel_14,2,ADC_SampleTime_13Cycles5);

多通道数据传输时有一点还要注意:若一个数组为ADC_ValueTab[4],且设置了两个通道:通道1和通道2,则转换结束后,ADC_ValueTab[0]ADC_ValueTab[2]存储的是通道1的数据,而ADC_ValueTab[1]ADC_ValueTab[3]存储的是通道2的数据。如果数组容量大则依次类推

  • 64
    点赞
  • 230
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
STM32F107的ADC模块可以通过以下步骤进行配置: 1.先使能ADC时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); 2.配置ADC工作模式ADC_InitTypeDef ADC_InitStructure; 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_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); 3.配置ADC采样时间:ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_71Cycles5); 4.使能ADCADC_Cmd(ADC1, ENABLE); 5.校准ADCADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); 6.读取ADC转换结果:ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); uint16_t adcValue = ADC_GetConversionValue(ADC1); 这些步骤的具体含义和作用如下: 1.使能ADC时钟:开启ADC模块时钟,使ADC模块处于工作状态。 2.配置ADC工作模式:设置ADC工作模式为独立模式,禁止扫描模式和连续转换模式,设置外部触发转换为无,设置数据对齐方式为右对齐,设置转换通道的数量为1。 3.配置ADC采样时间:设置ADC采样时间,即ADC在转换前需要等待的时间,用于稳定电压和消除噪声。 4.使能ADC:开启ADC模块,使其可以进行模数转换。 5.校准ADC:对ADC进行校准,保证转换结果的准确性和稳定性。 6.读取ADC转换结果:使用软件触发ADC转换,等待转换完成,然后读取转换结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值