当前位置:   article > 正文

STM32cubeMx系列小白学习教程(八)——ADC常规转换_stm32cubemx adc

stm32cubemx adc

前言

上节提到了非常规转换,非常规转换对新手来说,使用起来逻辑会比较清晰一些。还有一种用的比较多的就是常规转换,可以说这两种各有各的用途,但是一般情况常规转换会用的比较普遍一些。可以让ADC以某一时间周期性的转换,不用自己主动程序去指令,这节讲讲ADC常规转换。

简介

ADC非常规转换:也称为连续转换或自动转换。在常规转换模式下,ADC按照预先配置的设置连续地对输入信号进行采样和转换。它可以持续地转换多个通道的数据,并在每次转换完成后自动更新结果。常规转换模式适用于需要连续监测或采集多个通道数据的应用,例如数据采集系统、实时监测系统等。

常规转换

1.Data Alignment(数据对齐):f103的ADC具有12位分辨率。两个字节是16位,会有4位用不到,需要设置ADC的12位数据的对齐方式。
左对齐0bxxxx xxxx xxxx 0000,右对齐:0b0000 xxxx xxxx xxxx
2.Number Of Conversion(转换队列数):通道如果是2组或者以上,则必开扫描转换方式。
3.Scan Conversion Mode(扫描转换方式):只有单组转换时,才不打开扫描。
如果使用stm32CubeMX配置,则不用管,系统会自动跳转。
4.Continuous Conversion Mode(连续转换模式):Enable,一次转换完所有所有数据,Disanble只转换一次就停止转换,等待下一次ADC转换触发。
5.Discontinuous Conversion Mode(不连续转换模式):与连续转换模式相反。
简单的说,比如开了ch0,ch1,ch4,ch5。  ch0转换完以后就会自动转换通道1,4,5。如果开启了连续转换模式,则会在转换完ch5之后开始新一轮的转换,如果不连续转换,就是转换完了ch5之后就停止了(跟非常规转换有点像)
6.External Trigger Conversion Source(外部触发转换源):

Regular Conversion launched by software        软件触发 调用函数即可触发ADC转换
Timer X Capture Compare X event                    外部引脚触发
Timer X Trigger Out event                                  定时器通道触发,需要设置相应的定时器
7.Rank(转换队列号):可以单独设置队列号的通道和转换周期。
8.Enable Injected Conversions(注入通道):类似于中断,如图:

9.Enable Analog WatchDog Mode(模拟看门狗):当ADC转换的模拟电压值低于低阈值或高于高阈值时,便会产生中断复位。一些家电设备会设有过压或者欠压保护,跟这个很类似。

 ※注:

1、如果使用ADC,芯片供电2.4~3.6V;不使用ADC芯片供电可以2.0~3.6V。
2、ADC时钟频率不得超过14MHz。
3、规则通道16组,注入通道4组。
4、采样总时间=采样时间+转换时间。


硬件配置

如下所示,双通道、连续转换、右对齐、71.5个周期、无注入、不开看门狗、频率8MHz、添加DMA。
右对齐,12位分辨率,最大值为4095;
71.5个周期,8MHz,总采样时间=(71.5+12.5)/(8*10^6)=31.5us

 

 程序

  1. /* 这段可以添加到adc.c文件中,方便程序多的时候管理和查找 */
  2. uint8_t ADC1_Flag;
  3. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) //ADC转换完成回调函数
  4. {
  5. if(hadc == &hadc1)
  6. {
  7. ADC1_Flag=1; //转换完成的标志
  8. HAL_ADC_Stop_DMA(&hadc1); //转换完关闭ADC转换
  9. }
  10. }
  11. int main(void)
  12. {
  13. HAL_Init();
  14. SystemClock_Config();
  15. MX_GPIO_Init();
  16. MX_DMA_Init();
  17. MX_ADC1_Init();
  18. HAL_ADCEx_Calibration_Start(&hadc1); //开启ADC校准
  19. HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC_val, 10); //以DMA方式开启ADC转换
  20. while (1)
  21. {
  22. if(ADC1_Flag==1)
  23. {
  24. ADC1_Flag=0;
  25. HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC_val,10);
  26. }
  27. }
  28. }

 GPIOA1接的VCC,GPIOA2接的GND;数据如下所示;

※附

这里需要注意一点,这里有两个回调函数,不要看到下面那个注释有个DMA就选择用下面那个回调函数,两个函数都是ADC转换完成的回调函数,我在两个通道测试的时候,转换出来的结果是没有什么不同的,然后我问了一下GPT,说是HAL_ADC_ConvHalfCpltCallback()只转换一半通道,但是两个通道都可以测试到。但是谨慎起见,还是用全部转换的回调函数。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/997444
推荐阅读