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

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

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

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

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
引用\[1\]中提到了在使用定时器控制ADC采样速率时,如果不在代码最开始将定时器计数值清零,而是在语句末尾将其清零,可能会导致采样率不准确的情况。在STM32H750上实现定时器控制ADC采样速率的方法如下: 1. 配置定时器:首先,需要配置一个定时器,例如TIM2,以产生固定的时间间隔。可以设置定时器的预分频器和计数器的自动重装载值,以控制定时器的计数速度和溢出时间。 2. 配置ADC:接下来,需要配置ADC模块,选择合适的通道和采样时间,并使能ADC。 3. 启动定时器:在代码中,需要在合适的位置启动定时器,使其开始计数。 4. 定时器中断处理函数:在定时器溢出时,会触发定时器中断。在中断处理函数中,可以进行ADC的采样操作。可以使用DMA来实现ADC的连续转换,以提高采样效率。 5. 数据处理:获取到ADC采样的数据后,可以进行相应的数据处理,例如滤波、计算等。 通过以上步骤,可以实现定时器控制ADC采样速率的功能。确保在代码中适当的位置清零定时器计数值,以保证采样率的准确性。 #### 引用[.reference_title] - *1* [STM32使用ADC定时器进行数据采集时的采样率问题](https://blog.csdn.net/EstrangedZ/article/details/123175428)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值