本帖最后由 rongxiangjun 于 2021-6-21 13:46 编辑
在工程应用中,多通道ADC采集与DMA传输是十分重要的。有些客户在使用MCUXpresso IDE对LPC55xx的ADC进行配置时有些许疑问,本文以LPC55S69为例,针对此问题进行讲解。 LPC55xx的ADC是一种全新的IP,它支持单端模拟信号采样,差分模拟信号采样,采样频率可以达到1MSPS。触发方式支持硬件外部信号触发,软件CTimer与SCT模块触发。我们以软件触发采集为例。 1. 轮询模式单通道ADC采集 配置ADC0通道0引脚,LPC55S69-EVK中PIO0_23可由杜邦线引出进行测试,如下:
配置ADC0通道引脚
配置ADC0的时钟,如下:
配置ADC的时钟
配置ADC0外设,如下:
配置ADC0外设
每秒中采集ADC0通道0一次,如下: /* Enable ADC */ POWER_DisablePD(kPDRUNCFG_PD_LDOGPADC); /*Store the AD result*/ lpadc_conv_result_t mLpadcResultConfigStruct0; while(1) { /* Delay 1s */ SysTick_DelayTicks(1000U); /* 1U is trigger0 mask. */ LPADC_DoSoftwareTrigger(ADC0,1U); /* Wait ADC conversion */ while (!LPADC_GetConvResult(ADC0,&mLpadcResultConfigStruct0, 0U)){} /* Print AD value */ PRINTF("ADC value0: %d\r\n", ((mLpadcResultConfigStruct0.convValue) >> 3)); }
查找UserManual,如下。在single-end A通道模式下,ADC转化值储存在FIFO 0中,故LPADC_GetConvResult函数第三个传参为0,表示将FIFO 0的值保存到lpadc_conv_result_t类型的结构体中。FIFO 0在十二位ADC精度下,ADC转化值0~2位为无效位,故要左移三位。
UserManual
2. 定时器中断多通道ADC采样 配置ADC0通道0引脚,LPC55S69-EVK中PIO0_23可由杜邦线引出进行测试,配置ADC0通道4引脚,PIO1_8可由杜邦线引出进行测试,配置ADC0通道1引脚,PIO1_9连接于VDDA,如下: 配置ADC0外设,如下: 配置Ctimer0引脚、时钟、外设如下所示: 在mian.c中声明ctimer0中断回调函数,并在回调函数中读取ADC转换值,只触发一次AD采样,可以连续采样三次,如下: lpadc_conv_result_t mLpadcResultConfigStruct0; lpadc_conv_result_t mLpadcResultConfigStruct1; lpadc_conv_result_t mLpadcResultConfigStruct2; void Timer0_Callback(uint32_t flags); void Timer0_Callback(uint32_t flags) { LPADC_DoSoftwareTrigger(ADC0, 1U); /* 1U is trigger0 mask. */ while (!LPADC_GetConvResult(ADC0, &mLpadcResultConfigStruct0, 0U)){} PRINTF("ADC value0: %d\r\n", ((mLpadcResultConfigStruct0.convValue) >> 3)); while (!LPADC_GetConvResult(ADC0, &mLpadcResultConfigStruct1, 0U)){} PRINTF("ADC value1: %d\r\n", ((mLpadcResultConfigStruct1.convValue) >> 3)); while (!LPADC_GetConvResult(ADC0, &mLpadcResultConfigStruct2, 0U)){} PRINTF("ADC value2: %d\r\n", ((mLpadcResultConfigStruct2.convValue) >> 3)); } 3. DMA读取ADC转换值
程序流程如下所示: 配置DMA外设,如下: 修改main.c,如下: lpadc_conv_result_t mLpadcResultConfigStruct0; lpadc_conv_result_t mLpadcResultConfigStruct1; lpadc_conv_result_t mLpadcResultConfigStruct2; uint32_t g_AdcConvResult[1]; volatile boolg_DmaTransferDoneFlag = false; void Timer0_Callback(uint32_t flags); void ADC_DMA_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds); void Timer0_Callback(uint32_t flags) { /* 1U is trigger0 mask. */ LPADC_DoSoftwareTrigger(ADC0, 1U); } void ADC_DMA_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds) { if (true == transferDone) { g_DmaTransferDoneFlag = true; } } Main函数添加代码,如下: /* Enable ADC */ POWER_DisablePD(kPDRUNCFG_PD_LDOGPADC); while(1) { /* Wait ADC conversion */ while ((LPADC_GetStatusFlags(ADC0) & kLPADC_ResultFIFO0ReadyFlag) == 0UL){} /* Start DMA Transfer */ DMA_StartTransfer(&DMA0_CH0_Handle); /* Wait DMA Transfer */ while (false == g_DmaTransferDoneFlag){} PRINTF("Adc conversion word :0x%X\r\n",g_AdcConvResult[0]); PRINTF("ADC conversion value:%d\r\n", ((uint16_t)(g_AdcConvResult[0] & 0xFFFFU) >> 3));
} 参考论坛: 轮询单通道ADC采集:
LPC55S69_Project_single_channel.zip
(656.48 KB, 下载次数: 25)
|