![shequ.stmicroelectronics.cn](./template/st_v1/static/img/logo2.png)
我使用的是stm32g431这款芯片,现在想采样两路模拟信号,为了采样速度更快,想用adc1和adc2两个模块分别对这两路进行采样。使用ADC_DUALMODE_INJECSIMULT(双AD同步注入模式),CUBE配置如下所示,使用定时器更新事件触发ADC注入转换。 ADC1模块配置: ADC2模块配置(ADC1配置了同步触发,此时ADC2配置页面中无触发源选项配置,其他与ADC1保持不变) 在CUBE生成的初始化代码后添加一些ADC启动代码: 问题出现: 只有ADC1的注入通道有数据,ADC2的注入通道无数据。 想问一下这个是什么情况呢?我试过两个ADC模块都使用独立模式(ADC_MODE_INDEPENDENT),触发源与模块ADC1一致,这样是有数据的。如下: 修改的代码如下: |
cubeide的代码怎么编译到内部+外部FLASH里面去
关于stm32g030f6p6 adc3个值问题 temp vrefint vbat
IDE最新版1.17.0生成代码强制转utf8,导致中文乱码
STM32G431 FDCAN当普通can使用,拔掉连接的can设备,为什么一直没能触发FIFO满标志?
cubeIDE在运行时显示Failed to execute MI command是什么问题呢?
加快STM32G473上电时间
STM32G431 flash和can为什么没有LL库?
STM32U5 偶尔出现无法进入shutdown模式
STM32 CAN设备掉线,程序发送卡死的问题解决办法?
STM32G431FDCAN当作普通can使用的例程?
[md]不能简单地说 在模块初始化函数MX_ADC2_Init中就不行。
现在ADC1 ADC2是dualmode主从模同时运行,启动ADC1时 ADC2应该什么都准备好了。
所以ADC2的启动相关配置要放在ADC1的启动操作之前完成,否则就做不到同步启动。
你看我给你的示例里,启动ADC放在初始化函数外部,我非常清晰地将启动ADC2放在前面,以为你可以一眼看出端倪呢。
至于启动ADC执行代码放在哪里并无硬性规定,只需满足主从同步启动的条件即可。
具体到这里,我们可以将启动ADC1 ADC2的代码按照先执行从启动、后执行主启动的顺序放在
任何需要启动ADC的地方。
比方初始化顺序是这样:
我将启动ADC的代码放在ADC2_INIT()函数模块也照样OK.
使用上述配置的双ADC模式同步注入转换,CUBE生成的代码如下:(ADC2无数据)
然后循环查询转换结果,没有什么问题。
if( HAL_ADCEx_InjectedPollForConversion(&hadc1, 0xaaaa)== HAL_OK)
{
ResultADC1= HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_1);
ResultADC2= HAL_ADCEx_InjectedGetValue(&hadc2, ADC_INJECTED_RANK_1);
__HAL_ADC_CLEAR_FLAG(&hadc1, ADC_FLAG_JEOS);
__HAL_ADC_CLEAR_FLAG(&hadc2, ADC_FLAG_JEOS);
}
我也是ADC1 ADC2各用1个通道,ADC1的通道信号稳定,所以结果稳定。ADC2通道悬空,结果飘动。
谢谢回答!
请问你用的也是G431这款芯片验证的吗?我之前有用过F407的双ADC模块同步注入,印象中没出现过问题。。
还有就是,如果你的程序中不加你写的"循环查询转换结果"代码段,只从Watch里面去看寄存器数据hadc1.Instance->JDR1和hadc1.Instance->JDR2,这两个数据是不是也应该一直在刷新呢?我的程序中没有写ADC_IT_JEOS标志位的清除语句,但我觉得这对寄存器中的数据没有影响。
我把主循环代码 完全 屏蔽掉,只启动ADC1 /2 和TIMER,
依然可以看到结果的变化:
不行,你通过私信把邮件给我,我把配置给你参考下。
谢谢!😄
我的邮箱:[email]1258103084@qq.com[/email]
谢谢。邮件已经收到,对比看了一下cube配置和代码,已经找到问题:
我的开启hadc2触发采样代码必须要在main函数中进行初始化,在模块初始化函数MX_ADC2_Init中就不行。还不清楚是什么原因😕,但写在这边让以后遇到这种问题的人有个参考吧。
改为以下就好了:
数据可以正常刷新:
[md]新年好。
那我明白了,原来是这样,谢谢答复。
[md]刚刚试了一下,在启动ADC1之前启动ADC2是可以的。👍 👍
就是上次你邮件发给我的配置文件生成的代码中没有启动ADC的语句。是发错了吗,不然我应该会注意到这点不同的。
main函数:
ADC1初始化函数:
ADC2初始化函数:
[md]边实践边研究手册,搞定就好。