赞
踩
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定时器触发数据转换.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。