STM32F103配置了ADC1 的4个通道,利用定时器的事件触发进行10Hz 的数据采样,数据通过DMA传输。然后希望每次采样4*50个数据后触发DMA的中断进行数据的处理。 根据教程进行了相关的配置后,遇到了2个问题: 1 定时器配置成10hz,但是每次启动采集后基本马上就能进入DMA的回调函数,里面数据已经刷满了,所以感觉ADC的采样频率似乎不是收定时器触发的。 2DMA的回调函数HAL_ADC_ConvHalfCpltCallback,HAL_ADC_ConvCpltCallback,应该是数据完成一半数量的采集后触发第一个回调,全部采集后再触发第二个回调,但是实际上每次都是在第一个回调中数据就全部刷新了,采样完成的回调中不会有新的数据刷新。 希望有人能帮忙指点下,谢谢 |
请问STM32F1能使用11.059Mhz外部晶振吗?如果可以,怎么设置系统频率和PLL?
stm32编码器模式计数问题
Error in final launch sequence: Failed to execute MI command: target remote localhost:61234
最新CubeMX 创建STM32F1 FreeRTOS 选择新版库 1.8.6 后 工程出错
LSM6DS3TR-C 长时间读取后角速度输出为0
单次ADC采样出现两次进入DMA中断的异常情况,救救孩子吧o(╥﹏╥)o
STM32F103高级定时器中,开启单脉冲模式(置位TIMx_CR1:RCR)是不是会立刻清除计数器使能位?
上电或者复位时IO的状态不对
我的也是cubeMX的myST账号登陆不上,搞到夜里12点,都崩溃了
STM32F103做从站 上电过程,上位机不断发送数据造成,通讯失败,请大侠指导一下
实际上运行是没问题的。
1. 这个现象是因为调试暂停时,定时器的计数器并没有暂停(中断服务程序停下来),所以更新事件的触发信号还是 继续给的,ADC 继续转换。当暂停时,把数据又转换了一些。
2. 可以通过两种方式验证。 一是观察定时器计数值,当单步运行时,每一步的计数值远远大于理论事件
二是讲触发间隔事件拉长到秒级以上,会发现单步走时不断有数据转换进来的。
[md]你的理解没有问题。即每次TIMER触发,ADC就做4次扫描转换。
如果你是非连续模式,按照你的代码,每触发50次,也就是得到200个数据后 进入DMA完成中断。
如果是连续模式,TIMER触发一次后,后面的触发就无效或不必要了。
你要检查代码逻辑方面问题,或者哪里误会了,尤其时间计算上。
你的ADC的启动应该是TIMER触发的,不过TIMER的每次触发后,几个ADC通道基于扫描模式,会依照他们
自己的节奏进行转换,这个过程的确跟TIMER就没有什么关系。
如果你希望,TIMER触发一次就转换1个通道,你就得调整ADC的配置,4个通道的扫描模式不动,但要配置为
间断转换模式,每次TIMER触发只转换一个通道,依次进行。这样ADC的转换就按照TIMER的触发节奏来走了。
关于ADC的间断转换,或称分组转换,可以参考下这篇 《STM32 ADC间断转换模式应用示例》。
你好,目前我就是希望每个定时器事件能够触发一次采集,每次扫描采集4个ADC通道。但是给我的感觉是,没次定时器的间隔时间理论上是0.1s,然后HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1_data, 200);应该是采集50次后触发HAL_ADC_ConvHalfCpltCallback回调,再触发50次后触发HAL_ADC_ConvCpltCallback。不知道我的理解对不对。
如果我的理解没问题的话,那么每次开始采集后,至少要过5s左右才能进入回调函数。但是实际上基本1s 不到就进去了。
所以我觉得很奇怪
谢谢,这个方式我验证下。这几天我在调试时还发现个现象,就是吧回调函数直接放在main.c下面时候,确实每个5s左右会触发一次回调函数,然后每次都能有200个数据刷新出来,然后我将回调函数放到单独的一个c文件后,就会出现HAL_ADC_ConvHalfCpltCallback这个回调函数基本还是5秒左右进入一次(能够刷新200个数据),但是这个函数执行完后后基本马上进入HAL_ADC_ConvCpltCallback(但是不会有数据刷新),而不是要过5s左右。(HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1_data, 200);我的理解没5s进入一次half回调,刷新200个数据,然后过5s进入另外一个回调,刷新200 数据。)
你的方法我也再尝试下。但是不知道我对ADC的这个配置的理解是否正确
你好,根据你提供的建议,我将定时器改成1s,发现正如你说说,在HAL_ADC_ConvHalfCpltCallback,中可能先刷新一般的数据,但是这个时候定时器并没有停止工作,还在不停的触发ADC进行转换,所有随着我在这个回调函数中停留的时间越长,adc的buf里面的数据也在不停的刷新,所以当程序离开HAL_ADC_ConvHalfCpltCallback后会马上进入HAL_ADC_ConvCpltCallback,并给人没有刷新数据的错觉。
另外我想请教下
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1_data, 200);这个函数中200 ,是不是意味着当采集到100个数据后,会进入HAL_ADC_ConvHalfCpltCallback,当200个数据都采集完成后,会进入HAL_ADC_ConvCpltCallback。
然后还有个问题,如果我把ADC的模式改成连续转换模式,是否也可以由定时器进行触发采集来控制采集的频率?谢谢
2. 如果改成连续转换模式,ADC触发后会持续转换,这样就与定时触发冲突了哦。
如果不选连续转换,则速度非常慢!
好的,谢谢指导
嗯嗯,我就是想要定频率采集。