打印
[应用相关]

STM32之ADC配置

[复制链接]
460|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
9dome猫|  楼主 | 2021-3-27 23:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对于STM32,在使用ADC的时候需要配置几个参数。
(1)   第一个参数是ADC_Mode,这里设置为独立模式:
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。

使用特权

评论回复
沙发
9dome猫|  楼主 | 2021-3-27 23:10 | 只看该作者
(2)   第二个参数是ADC_ScanConvMode,这里设置为DISABLE。

ADC_InitStructure.ADC_ScanConvMode = DISABLE;

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

使用特权

评论回复
板凳
9dome猫|  楼主 | 2021-3-27 23:10 | 只看该作者
(3)   第三个参数是ADC_ContinuousConvMode,这里设置为ENABLE,即连续转换。如果设置为DISABLE,则是单次转换。两者的区别在于连续转换直到所有的数据转换完成后才停止转换,而单次转换则只转换一次数据就停止,要再次触发转换才可以。所以如果需要一次性采集1024个数据或者更多,则采用连续转换。

使用特权

评论回复
地板
9dome猫|  楼主 | 2021-3-27 23:11 | 只看该作者
(4)   第四个参数是ADC_ExternalTrigConv,即选择外部触发模式。这里只讲三种:

使用特权

评论回复
5
9dome猫|  楼主 | 2021-3-27 23:12 | 只看该作者
1、第一种是最简单的软件触发,参数为ADC_ExternalTrigConv_None。设置好后还要记得调用库函数:

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

这样触发才会启动。

使用特权

评论回复
6
9dome猫|  楼主 | 2021-3-27 23:15 | 只看该作者
2、第二种是定时器通道输出触发。共有这几种:ADC_ExternalTrigConv_T1_CC1、ADC_ExternalTrigConv_T1_CC2、ADC_ExternalTrigConv_T2_CC2、

ADC_ExternalTrigConv_T3_T以及ADC_ExternalTrigConv_T4_CC4。定时器输出触发比较麻烦,还需要设置相应的定时器。以

ADC_ExternalTrigConv_T2_CC2触发为例设置相应的定时器:

使用特权

评论回复
7
9dome猫|  楼主 | 2021-3-27 23:16 | 只看该作者
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);

}

使用特权

评论回复
评论
9dome猫 2021-3-27 23:18 回复TA
这样设置之后就可以用定时器2的输出触发了,至于触发的周期,设置TIM2的时间即可。这里不再赘述。 
8
9dome猫|  楼主 | 2021-3-27 23:18 | 只看该作者
3、第三种是外部引脚触发,对于规则通道,选择EXTI线11和TIM8_TRGO作为外部触发事件;而注入通道组则选择EXTI线15和TIM8_CC4作为外部触发事件。

使用特权

评论回复
9
9dome猫|  楼主 | 2021-3-27 23:20 | 只看该作者
(5)   第五个参数是ADC_DataAlign,这里设置为ADC_DataAlign_Right右对齐方式。建议采用右对齐方式,因为这样处理数据会比较方便。当然如果要从高位开始传输数据,那么采用左对齐优势就明显了。

使用特权

评论回复
10
9dome猫|  楼主 | 2021-3-27 23:22 | 只看该作者
(6)   第六个参数是ADC_NbrOfChannel,顾名思义:通道的数量。要是到多个通道采集数据的话就得设置一下这个参数。此外在规则通道组的配置函数中也许将各个通道的顺序定义一下,如:
ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_13Cycles5);

      ADC_RegularChannelConfig(ADC1,ADC_Channel_14,2,ADC_SampleTime_13Cycles5);

使用特权

评论回复
11
9dome猫|  楼主 | 2021-3-27 23:23 | 只看该作者
  多通道数据传输时有一点还要注意:若一个数组为ADC_ValueTab[4],且设置了两个通道:通道1和通道2,则转换结束后,ADC_ValueTab[0]和ADC_ValueTab[2]存储的是通道1的数据,而ADC_ValueTab[1]和ADC_ValueTab[3]存储的是通道2的数据。如果数组容量大则依次类推。

使用特权

评论回复
12
9dome猫|  楼主 | 2021-3-27 23:24 | 只看该作者
  补充一点:在使用DMA传输数据的时候,需要设置外设地址和存储器地址,外设地址当然就是ADC的地址了,而存储器的地址如果使用8位数据的话,存储器必须定义为8位缓冲区;如果使用16位数据格式的话,存储器则为16位缓冲器,不可定义为32位或更多,否则,数据将出错。

使用特权

评论回复
13
9dome猫|  楼主 | 2021-3-27 23:28 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

1421

帖子

2

粉丝