如何用MCC配置PIC24FJ1024GB610的DMA实现定时触发ADC采样
PIC24FJ1024GB610 基于MCC的DMA+ADC+定时器多路采样配置入门
一、配置前置逻辑
先完成ADC和定时器的基础配置,再配置DMA——因为DMA的触发源、数据来源依赖前两者的设置。
二、ADC模块配置(MCC)
- 从左侧外设列表打开
ADC模块:- 核心参数:
- 采样时钟分频:根据多路采样需求设置(例如分频16,保证转换速率稳定)
- 参考电压:选择适配你的模拟输入范围的参考源(如
内部2.048V或VDD/VSS) - 触发源:指定你要使用的定时器(如Timer2),设置为定时器周期触发
- 多路通道配置:
- 在
Channel List中添加所有需要采样的模拟通道(如AN0、AN1、AN2等) - 开启Scan Mode(扫描模式),让ADC按顺序自动完成多路通道采样
- 为每个通道设置合理的采样时间(避免因采样不足导致数据失真)
- 在
- 核心参数:
三、定时器模块配置(MCC)
- 打开目标定时器模块(如Timer2):
- 计算并设置定时器周期:根据目标采样频率,用公式
周期 = (预设值 + 1) * 分频系数 * 指令周期计算参数 - 开启定时器的溢出触发输出,确保定时器每次溢出时能触发ADC启动转换
- 计算并设置定时器周期:根据目标采样频率,用公式
四、DMA模块配置(对应你的MCC界面)
针对你提供的MCC DMA界面,按以下步骤配置:
- 选择空闲DMA通道(如DMA0)
- 数据源设置:
- Source Address:选择ADC结果寄存器
ADC1BUF0(扫描模式下,多路采样结果会依次存入ADC1BUF0~ADC1BUFn,DMA会自动递增读取) - Source Address Increment:设为
Increment(自动指向下一个ADC缓冲寄存器) - Source Data Size:选
16-bit(PIC24的ADC结果以16位寄存器存储)
- Source Address:选择ADC结果寄存器
- 数据目标设置:
- Destination Address:输入你预定义的RAM数组地址,例如
&adc_sample_buffer[0](需提前在代码中定义:uint16_t adc_sample_buffer[CHANNEL_NUM * SAMPLE_NUM];) - Destination Address Increment:设为
Increment(自动将数据存入数组下一个位置) - Destination Data Size:选
16-bit,与数据源匹配
- Destination Address:输入你预定义的RAM数组地址,例如
- 触发源设置:
- Trigger Source:选择
ADC1 Conversion Complete(ADC每次转换完成后触发DMA传输) - Transfer Count:设置总采样次数(例如
CHANNEL_NUM * 100,即每个通道采样100次)
- Trigger Source:选择
- 模式设置:
- 按需开启
Continuous Mode(持续循环采样)或One-Shot Mode(单次采样) - 可选开启
DMA Interrupt,方便在DMA传输完成后触发中断进行后续计算
- 按需开启
五、代码补充与验证
- 在主代码中定义全局采样数组(确保CPU可随时访问):
#define CHANNEL_NUM 4 uint16_t adc_sample_buffer[CHANNEL_NUM]; // 存储单次多路采样结果 - 初始化完成后,启动所有模块:
ADC1_Enable(); TMR2_Start(); DMA0_Enable(); - 后续计算时,直接读取
adc_sample_buffer数组即可,CPU无需参与ADC采样和数据传输过程
六、常见排查点
- DMA无数据传输:检查触发源是否为
ADC转换完成、ADC是否开启扫描模式、DMA通道是否启用 - 采样数据异常:核对ADC参考电压、通道配置,确认定时器周期符合采样速率要求
- 内存访问问题:确保采样数组为全局变量,或放在CPU与DMA均可访问的RAM区域
内容的提问来源于stack exchange,提问作者WalterPH
相关产品推荐
相关产品推荐

