在线时间4069 小时
UID3441752
注册时间2017-11-21
NXP金币753016
TA的每日心情 | 开心 2024-3-26 15:16 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 32033
- 最后登录
- 2024-4-26
|
LPC55xx中ADC多通道采样与DMA传输 在工程应用中,多通道ADC采集与DMA传输是十分重要的。有些客户在使用MCUXpresso IDE对LPC55xx的ADC进行配置时有些许疑问,本文以LPC55S69为例,针对此问题进行讲解。
LPC55xx的ADC是一个全新的设计,它支持单端模拟信号采样、差分模拟信号采样,采样频率可以达到1MSPS。
触发方式支持硬件外部信号触发,软件CTimer与SCT模块触发。我们以软件触发采集为例进行介绍。
1. 轮询模式单通道ADC采集
配置ADC0通道0引脚,LPC55S69-EVK中PIO0_23可由杜邦线引出进行测试,如下:
配置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位为无效位,故要左移三位。
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));
- }
复制代码
|
|