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定时器触发数据转换.