查看: 2789|回复: 8

[原创] LPC55xx中ADC多通道采样与DMA传输

[复制链接]

该用户从未签到

7

主题

15

帖子

0

注册会员

Rank: 2

积分
189
最后登录
2022-3-9
发表于 2021-6-21 13:46:33 | 显示全部楼层 |阅读模式
本帖最后由 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通道引脚
配置ADC0的时钟,如下:

配置ADC的时钟

配置ADC的时钟
配置ADC0外设,如下:

配置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

UserManual
2.    定时器中断多通道ADC采样
配置ADC0通道0引脚,LPC55S69-EVK中PIO0_23可由杜邦线引出进行测试,配置ADC0通道4引脚,PIO1_8可由杜邦线引出进行测试,配置ADC0通道1引脚,PIO1_9连接于VDDA,如下:
6_gai.JPG
配置ADC0外设,如下:
7_gai.JPG
配置Ctimer0引脚、时钟、外设如下所示:
8_gai.JPG
在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转换值

程序流程如下所示:
14.jpg
配置DMA外设,如下:
10_gai.JPG
11_gai.JPG
修改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)
回复

使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32003
    最后登录
    2024-4-9
    发表于 2021-6-21 14:09:49 | 显示全部楼层
    必须高亮走一波,感谢分享
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2021-6-21 15:30:33 | 显示全部楼层
    这个就高级了。
    还有状态流程图,厉害了。
    向楼主学习
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 15:37
  • 签到天数: 42 天

    [LV.5]常住居民I

    42

    主题

    500

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1369

    热心会员

    最后登录
    2024-2-23
    发表于 2021-6-21 16:20:21 | 显示全部楼层
    这个步骤很详细
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    昨天 10:49
  • 签到天数: 557 天

    [LV.9]以坛为家II

    34

    主题

    5913

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5681
    最后登录
    2024-4-19
    发表于 2021-6-22 10:16:29 | 显示全部楼层
    总有新知识。学习了。
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    14 分钟前
  • 签到天数: 1934 天

    [LV.Master]伴坛终老

    61

    主题

    1万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    17226
    最后登录
    2024-4-20
    发表于 2021-6-22 11:02:51 | 显示全部楼层
    步骤很详细,学习了
    nxp.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-8-30 17:43
  • 签到天数: 306 天

    [LV.8]以坛为家I

    14

    主题

    1746

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    2526
    最后登录
    2023-8-30
    发表于 2021-6-23 12:02:20 | 显示全部楼层
    不错不错,学习了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-8-30 17:43
  • 签到天数: 306 天

    [LV.8]以坛为家I

    14

    主题

    1746

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    2526
    最后登录
    2023-8-30
    发表于 2021-6-29 09:09:48 | 显示全部楼层
    不错。内容相当详细了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-1-4 14:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    172

    帖子

    0

    高级会员

    Rank: 4

    积分
    567
    最后登录
    2024-4-10
    发表于 2022-4-21 09:49:52 | 显示全部楼层
    学习了,谢谢
    每天登陆学习一下
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-20 11:45 , Processed in 0.164738 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表