当前位置: 首页 > article >正文

stm32的ADC采样率如何通过Time定时器进行控制

ADC采样率是个跟重要的概念.
手册上说可以通过Timer定时器进行触发ADC采样.
可我这边悲剧的是, 无论怎么样. ADC都会进行采样. 而且就算是TIM停掉也是一样会进行采样. 这就让我摸不着头脑了…

我想通过定时器动态更改ADC的采样频率. 结果不随我愿…

这到底是什么问题呢?

一开始我的设置是
在这里插入图片描述
在这里插入图片描述
折腾了好久, 最后突然间明白了. TMD, 手册上说的是用Time触发, 触发并不代表用Time控制ADC的转换, ADC的转换还是按照ADC本身的时钟和你设置的转换周期进行转换. Timer信号来的时候开始转换而已.

而我前面的ADC1设置, 设置了连续转换. 也就是说, 只要开始了, 就不停. 所以, 启动以后跟Timer定时器就没啥毛关系了…所以ADC就不在受Timer控制了, 哎呀.真是!!! 瞬间清醒啊

改成下面这样的配置

在这里插入图片描述
把ADC的连续转换改成非连续转换. 让Time触发转换, 只转换一次, 下次再采样,还是由Time来控制. 这样就可以用Time来控制转换率了

诡异之一
然后又遇到一个诡异的事情…sizeof( ) 求数组大小的这个函数, 得到的结果竟然会变…
对应的是同一个数组ADC_Values[]…
代码如下

 #define ADCValuesLength 1200  
 uint16_t ADC_Values[ADCValuesLength]  = {1, 2, 3, 4, 5, 6};
 //在循环中这个 aaa 竟然时不时的会变成其它数值, 明明是1200, 为何会变成 
 volatile int aaa = sizeof(ADC_Values); 
 HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Values, aaa); // 启动DMA

在循环中这个 aaa 竟然时不时的会变成其它数值, 明明是1200, 为何会变?
我估计sizeof函数是根据内容进行判断的, 遇到特殊数值就回来了.
所以 HAL_ADC_Start_DMA 这里最后一个参数必须得写死.不能动态的根据sizeof来求数组的大小.

**诡异之二 ADC多通道扫描取得的数据顺序竟然会乱. **
我只用了2个通道, 规则扫描的, 后来竟然发现. 会乱掉. 这就问题大了. 后来在网上根据他人的经验, 估计是时钟启动顺序有问题. 然后我的代码就改成了, 先停止时钟, 再停止DMA, 然后处理完之后先开启ADC,再开启ADC的DMA, 最后开启Time定时器触发数据转换.
在这里插入图片描述


http://www.kler.cn/a/105705.html

相关文章:

  • 前端接入Paymax支付请求
  • 进程其他知识点
  • SpringBoot:不支持发行版本17超详细解决办法
  • 3D Streaming 在线互动展示系统:NVIDIA RTX 4090 加速实时渲染行业数字化转型
  • 掌握Golang中的数据竞争检测:runtime/race包全面教程
  • 计算机网络-MSTP基础实验一(单域多实例)
  • 【表面缺陷检测】钢轨表面缺陷检测数据集介绍(2类,含xml标签文件)
  • R语言代码示例
  • 包管理工具与配置文件package.json
  • UI设计中设计文章列表左右的思考优漫动游
  • 从【臀部监控】到【电脑监控软件】,企业如何在隐私权与管理权博弈中找到平衡
  • 分享一款基于 AI 的 Chrome 插件
  • Ubuntu 下 VSCode Tab 间距非常小解决方案
  • 导入Embassy库进行爬虫
  • 云原生Docker数据管理
  • Mac怎么删除文件和软件?苹果电脑删除第三方软件方法
  • labelimg使用以及xml和txt转化
  • React项目中使用zustand状态管理详细教程
  • 【PointNet—论文笔记分享】
  • 为何 DevOps 会给开发人员带来压力和倦怠?
  • windows协议详解之-RPC/SMB/LDAP/LSA/SAM域控协议关系
  • close excel by keyword 根据关键字关闭 excel 窗口 xlwings 方式实现
  • C++经典面试题:内存泄露是什么?如何排查?
  • vue3中路由hash与History的设置
  • 【开源】基于SpringBoot的天然气工程业务管理系统的设计和实现
  • 使用Google的地点自动补全功能