嵌入式技术论坛
直播中

张桂兰

7年用户 1318经验值
私信 关注
[经验]

基于RT-Thread Studio使用STM32单片机的ADC外设

  一、工程建立
  工程建立和时钟配置这里不再赘述,可以看上一篇文章,在PWM中详细的介绍了工程建立的每一步,时钟配置已经做了详细的步骤
  二、驱动配置
  1. 打开ADC驱动
  我们直入主题,更改好时钟后,打开RT-Thread Studio的 RT-Thread Settings,使能ADC设备。
2.jpg
  进入组件-设备驱动程序-使用ADC设备驱动程序
2.jpg
  最后进入board.h中,取消掉ADC1的注释。
2.jpg
  2. Cubemx配置
  STM32最方便的工具就是cubemx了,我们打开cubemx配置管脚的ADC功能。
  我使用的引脚是PA0,将其设置为ADC1的通道5。
2.jpg
  然后点击左边的Analong-ADC1 将通道5设置为Single-ended,默认是12位ADC,如果需要配置其他ADC参数可下拉配置。
2.jpg
  然后点击左上角文件,保存工程后点击右上角获取代码。
  3. 修改驱动
  打开 cubemx下的Src文件,打开stm32l4xx_hal_msp.c,找到下面这两个函数将其剪贴到board.c最下方。
  void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
  void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
  到这里驱动就已经修改完成了,可以建立用户代码了。
  三、构建代码
  1. 新建.c文件
  可以直接在applictation 文件目录右键新建一个源文件,可以随便命名,但是一定要加后缀.c
2.jpg
  2. 导入我们头文件
  #include 《rtthread.h》
  #include 《rtdevice.h》
  3. 定义ADC句柄,ADC设备名,通道、参考电压,位数
  rt_adc_device_t adc_dev;
  #define ADC_DEV_NAME “adc1” /* ADC 设 备 名 称 */
  #define ADC_DEV_CHANNEL 6 /* ADC 通 道 */
  #define REFER_VOLTAGE 330 /* 参 考 电 压 3.3V,数 据 精 度 乘 以100保 留2位 小 数 */
  #define CONVERT_BITS (1 《《 12) /* 转 换 位 数 为12位 */
  4. 编写设备代码
  首先我们需要使用 这个API来查找设备获取设备句柄,
  rt_device_t rt_device_find(const char* name);
  其次使能设备
  rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_uint32_t channel);
  再然后读取ADC结果
  rt_uint32_t rt_adc_read(rt_adc_device_t dev, rt_uint32_t channel);
  4. 这里放上这个.c文件的完整代码
  /*
  * Copyright (c) 2006-2021, RT-Thread Development Team
  *
  * SPDX-License-Identifier: Apache-2.0
  *
  * Change Logs:
  * Date Author Notes
  * 2022-03-14 desktop the first version
  */
  #include 《rtthread.h》
  #include 《rtdevice.h》
  rt_adc_device_t adc_dev;
  #define ADC_DEV_NAME “adc1” /* ADC 设 备 名 称 */
  #define ADC_DEV_CHANNEL 6 /* ADC 通 道 */
  #define REFER_VOLTAGE 330 /* 参 考 电 压 3.3V,数 据 精 度 乘 以100保 留2位 小 数 */
  #define CONVERT_BITS (1 《《 12) /* 转 换 位 数 为12位 */
  static int adc_vol_sample(int argc, char *argv[])
  {
  rt_uint32_t value, vol;
  /* 查 找 设 备 */
  adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
  if (adc_dev == RT_NULL)
  {
  rt_kprintf(“adc sample run failed! can‘t find %s device!n”, ADC_DEV_NAME);
  return RT_ERROR;
  }
  /* 使 能 设 备 */
  rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
  /* 读 取 采 样 值 */
  value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
  rt_kprintf(“the value is :%d n”, value);
  /* 转 换 为 对 应 电 压 值 */
  vol = value * REFER_VOLTAGE / CONVERT_BITS;
  rt_kprintf(“the voltage is :%d.%02d n”, vol / 100, vol % 100);
  return RT_EOK;
  }
  /* 导 出 到 msh 命 令 列 表 中 */
  MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);
  四、 使用方法
  使用方法特别简单,我将这个函数导入了命令行中,可以输入adc_vol_sample这个关键词调用,可以直接输出其ADC电压。
2.jpg




原作者:乐乐爱学习

更多回帖

发帖
×
20
完善资料,
赚取积分