基于STM32F103C8T6--通过HAL库实现STM32的ADC+DMA

一、ADC简介
12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
二、ADC通道选择
STM32 的 ADC 多达 18 个通道,其中外部的 16 个通道就是框图中的 ADCx_IN0、ADCx_IN1…ADCx_IN5。这 16 个通道对应着不同的 IO 口,具体是哪一个 IO 口可以从手册查询到。其中 ADC1/2/3 还有内部通道:ADC1 的通道 16 连接到了芯片内部的温度传感器,
在这里插入图片描述

三、器件选择
淘宝购买STM32F103C8T6和光敏传感器

在这里插入图片描述
在这里插入图片描述

四、新建工程
1、打开 STM32CubeMX 软件,点击“新建工程”
在这里插入图片描述

2、选择 MCU 和封装
在这里插入图片描述

五、配置参数
1、配置时钟RCC 设置,
选择 HSE(外部高速时钟)
选择 LSE(外部低速时钟)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置

2、下载口配置ST-LINK
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器SYS 设置,选择
在这里插入图片描述

3、配置状态灯PC13为GPIO_Output、方便查看程序是否运行。
在这里插入图片描述

4、ADC1参数配置
在 Analog 中选择 ADC1 设置,并选择 IN6 通道6

在这里插入图片描述

ADCs_Common_Settings:
Mode:
Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选,具体配置 ADC_CR1:DUALMOD 位。
ADC_Settings:
Data Alignment:
Right alignment 转换结果数据右对齐,一般我们选择右对齐模式。
Left alignment 转换结果数据左对齐。
Scan Conversion Mode:
Disabled 禁止扫描模式。如果是单通道 AD 转换使用 DISABLE。
Enabled 开启扫描模式。如果是多通道 AD 转换使用 ENABLE。
Continuous Conversion Mode:
Disabled 单次转换。转换一次后停止需要手动控制才重新启动转换。
Enabled 自动连续转换。
DiscontinuousConvMode:
Disabled 禁止间断模式。这个在需要考虑功耗问题的产品中很有必要,也就是在某个事件触发下,开启转换。
Enabled 开启间断模式。
ADC_Regular_ConversionMode:
Enable Regular Conversions 是否使能规则转换。
Number Of Conversion ADC转换通道数目,有几个写几个就行。
External Trigger Conversion Source 外部触发选择。这个有多个选择,一般采用软件触发方式。
Rank:
Channel ADC转换通道
Sampling Time 采样周期选择,采样周期越短,ADC 转换数据输出周期就越短但数据精度也越低,采样周期越长,ADC 转换数据输出周期就越长同时数据精度越高。
ADC_Injected_ConversionMode:
Enable Injected Conversions 是否使能注入转换。注入通道只有在规则通道存在时才会出现。
WatchDog:
Enable Analog WatchDog Mode 是否使能模拟看门狗中断。当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。
5、DMA Settings配置
选择DMA Settings选项卡,点击Add,选择ADC1,然后将Mode修改为Circular,Memory地址增加,Data Width选择Half Word。配置完成。
在这里插入图片描述

6、工程配置
选择最上面的Project Manager的Project,首先对新建的工程命名为STM32F103C8,最后将开发工具改成自己的开发工具,我这里用的是KEIL5,这里选择MDK。
在这里插入图片描述

7、最后生成代码:
在这里插入图片描述

六、程序完善
1、完善main函数
添加变量
在这里插入图片描述
初始化ADC
启动ADC校正和HAL_ADC_Start——DMA启动
在这里插入图片描述

HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Value, 10);

2、查看DMA中断
在这里插入图片描述
3、添加While循环
在这里插入图片描述

  while (1)
  {
    /* USER CODE END WHILE */
    HAL_Delay(50);
		for(i = 0,adc =0; i < 10;)
		{
			adc += ADC_Value[i++];
		}
		adc /= 10;
    /* USER CODE END WHILE */
    ADC_Vol =(float) adc/4096*3.3;
		
		if(ADC_Vol<0||ADC_Vol>3.3){
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
			flag=1;
		}else if(0<ADC_Vol&&ADC_Vol<0.5){
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
      flag=2;
		}else if(0.5<ADC_Vol&&ADC_Vol<1.5){
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
      flag=3;
		}else if(1.5<ADC_Vol&&ADC_Vol<2.5){
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
      flag=4;
		}else{
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
      flag=5;
		}
    /* USER CODE BEGIN 3 */
  }

4、Debug–实物调试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过HAL库实现STM32的ADC+DMA资源路径

  • 43
    点赞
  • 149
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃突兔兔突秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值