打印
[应用相关]

STM32F2——ADC多通道DMA采集时AD值大于4095的问题解决方法

[复制链接]
楼主: t60yz
手机看帖
扫描二维码
随时随地手机跟帖
21
t60yz|  楼主 | 2022-4-30 18:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
/** @defgroup ADC_extrenal_trigger_sources_for_regular_channels_conversion 
  * @{
  */
#define ADC_ExternalTrigConv_T1_CC1                ((uint32_t)0x00000000)
#define ADC_ExternalTrigConv_T1_CC2                ((uint32_t)0x01000000)
#define ADC_ExternalTrigConv_T1_CC3                ((uint32_t)0x02000000)
#define ADC_ExternalTrigConv_T2_CC2                ((uint32_t)0x03000000)
#define ADC_ExternalTrigConv_T2_CC3                ((uint32_t)0x04000000)
#define ADC_ExternalTrigConv_T2_CC4                ((uint32_t)0x05000000)
#define ADC_ExternalTrigConv_T2_TRGO               ((uint32_t)0x06000000)
#define ADC_ExternalTrigConv_T3_CC1                ((uint32_t)0x07000000)
#define ADC_ExternalTrigConv_T3_TRGO               ((uint32_t)0x08000000)
#define ADC_ExternalTrigConv_T4_CC4                ((uint32_t)0x09000000)
#define ADC_ExternalTrigConv_T5_CC1                ((uint32_t)0x0A000000)
#define ADC_ExternalTrigConv_T5_CC2                ((uint32_t)0x0B000000)
#define ADC_ExternalTrigConv_T5_CC3                ((uint32_t)0x0C000000)
#define ADC_ExternalTrigConv_T8_CC1                ((uint32_t)0x0D000000)
#define ADC_ExternalTrigConv_T8_TRGO               ((uint32_t)0x0E000000)
#define ADC_ExternalTrigConv_Ext_IT11              ((uint32_t)0x0F000000)

使用特权

评论回复
22
t60yz|  楼主 | 2022-4-30 19:41 | 只看该作者
 再来看看stm32f10x_adc.h文件中的ADC_ExternalTrigConv的参数定义:
/** @defgroup ADC_external_trigger_sources_for_regular_channels_conversion 
  * @{
  */

#define ADC_ExternalTrigConv_T1_CC1                ((uint32_t)0x00000000) /*!< For ADC1 and ADC2 */
#define ADC_ExternalTrigConv_T1_CC2                ((uint32_t)0x00020000) /*!< For ADC1 and ADC2 */
#define ADC_ExternalTrigConv_T2_CC2                ((uint32_t)0x00060000) /*!< For ADC1 and ADC2 */
#define ADC_ExternalTrigConv_T3_TRGO               ((uint32_t)0x00080000) /*!< For ADC1 and ADC2 */
#define ADC_ExternalTrigConv_T4_CC4                ((uint32_t)0x000A0000) /*!< For ADC1 and ADC2 */
#define ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO    ((uint32_t)0x000C0000) /*!< For ADC1 and ADC2 */

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

#define ADC_ExternalTrigConv_T3_CC1                ((uint32_t)0x00000000) /*!< For ADC3 only */
#define ADC_ExternalTrigConv_T2_CC3                ((uint32_t)0x00020000) /*!< For ADC3 only */
#define ADC_ExternalTrigConv_T8_CC1                ((uint32_t)0x00060000) /*!< For ADC3 only */
#define ADC_ExternalTrigConv_T8_TRGO               ((uint32_t)0x00080000) /*!< For ADC3 only */
#define ADC_ExternalTrigConv_T5_CC1                ((uint32_t)0x000A0000) /*!< For ADC3 only */
#define ADC_ExternalTrigConv_T5_CC3                ((uint32_t)0x000C0000) /*!< For ADC3 only */

使用特权

评论回复
23
t60yz|  楼主 | 2022-4-30 19:41 | 只看该作者
对比发现stm32f2xx系列并没有ADC_ExternalTrigConv_None这个定义,很是奇怪,现在还不明白ST的工程师为什么做这个变动。
  那么问题怎么解决呢?

使用特权

评论回复
24
t60yz|  楼主 | 2022-4-30 19:44 | 只看该作者
一种是进行adc结构体的初始化操作,在配置之前恢复默认值。即调用ADC_StructInit(&ADC_InitStructure);修改如下:

使用特权

评论回复
25
t60yz|  楼主 | 2022-4-30 19:46 | 只看该作者
    ADC_StructInit(&ADC_InitStructure);//新增加的
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 9;
    ADC_Init(ADC1, &ADC_InitStructure);

使用特权

评论回复
26
t60yz|  楼主 | 2022-4-30 19:46 | 只看该作者
调用ADC_StructInit(&ADC_InitStructure)语句,ADC_ExternalTrigConv会恢复默认值0。如下:

使用特权

评论回复
27
t60yz|  楼主 | 2022-4-30 19:53 | 只看该作者
另一种方法是直接配置该参数为0,如下:
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStructure.ADC_ExternalTrigConv= 0;//新增加的
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 9;
    ADC_Init(ADC1, &ADC_InitStructure);

使用特权

评论回复
28
t60yz|  楼主 | 2022-4-30 19:53 | 只看该作者
这两种方法都可以解决adc采样对齐方式异常问题。
  但是ADC_ExternalTrigConv= 0在stm32f2xx_adc.h中其实是对应ADC_ExternalTrigConv_T1_CC1的。

使用特权

评论回复
29
t60yz|  楼主 | 2022-4-30 19:54 | 只看该作者

使用特权

评论回复
30
t60yz|  楼主 | 2022-4-30 19:55 | 只看该作者
 也就是说调用软件触发函数ADC_SoftwareStartConv函数里直接置位CR2的ADC_CR2_SWSTART位也可以触发定时器触发方式的adc通道。

使用特权

评论回复
31
Pulitzer| | 2022-10-6 08:29 | 只看该作者

这是个再正常不过的coding习惯

使用特权

评论回复
32
Uriah| | 2022-10-6 15:30 | 只看该作者

CPLD解密,DSP解密都习惯称为单片机解密

使用特权

评论回复
33
Bblythe| | 2022-10-6 18:29 | 只看该作者

超过变量128后必须使用compact模式编译

使用特权

评论回复
34
周半梅| | 2023-5-1 07:26 | 只看该作者

Git 的api很多,但其实平时项目中90%的需求都只需要用到几个基本的功能即可

使用特权

评论回复
35
Pulitzer| | 2023-5-1 08:29 | 只看该作者

孔璧里头必须经过电镀

使用特权

评论回复
36
周半梅| | 2023-5-1 09:32 | 只看该作者

一般要进行内存优化,尽量提高内存的使用效率

使用特权

评论回复
37
童雨竹| | 2023-5-1 10:25 | 只看该作者

完全不必要的 Else 块

使用特权

评论回复
38
Wordsworth| | 2023-5-1 11:28 | 只看该作者

图像由前景和背景组成,在灰度直方图上,前景和背景会形成高峰,在双峰之间的最低谷处就是阈值。

使用特权

评论回复
39
Clyde011| | 2023-5-1 12:31 | 只看该作者

对于没有else的场景,使用ifPresent即可

使用特权

评论回复
40
万图| | 2023-5-1 14:27 | 只看该作者

算数逻辑单元(ALU):处理算数和逻辑运算

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则