ADC 软件触发做多通道自动转换

一、前言

在电机应用中,一般每个控制周期都需要采样一次电流,依据电流采样的方案不同,有三通道采样,双通道采样,单通道采样。这次在 LPC5528 上的 ADC 实现做一次软件触发,自动转换四个 ADC 通道。

LPC5528 的 ADC 有 16 个触发源,每一个触发都可以通过软件写入对应的 SWTRIG[] 相应的位来软件触发,或者可以由外部的输入源做硬件触发,如 GPIO、SCT、CTMIER 或者比较器的输出。

二、实现

做一次软件触发,自动转换四个通道,完成转换之后进中断,在中断里面获取结果。

步骤如下。

  • 初始化 IO 口
  • 初始化时钟
  • 使能 ADC 模块
  • 初始化 ADC,配置相应设置
  • ADC 校正
  • 设定各通道之间的触发转换关系
  • 设定软件触发
  • 使能中断

初始化 IO 口这里不再叙述,LPC5528 具有 ADC 功能的 IO 口如下。

ADC 的时钟源有以下四个。

       -MAIN_CLK

       -PLL0

       -FRO_HF

       -FRO1M

LPC5528 的 ADC 最大目标采样速率是 1M ,使能时钟的代码如下。

CLOCK_SetClkDiv(kCLOCK_DivAdcAsyncClk, 8U, true);

CLOCK_AttachClk(kMAIN_CLK_to_ADC_CLK);

还得再把 ADC 模块的电源开启。

POWER_DisablePD(kPDRUNCFG_PD_LDOGPADC);

 接下来就是配置 ADC 模块,主要配置 CTRL 和 CFG 这两个寄存器,大致看一下主要有哪些配置。CTRL 包含了 ADC 的使能,复位,在 doze 模式下是否使能,是否自动校准,校准转换多少次取均值。

CFG 配置 ADC 的触发转换的优先级,电源和电源基准,是否开启高优先级触发,高优先级打断触发之后的操作,上电延迟等。

设置这两个寄存器的代码,要转换的通道有四个,所以 FIFO 里面存放的条目定义为四个。

LPADC_GetDefaultConfig(&lpadc_config);

lpadc_config.enableAnalogPreliminary = true;

lpadc_config.referenceVoltageSource = kLPADC_ReferenceVoltageAlt2;

lpadc_config.conversionAverageMode = kLPADC_ConversionAverage128;

lpadc_config.FIFO0Watermark = 3;

LPADC_Init(ADC0,&lpadc_config);

然后是校准。

LPADC_DoOffsetCalibration(ADC0);

LPADC_SetOffsetValue(ADC0,0x10U,0x10U);

LPADC_DoAutoCalibration(ADC0);

接下来就是依次设定触发和转换的顺序了。

设定转换,软件触发一次,要转换四个通道,channelNumber 是本通道的通道序号,chainedNextCommandNumber 就是指定下一个要转换的通道的命令序列号,如果不需要连续转换多个通道,这个直接默认不设定即可,这里需要转换四个通道,所以命令序列号分别是从数字 1 到 4,config.conversionResolutionMode 是要转换的 ADC 的精度,默认是 12 位,也可以根据需要选 16位。

LPADC_GetDefaultConvCommandConfig(&lpadcCommand_config);                              

lpadcCommand_config.sampleChannelMode = kLPADC_SampleChannelSingleEndSideA;

lpadcCommand_config.channelNumber = 0;

lpadcCommand_config.chainedNextCommandNumber = 2;

lpadcCommand_config.conversionResolutionMode=kLPADC_ConversionResolutionStandard;

LPADC_SetConvCommandConfig(ADC0, 1U, &lpadcCommand_config);



LPADC_GetDefaultConvCommandConfig(&lpadcCommand_config);


lpadcCommand_config.sampleChannelMode = kLPADC_SampleChannelSingleEndSideA;

lpadcCommand_config.channelNumber = 2;

lpadcCommand_config.chainedNextCommandNumber = 3;

lpadcCommand_config.conversionResolutionMode=kLPADC_ConversionResolutionStandard;

LPADC_SetConvCommandConfig(ADC0, 2U, &lpadcCommand_config);



LPADC_GetDefaultConvCommandConfig(&lpadcCommand_config);

lpadcCommand_config.sampleChannelMode = kLPADC_SampleChannelSingleEndSideA;

lpadcCommand_config.channelNumber = 4;

lpadcCommand_config.chainedNextCommandNumber = 4;

lpadcCommand_config.conversionResolutionMode=kLPADC_ConversionResolutionStandard;

LPADC_SetConvCommandConfig(ADC0, 3U, &lpadcCommand_config);



LPADC_GetDefaultConvCommandConfig(&lpadcCommand_config);

lpadcCommand_config.sampleChannelMode = kLPADC_SampleChannelSingleEndSideB;

lpadcCommand_config.channelNumber = 0;

lpadcCommand_config.conversionResolutionMode=kLPADC_ConversionResolutionStandard;

LPADC_SetConvCommandConfig(ADC0, 4U, &lpadcCommand_config);

 设定触发,上面已经设定了依次转换的通道,所以只触发命令序列号为 1 的命令即可,剩下三个通道将在第一个完成之后自动转换。

LPADC_GetDefaultConvTriggerConfig(&lpadcTrigger_config);

lpadcTrigger_config.targetCommandId = 1;

lpadcTrigger_config.enableHardwareTrigger = false;

LPADC_SetConvTriggerConfig(ADC0,0,&lpadcTrigger_config);

最后是使能中断,在中断里面读取转换值。

先定义一个全局的转换结果存放的结构体数组,一个最终存放 AD 值的数组。

lpadc_conv_result_t g_LpadcResultConfigStruct[4];

uint16_t ADC_DATA[4];

 在中断里面依次获取存放在 FIFO 里面的结果。

for(i=0;i<4;i++)

{

if(LPADC_GetConvResult(ADC0, &g_LpadcResultConfigStruct[i], 0U))

{

ADC_DATA[g_LpadcResultConfigStruct[i].commandIdSource-1]=
g_LpadcResultConfigStruct[i].convValue >> 3;

}

}

 这样,四个通道最终的结果就都存放在 ADC_DATA[4] 这个数组里面。

 每三秒做一次软件触发。

LPADC_DoSoftwareTrigger(ADC0, 1U);

delay(3000);

把 AD 结果打印出来如下,给结果数组下标为 0 的那个通道接了 3.3V ,结果是对的。

简单测一下,这样转换一次需要花多长时间,在做软件触发前一步,把某个 IO 拉低,再到 ADC 中断里面取得结果之后,把 IO 拉高,这样中间低电平时间就是实际做一次触发的时间,结果如下。总时长在 8 us 左右。按照这样来算单通道的转换速度约在 500K 左右。手册里面理论最高速度是 1M,我这里面涉及了其他的一些指令,所以会慢点。


三、总结

LPC5528 的 ADC支持两个单通道同时进行转换,速度还可以更快,支持 16 位的模式转换,准确度还可以更高。


四、参考资料

文中提到关于寄存器部分可以在 LPC5528 的用户手册中 ADC 章节找到,代码部分可下载 SDK 找到 ADC 的 demo 代码按照文中修改即可。
  - LPC5528 的 User manual ,可以从 NXP 官网 (NXP® Semiconductors Official Site | Home) 搜索下载
  - SDK  可以从网址 (Welcome | MCUXpresso SDK Builder (nxp.com)) 搜索下载

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论