你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F7实现ADC采集(软件触发+轮询)

[复制链接]
STMCU小助手 发布时间:2021-12-12 22:12
基于HAL库,实现最简单ADC采集。
第一步,使用CubeMX配置时钟。
202004191224273.png


然后是adc的配置:

20200419125831989.png


将,稍微修改一下风格,并手写头文件和源文件。

adc.h很简单,就不说了。

  1. #ifndef __ADC_H
  2. #define __ADC_H
  3. #include "sys.h"

  4. void MY_ADC_Init(void);                                 //ADC通道初始化
  5. u16  Get_Adc(void);                         //获得某个通道值
  6. #endif
复制代码

其中,MY_ADC_Init和HAL_ADC_MspInit的内容完全是根据CubeMX生成的代码写的,就改了一个变量名字。Get_Adc则简单了,当我们需要获取adc的值的时候,先HAL_ADC_Start启动ADC,然后HAL_ADC_PollForConversion等待转换完成,最后HAL_ADC_GetValue返回结果。

  1. #include "adc.h"
  2. #include "delay.h"


  3. ADC_HandleTypeDef ADC1_Handler;                 //ADC句柄
  4. ADC_ChannelConfTypeDef ADC1_ChanConf;       //ADC通道配置句柄


  5. //初始化ADC
  6. void MY_ADC_Init(void)
  7. {
  8.     ADC1_Handler.Instance = ADC1;
  9.     ADC1_Handler.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //4分频,ADCCLK=PCLK2/4=108/4=27MHZ
  10.     ADC1_Handler.Init.Resolution = ADC_RESOLUTION_12B;           //12位模式
  11.     ADC1_Handler.Init.ScanConvMode = DISABLE;                    //非扫描模式
  12.     ADC1_Handler.Init.ContinuousConvMode = DISABLE;              //关闭连续转换
  13.     ADC1_Handler.Init.DiscontinuousConvMode = DISABLE;           //禁止不连续采样模式
  14.     ADC1_Handler.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; //使用软件触发
  15.     ADC1_Handler.Init.ExternalTrigConv = ADC_SOFTWARE_START;     //软件触发
  16.     ADC1_Handler.Init.DataAlign = ADC_DATAALIGN_RIGHT;           //右对齐
  17.     ADC1_Handler.Init.NbrOfConversion = 1;                       //1个转换在规则序列中 也就是只转换规则序列1
  18.     ADC1_Handler.Init.NbrOfDiscConversion = 0;                   //不连续采样通道数为0
  19.     ADC1_Handler.Init.DMAContinuousRequests = DISABLE;           //关闭DMA请求
  20.     ADC1_Handler.Init.EOCSelection = DISABLE;                    //关闭EOC中断
  21.     HAL_ADC_Init(&ADC1_Handler);                                 //初始化

  22.     ADC1_ChanConf.Channel = ADC_CHANNEL_5;                      //通道5 PA5
  23.     ADC1_ChanConf.Rank = 1;                                     //1个序列
  24.     ADC1_ChanConf.SamplingTime = ADC_SAMPLETIME_480CYCLES;      //采样时间
  25.     ADC1_ChanConf.Offset = 0;
  26.     HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_ChanConf);       //通道配置

  27. }

  28. //ADC底层驱动,引脚配置,时钟使能
  29. //此函数会被HAL_ADC_Init()调用
  30. //hadc:ADC句柄
  31. void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
  32. {
  33.     GPIO_InitTypeDef GPIO_Initure;
  34.     __HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟
  35.     __HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟

  36.     GPIO_Initure.Pin = GPIO_PIN_5;          //PA5
  37.     GPIO_Initure.Mode = GPIO_MODE_ANALOG;   //模拟
  38.     GPIO_Initure.Pull = GPIO_NOPULL;        //不带上下拉
  39.     HAL_GPIO_Init(GPIOA, &GPIO_Initure);
  40. }

  41. //获得ADC值
  42. //ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
  43. //返回值:转换结果
  44. u16 Get_Adc()
  45. {
  46.     HAL_ADC_Start(&ADC1_Handler);                               //开启ADC
  47.     HAL_ADC_PollForConversion(&ADC1_Handler, 10);               //轮询转换
  48.     return (u16)HAL_ADC_GetValue(&ADC1_Handler);                //返回最近一次ADC1规则组的转换结果
  49. }
复制代码

main.c中,主函数初始化之后,直接读取adc的值,并打印。

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "adc.h"

  5. int main(void)
  6. {
  7.     u16 adcx;
  8.     Cache_Enable();                 //打开L1-Cache
  9.     HAL_Init();                     //初始化HAL库
  10.     Stm32_Clock_Init(432, 8, 2, 9); //设置时钟,216Mhz
  11.     delay_init(216);                //延时初始化
  12.     uart_init(115200);              //串口初始化
  13.     MY_ADC_Init();                  //初始化ADC1通道5
  14.         
  15.     while (1)
  16.     {
  17.         adcx = Get_Adc(); //获取通道5的转换值,20次取平均
  18.         printf("%d\r\n", adcx);
  19.         delay_ms(250);
  20.     }
  21. }
复制代码

如果需要对多个通道进行轮询读取,可以稍微修改一下函数Get_Adc,在每次读取之前设置一下需要转换的通道:

  1. //获得ADC值
  2. //ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
  3. //返回值:转换结果
  4. u16 Get_Adc(u32 ch)   
  5. {
  6.     ADC_ChannelConfTypeDef ADC1_ChanConf;

  7.     ADC1_ChanConf.Channel=ch;                                   //通道
  8.     ADC1_ChanConf.Rank=1;                                       //1个序列
  9.     ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
  10.     ADC1_ChanConf.Offset=0;                 
  11.     HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置
  12.         
  13.     HAL_ADC_Start(&ADC1_Handler);                               //开启ADC
  14.         
  15.     HAL_ADC_PollForConversion(&ADC1_Handler,10);                //轮询转换

  16.         return (u16)HAL_ADC_GetValue(&ADC1_Handler);                    //返回最近一次ADC1规则组的转换结果
  17. }
复制代码



收藏 评论0 发布时间:2021-12-12 22:12

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版