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

ADC采样控制与C语言数组长度问题
文章讨论了如何通过Timer定时器控制ADC采样率,以及遇到的问题,如误解Timer触发ADC转换机制和sizeof函数在获取数组长度时的不稳定。还提到了ADC多通道数据顺序问题及其解决方案。

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函数是根据内容进行判断的, 遇到特殊数值就回来了.
(N个月后,回来看到这篇文章, 发现这里的bug补一下…后来经过人工智能的协助.)
C语言中求数组的长度的标准方法. 是

 int aaa =  sizeof(ADC_Values) / sizeof(ADC_Values[0]); 

所以 HAL_ADC_Start_DMA 这里最后一个参数必须得写死.不能动态的根据sizeof来求数组的大小.

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

评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值