[MM32软件] EVBoard 之 MM32F3270系列 - ADC通道采集和内部温度传感器

[复制链接]
 楼主| tpgf 发表于 2025-4-11 08:17 | 显示全部楼层 |阅读模式
前言
MB039 EVBoard 为灵动 MM32 新一代通用高性能 F 系列 MM32F3270 硬件评估测试板。本文主要讲解 MB039 板载ADC通道采集以及内部温度传感器采集。

硬件
MB039 拥有三个电位调节器,具体接口图如下:
其中,RV1、RV2、RV3 电路图如下:

1.png

A1、A2、A3 信号与 MM32F3270 引脚对应关系如下:

2.png

3.png

4.png

经查阅数据手册,ADC通道与引脚、电位器对应关系如下所示:

5.png


7571767f85f9f7183b.png

准备就绪后,开始编写程序

软件
配置流程:

开启ADC时钟、GPIOA时钟、DMA1时钟
ADC结构体初始化:
数值转换分辨率
12 bit
11 bit
10 bit
9 bit
8 bit
预分频系数:/16
循环模式:
单次扫描
单周期扫描
连续扫描
数据对齐:
右对齐
左对齐
触发条件:
定时器1通道1捕获比较事件(default)
DMA 通道配置

6.png

配置通道:
DMA_CH1
DMA搬运 - 源配置:
ADC1_DR 寄存器
地址不递增
16bit
DMA搬运 - 目标配置:
ADC1Value[4] 数组
地址递增
16bit
DMA搬运循环:

ADC任意通道配置:
任意通道数量配置:
0~3通道
依次配置 ADC1_CH5 \ ADC1_CH4 \ ADC_CH1 以及内部温度传感器通道(ADC_CH14) 顺序
使能任意配置模式
任意通道模式 覆盖 MM32F0010 及之后的新产品

内部温度传感器使能、使能 EOC 中断、DMA功能
使能 DMA通道1
使能 ADC
代码如下:


void initADC()
{
    ADC_InitTypeDef     ADC_InitStructure;
    GPIO_InitTypeDef    GPIO_InitStructure;
    DMA_InitTypeDef     DMA_InitStructure;

    COMMON_EnableIpClock(emCLOCK_ADC1);
    COMMON_EnableIpClock(emCLOCK_DMA1);
    COMMON_EnableIpClock(emCLOCK_GPIOA);

    ADC_StructInit(&ADC_InitStructure);
    ADC_InitStructure.ADC_Resolution        = ADC_Resolution_12b;
    ADC_InitStructure.ADC_PRESCARE          = ADC_PCLK2_PRESCARE_16;
    ADC_InitStructure.ADC_Mode              = ADC_Mode_Continue;
    ADC_InitStructure.ADC_DataAlign         = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_ExternalTrigConv  = ADC1_ExternalTrigConv_T1_CC1;
    ADC_Init(ADC1, &ADC_InitStructure);

    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    DMA_DeInit(DMA1_ch1);
    DMA_InitStructure.PeripheralBaseAddr    = (u32)&(ADC1->DR);
    DMA_InitStructure.MemoryBaseAddr        = (u32)&ADC1Value[0];
    DMA_InitStructure.DIR                   = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.BufferSize            = 4;
    DMA_InitStructure.PeripheralInc         = DMA_PeripheralInc_Disable;
    DMA_InitStructure.MemoryInc             = DMA_MemoryInc_Enable;
    DMA_InitStructure.PeripheralDataSize    = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.MemoryDataSize        = DMA_MemoryDataSize_Word;
    DMA_InitStructure.Mode                  = DMA_Mode_Circular;
    DMA_InitStructure.Priority              = DMA_Priority_High;
    DMA_InitStructure.M2M                   = DMA_M2M_Disable;
    DMA_Init(DMA1_ch1, &DMA_InitStructure);  

    ADC_ANY_Cmd(ADC1, DISABLE);
    ADC_ANY_NUM_Config(ADC1, 3);
    ADC_ANY_CH_Config(ADC1, 0, ADC_Channel_5);
    ADC_ANY_CH_Config(ADC1, 1, ADC_Channel_4);
    ADC_ANY_CH_Config(ADC1, 2, ADC_Channel_1);
    ADC_ANY_CH_Config(ADC1, 3, ADC_Channel_TempSensor);
    ADC_ANY_Cmd(ADC1, ENABLE);

    ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
    ADC_TempSensorVrefintCmd(ENABLE);
    ADC_DMACmd(ADC1, ENABLE);
    DMA_Cmd(DMA1_ch1, ENABLE);
        ADC_Cmd(ADC1, ENABLE);

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}



ADC转化结果如下:、

7.png

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/chendu103/article/details/112989270

dongnanxibei 发表于 2025-4-23 19:29 | 显示全部楼层
ADC串联的1K电阻是什么作用。
dongnanxibei 发表于 2025-4-23 19:32 | 显示全部楼层
1K是限流电阻吗,保护ADC?
dongnanxibei 发表于 2025-4-23 19:53 | 显示全部楼层
好像用100欧姆也可以
申小林一号 发表于 2025-4-24 18:35 | 显示全部楼层
学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2347

主题

17446

帖子

21

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