[应用相关] STM32 ADC 同步规则模式 ADC1与ADC2同用一个DMA

[复制链接]
 楼主| 和下土 发表于 2022-7-26 16:59 | 显示全部楼层 |阅读模式
ST, AD, dc, ADC1, ADC2, DM
STM32 ADC 支持同步规则模式 ,其官方解释为:
3458062dfacf359a7c.png
 楼主| 和下土 发表于 2022-7-26 17:00 | 显示全部楼层
大致意思就是通道组的 ADC1 的多路开关(由 ADC1_CTLR2寄存器的 ETSRC[2:0]决定), ADC2 被同步触发。在 ADC1 或 ADC2 的转换事件结束时,即 ADC1 或 ADC2 的规则通道转换完毕,会产生一个 EOC 中断。32 位 ADC1_RDTR 寄存器包含上半字(由 ADC2 转换的数据构成)和下半字(由 ADC1 转换的数据构成), 32 位的 DMA 被用来将 ADC_RDTR 中的数据传送到 SRAM。
 楼主| 和下土 发表于 2022-7-26 17:01 | 显示全部楼层
注意: 1, 不要在两路 ADC 上转换相同的通道(两路 ADC 在同一通道转换时采样时间不可重叠)。
 楼主| 和下土 发表于 2022-7-26 17:03 | 显示全部楼层
  1. 在同步模式下, ADC1 和 ADC2 同步采样的两个通道的需要设置为准确的相同采样时间



  2. 来个应用例子吧:

  3. // ADC1 做电流检实时检测
  4. ADC_DeInit(ADC1,&ADC_InitStructure);
  5. ADC_InitStructure.ADC_Mode = ADC_MODE_REGSIMULT;
  6.     ADC_InitStructure.ADC_Mode_Scan = ENABLE;                                 // 开启多通道扫描模式
  7.     ADC_InitStructure.ADC_Mode_Continuous = ENABLE;                             // 连续模式
  8.     ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE;  
  9.     ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
  10.     ADC_InitStructure.ADC_Channel_Number = 4;  
  11.     ADC_Init(ADC1,&ADC_InitStructure);
  12. ADC_RegularChannel_Config (ADC1,ADC_CHANNEL_2, 1, ADC_SAMPLETIME_7POINT5 );  // I
  13. ADC_RegularChannel_Config (ADC1,ADC_CHANNEL_2, 2, ADC_SAMPLETIME_7POINT5 );  // I
  14. ADC_RegularChannel_Config (ADC1,ADC_CHANNEL_2, 3, ADC_SAMPLETIME_7POINT5 );  // I
  15. ADC_RegularChannel_Config (ADC1,ADC_CHANNEL_2, 4, ADC_SAMPLETIME_7POINT5 );  // I




  16. // ADC2 做电流峰值,位置,温度,电压等检测
  17.     ADC_DeInit(ADC2,&ADC_InitStructure);
  18. ADC_InitStructure.ADC_Mode = ADC_MODE_REGSIMULT;
  19.     ADC_InitStructure.ADC_Mode_Scan = ENABLE;                                 // 开启多通道扫描模式
  20.     ADC_InitStructure.ADC_Mode_Continuous = ENABLE;                             // 连续模式
  21.     ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE;  
  22.     ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
  23.     ADC_InitStructure.ADC_Channel_Number = 4;  
  24.     ADC_Init(ADC2,&ADC_InitStructure);  
  25. ADC_RegularChannel_Config (ADC2,ADC_CHANNEL_1, 1, ADC_SAMPLETIME_7POINT5 );  // I-PEAK
  26. ADC_RegularChannel_Config (ADC2,ADC_CHANNEL_3, 2, ADC_SAMPLETIME_7POINT5 );  // POS
  27. ADC_RegularChannel_Config (ADC2,ADC_CHANNEL_4, 3, ADC_SAMPLETIME_7POINT5 );  // NTC

  28. ADC_RegularChannel_Config (ADC2,ADC_CHANNEL_5, 4, ADC_SAMPLETIME_7POINT5 );  // VDC



  29. DMA_DeInit(DMA1_CHANNEL1);
  30.    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_RDTR_ADDRESS;
  31.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(Adc12Result);
  32.     DMA_InitStructure.DMA_DIR = DMA_DIR_PERIPHERALSRC;  
  33.     DMA_InitStructure.DMA_BufferSize = BuffSize;
  34.     DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
  35.     DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_ENABLE;
  36.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PERIPHERALDATASIZE_WORD;
  37.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MEMORYDATASIZE_WORD;
  38.     DMA_InitStructure.DMA_Mode = DMA_MODE_CIRCULAR;
  39.     DMA_InitStructure.DMA_Priority = DMA_PRIORITY_MEDIUM;
  40.     DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE;
  41.     DMA_Init(DMA1_CHANNEL1, &DMA_InitStructure);  

  42. 。。。。

  43. ADC_SoftwareStartConv_Enable(ADC1,ENABLE);
  44. ADC_SoftwareStartConv_Enable(ADC2,ENABLE);

  45. 这样DMA就直接读取到两个ADC同步转换的结果了。
 楼主| 和下土 发表于 2022-7-26 17:06 | 显示全部楼层
版权声明:本文为CSDN博主「张十三的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhanglifu3601881/article/details/80622138
您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

1366

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部