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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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定时器触发数据转换.
在这里插入图片描述

<think>好的,我现在需要回答用户的问题:如何使用示波器测量定时器触发ADC采样的频率。首先,我需要理解用户的需求。用户可能在进行嵌入式开发,特别是使用微控制器(如STM32STM8、ESP32等)时,需要确保ADC采样的频率准确,因此希望通过示波器来验证实际的触发频率。 根据用户提供的引用资料,特别是引用[4]提到,可以通过设定一个IO口在定时器中断中翻转,然后用示波器测量这个IO口的频率,从而得到实际的采样率。这个方法似乎是最直接的。我需要详细说明具体的步骤,让用户能够操作。 首先,我需要确定如何配置IO口。通常,在定时器的中断服务程序(ISR)中,每次触发中断时,翻转一个GPIO的电平。例如,在STM32中,可以在TIM3的中断处理函数里调用HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0)这样的函数。这样,每次定时器触发ADC采样时,GPIO的电平就会变化一次,产生一个方波。 接下来,用户需要将示波器的探头连接到这个GPIO引脚,测量其频率。因为每次中断触发两次翻转(上升沿和下降沿),所以示波器测得的频率实际上是实际采样率的一半。例如,如果定时器每1ms触发一次中断,翻转的周期是2ms,频率是500Hz,对应的采样率是1kHz。因此需要提醒用户注意这一点,或者直接计算时考虑进去。 然后,需要考虑可能的误差来源。引用[4]提到,实际采样率可能因为中断处理时间、其他中断干扰或系统性能而有所偏差。因此,使用示波器直接测量是最准确的方法,因为它反映了实际的硬件行为,而不是理论计算值。 另外,用户可能想知道是否需要特定的配置,比如是否需要启用定时器的输出比较功能,或者是否需要配置ADC的外部触发源。根据引用[2]和[3],定时器触发ADC通常需要配置定时器的触发输出和ADC的外部触发设置。但在这个问题中,用户主要关注的是测量频率,而不是如何配置触发本身,所以可能不需要深入讨论这些配置细节,但可能需要简要提及,确保定时器正确触发ADC,以便IO翻转与之同步。 还需要考虑不同的微控制器平台是否有不同的实现方式,比如STM32、ESP32等,但用户的问题比较通用,应该给出通用的方法,同时结合引用中的示例,如ESP32的开发案例。 最后,总结步骤:配置IO翻转、连接示波器、测量频率、计算采样率,并注意可能的误差因素。确保步骤清晰,用户能够按照步骤操作。</think>### 如何使用示波器检测定时器触发ADC采样频率的方法 #### 步骤说明 1. **配置GPIO翻转功能** 在定时器触发ADC采样的中断服务程序(ISR)中,添加一个GPIO引脚电平翻转操作。例如,使用STM32的HAL库代码片段如下: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3) { // 假设TIM3触发ADC HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); // 翻转PA0电平 } } ``` 每次定时器触发ADC时,PA0引脚电
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值