打印
[其他ST产品]

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

[复制链接]
1533|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
l63t89|  楼主 | 2023-5-29 23:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
AD, ADC, DM, DMA, ST
一、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 连接到了芯片内部的温度传感器。





使用特权

评论回复
沙发
l63t89|  楼主 | 2023-5-29 23:46 | 只看该作者
三、器件选择
淘宝购买STM32F103C8T6和光敏传感器




使用特权

评论回复
板凳
l63t89|  楼主 | 2023-5-29 23:46 | 只看该作者
四、新建工程
1、打开 STM32CubeMX 软件,点击“新建工程”



使用特权

评论回复
地板
l63t89|  楼主 | 2023-5-29 23:47 | 只看该作者
2、选择 MCU 和封装


使用特权

评论回复
5
l63t89|  楼主 | 2023-5-29 23:47 | 只看该作者
五、配置参数
1、配置时钟RCC 设置,
选择 HSE(外部高速时钟)
选择 LSE(外部低速时钟)



使用特权

评论回复
6
l63t89|  楼主 | 2023-5-29 23:48 | 只看该作者



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

使用特权

评论回复
7
l63t89|  楼主 | 2023-5-29 23:48 | 只看该作者
2、下载口配置ST-LINK
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器SYS 设置,选择

使用特权

评论回复
8
l63t89|  楼主 | 2023-5-29 23:48 | 只看该作者
3、配置状态灯PC13为GPIO_Output、方便查看程序是否运行。

使用特权

评论回复
9
l63t89|  楼主 | 2023-5-29 23:48 | 只看该作者
4、ADC1参数配置
在 Analog 中选择 ADC1 设置,并选择 IN6 通道6

使用特权

评论回复
10
l63t89|  楼主 | 2023-5-29 23:49 | 只看该作者
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 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。

使用特权

评论回复
11
l63t89|  楼主 | 2023-5-29 23:49 | 只看该作者
5、DMA Settings配置
选择DMA Settings选项卡,点击Add,选择ADC1,然后将Mode修改为Circular,Memory地址增加,Data Width选择Half Word。配置完成。

使用特权

评论回复
12
l63t89|  楼主 | 2023-5-29 23:50 | 只看该作者

使用特权

评论回复
13
l63t89|  楼主 | 2023-5-29 23:50 | 只看该作者
6、工程配置
选择最上面的Project Manager的Project,首先对新建的工程命名为STM32F103C8,最后将开发工具改成自己的开发工具,我这里用的是KEIL5,这里选择MDK。

使用特权

评论回复
14
l63t89|  楼主 | 2023-5-29 23:51 | 只看该作者
7、最后生成代码:

使用特权

评论回复
15
l63t89|  楼主 | 2023-5-29 23:51 | 只看该作者
六、程序完善
1、完善main函数
添加变量

初始化ADC
启动ADC校正和HAL_ADC_Start——DMA启动

使用特权

评论回复
16
l63t89|  楼主 | 2023-5-29 23:51 | 只看该作者

使用特权

评论回复
17
l63t89|  楼主 | 2023-5-29 23:51 | 只看该作者
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Value, 10);

使用特权

评论回复
18
l63t89|  楼主 | 2023-5-29 23:52 | 只看该作者
2、查看DMA中断

使用特权

评论回复
19
l63t89|  楼主 | 2023-5-29 23:52 | 只看该作者
3、添加While循环

使用特权

评论回复
20
l63t89|  楼主 | 2023-5-29 23:52 | 只看该作者
  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 */
  }

使用特权

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

本版积分规则

88

主题

776

帖子

1

粉丝