杰发科技AC7840——ADC简介(1)_双路ADC同时使用

0. 简介

1. 特性

2. 双路ADC

Sample里面没有双路的,以为那个规则组只有一个通道,看了外设寄存器才发现,原来他的通道是双路的。

注意1: ADC硬件引脚的配置

注意2: 规则组长度设置和

RSEQ序列号和CH通道号组合应该就对应了转换顺序,如下图所示配置

cpp 复制代码
 ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_0, ADC_CH_9);
 ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_1, ADC_CH_8);
 ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_2, ADC_CH_12);
 ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_3, ADC_CH_1);
 ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_4, ADC_CH_5);
 ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_5, ADC_CH_4);
 ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_6, ADC_CH_7);
 ADC_ConfigChannel(ADC_INDEX, ADC_ISEQ_0, ADC_CH_12);
 ADC_ConfigChannel(ADC_INDEX, ADC_ISEQ_1, ADC_CH_7);
 ADC_ConfigChannel(ADC_INDEX, ADC_ISEQ_2, ADC_CH_13);

代码如下:

cpp 复制代码
void ADC_Init(void)
{
    adc_converter_config_t adcConfig;

    /*! ADC输入端口(电位器)配置*/
    GPIO_DRV_SetMuxModeSel(VR1_PORT, VR1_PIN, PORT_PIN_DISABLED); /*! 电位器VR1*/
    GPIO_DRV_SetMuxModeSel(VR2_PORT, VR2_PIN, PORT_PIN_DISABLED); /*! 电位器VR2*/
    GPIO_DRV_SetMuxModeSel(PORTD, 2, PORT_PIN_DISABLED);          /*! 电位器VR2*/

    /*! ADC配置
    配置ADC为12位分辨率,工作模式为MODE3规则组扫描+注入组扫描模式多通道单次转换,规则组长度为4。
    每触发一次进行一次ADC转换,每次转换规则组中的4个通道。
    */
    ADC_DRV_Init(ADC_INDEX);
    ADC_DRV_InitConverterStruct(&adcConfig);
    adcConfig.clockDivide = ADC_CLK_DIVIDE_6;        /*! ADC时钟分频。ADC时钟源选择在时钟初始化里配置,此例程选择为SPLLDIV2_CLK,频率为60MHz*/
    adcConfig.resolution = ADC_RESOLUTION_12BIT;     /*! ADC分辨率设置*/
    adcConfig.regularTrigger = ADC_TRIGGER_INTERNAL; /*! 规则组触发源类型选择*/
    adcConfig.injectTrigger = ADC_TRIGGER_INTERNAL;  /*! 注入组触发源类型选择*/
    adcConfig.dmaEnable = false;                     /*! DMA使能位*/
    adcConfig.voltageRef = ADC_VOLTAGEREF_VREF;      /*! ADC参考电压源选择,VREF/VDDA*/
    adcConfig.scanModeEn = true;                     /*! 工作模式配置:扫描模式使能位,多通道时需要使能扫描模式,单个通道时不需要使能扫描*/
    adcConfig.continuousModeEn = false;              /*! 工作模式配置:连续模式使能位,1:触发后可连续转换,0:触发一次只转换一次,转换完成后停止*/
    adcConfig.regularDiscontinuousModeEn = false;    /*! 工作模式配置:规则组不连续模式使能位*/
    adcConfig.injectDiscontinuousModeEn = false;     /*! 工作模式配置:注入组不连续模式使能位*/
    adcConfig.injectAutoModeEn = false;              /*! 工作模式配置:自动注入模式使能位*/
    adcConfig.intervalModeEn = false;                /*! 工作模式配置:间隔模式使能位*/
    adcConfig.regularDiscontinuousNum = 0;           /*! 规则组子组长度 (用于mode7)*/
    adcConfig.regularSequenceLength = 4;             /*! 规则组长度设置*/
    adcConfig.injectSequenceLength = 0;              /*! 注入组长度设置*/
    adcConfig.powerEn = true;                        /*! ADC上电*/
    ADC_DRV_ConfigConverter(ADC_INDEX, &adcConfig);  /*! 初始化ADC配置*/

    /*! ADC通道配置*/
    ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_0, VR1_ADC_CH);     /*! 电位器VR1对应通道*/
    ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_1, VR2_ADC_CH);     /*! 电位器VR2对应通道*/
    ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_2, ADC_CH_TSENSOR); /*! 内部温度传感器通道*/
    ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_3, ADC_CH_SUPPLY);  /*! 内部供电电压通道*/

    ADC_DRV_Init(ADC1_INDEX);
    ADC_DRV_InitConverterStruct(&adcConfig);
    adcConfig.clockDivide = ADC_CLK_DIVIDE_6;            /*! ADC时钟分频。ADC时钟源选择在时钟初始化里配置,此例程选择为SPLLDIV2_CLK,频率为60MHz*/
    adcConfig.resolution = ADC_RESOLUTION_12BIT;         /*! ADC分辨率设置*/
    adcConfig.regularTrigger = ADC_TRIGGER_INTERNAL;     /*! 规则组触发源类型选择*/
    adcConfig.injectTrigger = ADC_TRIGGER_INTERNAL;      /*! 注入组触发源类型选择*/
    adcConfig.dmaEnable = false;                         /*! DMA使能位*/
    adcConfig.voltageRef = ADC_VOLTAGEREF_VREF;          /*! ADC参考电压源选择,VREF/VDDA*/
    adcConfig.scanModeEn = true;                         /*! 工作模式配置:扫描模式使能位,多通道时需要使能扫描模式,单个通道时不需要使能扫描*/
    adcConfig.continuousModeEn = false;                  /*! 工作模式配置:连续模式使能位,1:触发后可连续转换,0:触发一次只转换一次,转换完成后停止*/
    adcConfig.regularDiscontinuousModeEn = false;        /*! 工作模式配置:规则组不连续模式使能位*/
    adcConfig.injectDiscontinuousModeEn = false;         /*! 工作模式配置:注入组不连续模式使能位*/
    adcConfig.injectAutoModeEn = false;                  /*! 工作模式配置:自动注入模式使能位*/
    adcConfig.intervalModeEn = false;                    /*! 工作模式配置:间隔模式使能位*/
    adcConfig.regularDiscontinuousNum = 0;               /*! 规则组子组长度 (用于mode7)*/
    adcConfig.regularSequenceLength = 1;                 /*! 规则组长度设置*/
    adcConfig.injectSequenceLength = 0;                  /*! 注入组长度设置*/
    adcConfig.powerEn = true;                            /*! ADC上电*/
    ADC_DRV_ConfigConverter(ADC1_INDEX, &adcConfig);     /*! 初始化ADC配置*/
    ADC_ConfigChannel(ADC1_INDEX, ADC_RSEQ_0, ADC_CH_2); /*! 内部供电电压通道*/
}
相关推荐
独小乐2 天前
019.ADC转换和子中断|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·驱动开发·笔记·嵌入式硬件·mcu·arm
电子科技圈4 天前
SmartDV展示完整的边缘与连接IP解决方案,以高速和低功耗特性赋能移动、物联网和媒体处理设备创新
人工智能·嵌入式硬件·mcu·物联网·智能家居·智能硬件·iot
天月风沙4 天前
Betaflight飞控、树莓派RP2350B主控编译教程
linux·单片机·嵌入式硬件·mcu·无人机·树莓派
电子科技圈5 天前
芯科科技2026 Tech Talks技术讲座启航聚焦无线与边缘 AI,共绘智能物联新蓝图
人工智能·嵌入式硬件·mcu·物联网·智能家居·智能硬件·iot
EVERSPIN6 天前
低功耗MCU对TWS充电仓的驱动控制
单片机·嵌入式硬件·mcu·低功耗mcu
白掰虾7 天前
STM32CubeMX2教程——STM32C5 UART
stm32·单片机·嵌入式硬件·mcu·usart·stm32cubemx2·stm32c542
狂奔蜗牛(bradley)9 天前
使用数组重构责任链实现通信协议解析
网络·mcu·重构
狂奔蜗牛(bradley)10 天前
嵌入式软件中如何用责任链模式重构串口协议栈
网络·单片机·mcu·重构·责任链模式
咸鱼嵌入式10 天前
【AutoSAR】详解CANIF模块
单片机·mcu·车载系统·autosar
EVERSPIN11 天前
高性能32位MCU在热敏打印机上的应用
单片机·嵌入式硬件·mcu·32位mcu