[STM32F7] stm32外设之ADC|DAC总结

[复制链接]
3118|68
 楼主| 慢动作 发表于 2022-11-23 15:22 | 显示全部楼层
然后是单次,连续,扫描或者间断进行,这就是下面要讲的各个模式的特点了
然后是左右对齐,st的ADC是12位的逐次逼近型的ADC,所以采集的有效数据就是12位的,但是确保存在16位的寄存器中,这样不就有了左对齐和右对齐了吗,当然这样还会在比如我们使用DMA传输的时候,传输什么样大小的字节有关系喽
 楼主| 慢动作 发表于 2022-11-23 15:23 | 显示全部楼层
下面提到了ADC的时钟,可以看到ADC转换速率最快能有1Mhz,这个结果又是怎么出来的呢,因为ADC转换一次的时间一般就是采样时间+转换时间,而转换时间官方说明了是12.5个周期,而采样时间最小是1.5个周期,这样在最快的时钟下不就是14个周期吗,然后始终是14M,这样就是1Mhz的采样速率了 12093637dca4c3b336.png
 楼主| 慢动作 发表于 2022-11-23 15:25 | 显示全部楼层
下面讲到了注入组和规则组,通俗理解注入组就像是中断一样,会打断规则组,完成注入组的采样,之后结束在进入规则组
52150637dcaf57031f.png
 楼主| 慢动作 发表于 2022-11-23 15:26 | 显示全部楼层
下面的部分讲到了他的这个两个比较重要的寄存器,一个是使能发送的寄存器,一个是接收数据的寄存器
93546637dcb1c949f3.png
 楼主| 慢动作 发表于 2022-11-23 15:34 | 显示全部楼层
下面看下ADC的硬件部分
97377637dccf4034bc.png
 楼主| 慢动作 发表于 2022-11-23 15:35 | 显示全部楼层
首先就讲清楚了作为一个逐次逼近型的ADC的本质,就是和VREF+还有VREF-进行比较接近的,另外还有两个模拟电源接口,就是通过这两个引脚来进行逐次逼近的,当然采样用的还是ADC外设连接的引脚,这个在2中体现出来了,3就是上面讲到的注入通道和规则通道了,4就是我们st给他设置的时钟。这里我们一般使用12Mhz即可,如下所示:
38364637dcd49dbad2.png
 楼主| 慢动作 发表于 2022-11-23 15:36 | 显示全部楼层
5就是使用外部触发来转换,前面提到了ADC_CR2这个寄存器,ADC转换的开始与结束可以由这个寄存器来控制,也可以使用外部事件来触发,常用的就是定时器了,这样效果比再循环中不断地启用定时器效果要好点!
 楼主| 慢动作 发表于 2022-11-23 15:37 | 显示全部楼层
ADC在CUBEMX中的配置了解

打开cube配置好基本时钟后,选择ADC,使能ADC可以看到如下内容,值得关注的是他也提供了关于内部温度传感器还有参考电压引脚的接口
93276637dcd9aca974.png
 楼主| 慢动作 发表于 2022-11-23 15:37 | 显示全部楼层
下面是ADC的配置接口,这里可以很快的看到三个模式(注意F4的话和这个页面不太一样)
84124637dcdc3228d5.png
 楼主| 慢动作 发表于 2022-11-23 15:38 | 显示全部楼层
关于这个的理解:

扫描模式只在多通道ADC的时候有效,这样配置扫描模式使得通道按照配置的循环次序进行依次转换,而单次模式(就是关闭连续转换模式)无论是单通道还是多通道都是进行一次,连续模式就是不停的扫描
 楼主| 慢动作 发表于 2022-11-23 15:38 | 显示全部楼层
关于不连续转换模式,也称为间断模式,这里官方解释是:该设置只在连续转换失能的时候该参数才有效,否则这个参数就被抛弃
 楼主| 慢动作 发表于 2022-11-23 15:39 | 显示全部楼层
另一种解释就是不连续转换就是不一定要转换完所有通道(连续模式是转换完所有的哦),而是指定这个序列中的n的通道
 楼主| 慢动作 发表于 2022-11-23 15:40 | 显示全部楼层
下面看看采样周期相关的,在下面的设置中显示了采样周期,如果使用多个通道的话这里就要设置好先后已经周期
20823637dce4c15463.png
 楼主| 慢动作 发表于 2022-11-23 15:40 | 显示全部楼层
同样根据常识,st外设的三种模式,轮询,中断还有DMA

  HAL_ADC_Start(hadc);
  HAL_ADC_Start_IT(hadc);
  HAL_ADC_Start_DMA(hadc, pData, Length);
 楼主| 慢动作 发表于 2022-11-23 15:42 | 显示全部楼层
在这里还有一个比较重要的自校准函数,虽然不知道能有啥用,但校准总比不校准好啊

HAL_ADCEx_Calibration_Start(&hadc1); //adc的自校准
 楼主| 慢动作 发表于 2022-11-23 15:43 | 显示全部楼层
上面的这几个函数将在下面广泛出现
 楼主| 慢动作 发表于 2022-11-23 15:45 | 显示全部楼层
单通道采集

直接轮询采集
相对比较方便,直接设置即可
77557637dcf91bc778.png
 楼主| 慢动作 发表于 2022-11-23 15:48 | 显示全部楼层
初始化代码

HAL_ADC_Start(&hadc1);
 楼主| 慢动作 发表于 2022-11-23 15:49 | 显示全部楼层
采集代码

        HAL_ADC_PollForConversion(&hadc1, 50); // 转换函数,等待时间50ms
        singel_adc = HAL_ADC_GetValue(&hadc1); // 获取ADC采样值
        HAL_ADC_Start(&hadc1); // 再次开启采集
        //可适当自行延迟
 楼主| 慢动作 发表于 2022-11-23 15:51 | 显示全部楼层
我们查看效果,采集很成功!
29909637dd0ec145ee.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部