[应用相关] STM32F2——ADC多通道DMA采集时AD值大于4095的问题解决方法

[复制链接]
1900|49
 楼主| t60yz 发表于 2022-4-30 18:43 | 显示全部楼层
  1. /** @defgroup ADC_extrenal_trigger_sources_for_regular_channels_conversion
  2.   * @{
  3.   */
  4. #define ADC_ExternalTrigConv_T1_CC1                ((uint32_t)0x00000000)
  5. #define ADC_ExternalTrigConv_T1_CC2                ((uint32_t)0x01000000)
  6. #define ADC_ExternalTrigConv_T1_CC3                ((uint32_t)0x02000000)
  7. #define ADC_ExternalTrigConv_T2_CC2                ((uint32_t)0x03000000)
  8. #define ADC_ExternalTrigConv_T2_CC3                ((uint32_t)0x04000000)
  9. #define ADC_ExternalTrigConv_T2_CC4                ((uint32_t)0x05000000)
  10. #define ADC_ExternalTrigConv_T2_TRGO               ((uint32_t)0x06000000)
  11. #define ADC_ExternalTrigConv_T3_CC1                ((uint32_t)0x07000000)
  12. #define ADC_ExternalTrigConv_T3_TRGO               ((uint32_t)0x08000000)
  13. #define ADC_ExternalTrigConv_T4_CC4                ((uint32_t)0x09000000)
  14. #define ADC_ExternalTrigConv_T5_CC1                ((uint32_t)0x0A000000)
  15. #define ADC_ExternalTrigConv_T5_CC2                ((uint32_t)0x0B000000)
  16. #define ADC_ExternalTrigConv_T5_CC3                ((uint32_t)0x0C000000)
  17. #define ADC_ExternalTrigConv_T8_CC1                ((uint32_t)0x0D000000)
  18. #define ADC_ExternalTrigConv_T8_TRGO               ((uint32_t)0x0E000000)
  19. #define ADC_ExternalTrigConv_Ext_IT11              ((uint32_t)0x0F000000)
 楼主| t60yz 发表于 2022-4-30 19:41 | 显示全部楼层
 再来看看stm32f10x_adc.h文件中的ADC_ExternalTrigConv的参数定义:
  1. /** @defgroup ADC_external_trigger_sources_for_regular_channels_conversion
  2.   * @{
  3.   */

  4. #define ADC_ExternalTrigConv_T1_CC1                ((uint32_t)0x00000000) /*!< For ADC1 and ADC2 */
  5. #define ADC_ExternalTrigConv_T1_CC2                ((uint32_t)0x00020000) /*!< For ADC1 and ADC2 */
  6. #define ADC_ExternalTrigConv_T2_CC2                ((uint32_t)0x00060000) /*!< For ADC1 and ADC2 */
  7. #define ADC_ExternalTrigConv_T3_TRGO               ((uint32_t)0x00080000) /*!< For ADC1 and ADC2 */
  8. #define ADC_ExternalTrigConv_T4_CC4                ((uint32_t)0x000A0000) /*!< For ADC1 and ADC2 */
  9. #define ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO    ((uint32_t)0x000C0000) /*!< For ADC1 and ADC2 */

  10. #define ADC_ExternalTrigConv_T1_CC3                ((uint32_t)0x00040000) /*!< For ADC1, ADC2 and ADC3 */
  11. #define ADC_ExternalTrigConv_None                  ((uint32_t)0x000E0000) /*!< For ADC1, ADC2 and ADC3 */   //f2xx系列并没有这个定义

  12. #define ADC_ExternalTrigConv_T3_CC1                ((uint32_t)0x00000000) /*!< For ADC3 only */
  13. #define ADC_ExternalTrigConv_T2_CC3                ((uint32_t)0x00020000) /*!< For ADC3 only */
  14. #define ADC_ExternalTrigConv_T8_CC1                ((uint32_t)0x00060000) /*!< For ADC3 only */
  15. #define ADC_ExternalTrigConv_T8_TRGO               ((uint32_t)0x00080000) /*!< For ADC3 only */
  16. #define ADC_ExternalTrigConv_T5_CC1                ((uint32_t)0x000A0000) /*!< For ADC3 only */
  17. #define ADC_ExternalTrigConv_T5_CC3                ((uint32_t)0x000C0000) /*!< For ADC3 only */
 楼主| t60yz 发表于 2022-4-30 19:41 | 显示全部楼层
对比发现stm32f2xx系列并没有ADC_ExternalTrigConv_None这个定义,很是奇怪,现在还不明白ST的工程师为什么做这个变动。
  那么问题怎么解决呢?
 楼主| t60yz 发表于 2022-4-30 19:44 | 显示全部楼层
一种是进行adc结构体的初始化操作,在配置之前恢复默认值。即调用ADC_StructInit(&ADC_InitStructure);修改如下:
 楼主| t60yz 发表于 2022-4-30 19:46 | 显示全部楼层
  1.     ADC_StructInit(&ADC_InitStructure);//新增加的
  2.     ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  3.     ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  4.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  5.     ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  6.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  7.     ADC_InitStructure.ADC_NbrOfConversion = 9;
  8.     ADC_Init(ADC1, &ADC_InitStructure);
 楼主| t60yz 发表于 2022-4-30 19:46 | 显示全部楼层
调用ADC_StructInit(&ADC_InitStructure)语句,ADC_ExternalTrigConv会恢复默认值0。如下:
34120626d219d69adf.png
 楼主| t60yz 发表于 2022-4-30 19:53 | 显示全部楼层
另一种方法是直接配置该参数为0,如下:
  1.     ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  2.     ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  3.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  4.     ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  5.     ADC_InitStructure.ADC_ExternalTrigConv= 0;//新增加的
  6.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  7.     ADC_InitStructure.ADC_NbrOfConversion = 9;
  8.     ADC_Init(ADC1, &ADC_InitStructure);
 楼主| t60yz 发表于 2022-4-30 19:53 | 显示全部楼层
这两种方法都可以解决adc采样对齐方式异常问题。
  但是ADC_ExternalTrigConv= 0在stm32f2xx_adc.h中其实是对应ADC_ExternalTrigConv_T1_CC1的。
 楼主| t60yz 发表于 2022-4-30 19:54 | 显示全部楼层
 楼主| t60yz 发表于 2022-4-30 19:55 | 显示全部楼层
 也就是说调用软件触发函数ADC_SoftwareStartConv函数里直接置位CR2的ADC_CR2_SWSTART位也可以触发定时器触发方式的adc通道。
Pulitzer 发表于 2022-10-6 08:29 | 显示全部楼层

这是个再正常不过的coding习惯
Uriah 发表于 2022-10-6 15:30 | 显示全部楼层

CPLD解密,DSP解密都习惯称为单片机解密
Bblythe 发表于 2022-10-6 18:29 | 显示全部楼层

超过变量128后必须使用compact模式编译
周半梅 发表于 2023-5-1 07:26 | 显示全部楼层

Git 的api很多,但其实平时项目中90%的需求都只需要用到几个基本的功能即可
Pulitzer 发表于 2023-5-1 08:29 | 显示全部楼层

孔璧里头必须经过电镀
周半梅 发表于 2023-5-1 09:32 | 显示全部楼层

一般要进行内存优化,尽量提高内存的使用效率
童雨竹 发表于 2023-5-1 10:25 | 显示全部楼层

完全不必要的 Else 块
Wordsworth 发表于 2023-5-1 11:28 | 显示全部楼层

图像由前景和背景组成,在灰度直方图上,前景和背景会形成高峰,在双峰之间的最低谷处就是阈值。
Clyde011 发表于 2023-5-1 12:31 | 显示全部楼层

对于没有else的场景,使用ifPresent即可
万图 发表于 2023-5-1 14:27 | 显示全部楼层

算数逻辑单元(ALU):处理算数和逻辑运算
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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