查看: 2023|回复: 2

[原创] 【经验分享】frdm-k64 adc多路采集四连之第一连--基本用法

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20014
最后登录
2024-4-25
发表于 2020-6-12 09:56:29 | 显示全部楼层 |阅读模式
信号发生器产生一个个正弦波,峰峰值3.3V,幅度在0-3V,频率50Hz,用ADC采样500个数据。
1.jpg

使用DMA每次读取10个数据,产生一次请求,打印出来,总共循环50次

1、 首先将PTB2配置为模拟输入(其实可以不用PORT_SetPinMux配置,ptb2默认功能就是adc)
PORT_SetPinMux(PORTB, 2U,kPORT_PinDisabledOrAnalog);
2、 配置dmamux,设置源为40,即ADC0,使能ADC
       DMAMUX_Init(DMAMUX0);
  DMAMUX_SetSource(DMAMUX0,DMAMUXCHANNEL,DMAMUXSOURCE);
DMAMUX_EnableChannel(DMAMUX0,DMAMUXCHANNEL);
3、 edma配置
EDMA_GetDefaultConfig(&edma_config);
EDMA_Init(DMA0,&edma_config);
EDMA_CreateHandle(&edma_handle,DMA0,DMAMUXCHANNEL);
EDMA_SetCallback(&edma_handle,edma0_callback,NULL);
EDMA_PrepareTransfer(&transfer_config,
                                          (void*)ADC16_RESULT_REG_ADDR,sizeof(uint32_t),
                                          (void*)adc_array,sizeof(uint32_t),sizeof(uint32_t),
                                          sizeof(adc_array),kEDMA_PeripheralToMemory);
EDMA_SubmitTransfer(&edma_handle,&transfer_config);
EDMA_EnableChannelInterrupts(DMA0,0U,kEDMA_MajorInterruptEnable);
       EDMA_StartTransfer(&edma_handle);
获取默认配置,分局配置初始化edma,为通道0创建一个edma句柄,设置回调函数。
设置传输配置,从ADC16_RESULT_REG_ADDR处读取数据,数据宽度uint32_t,传输到adc_array这个位置,数据宽度uint32_t,每次请求发送sizeof(uint32_t)字节,总共发送sizeof(adc_array)这么多字节。发送类型为从外设到内存。使能通道,开始传输。
      定义回调函数
       static void edma0_callback(edma_handle_t*handle, void *userData, bool transferDone, uint32_t tcds)
{
       EDMA_ClearChannelStatusFlags(DMA0,0U,kEDMA_InterruptFlag);
       EDMA_PrepareTransfer(&transfer_config,
                                          (void*)ADC16_RESULT_REG_ADDR,sizeof(uint32_t),
                                          (void*)adc_array,sizeof(uint32_t),sizeof(uint32_t),
                                         sizeof(adc_array),kEDMA_PeripheralToMemory);
   EDMA_SetTransferConfig(DMA0, DMAMUXCHANNEL, &transfer_config, NULL);
   /* Enable transfer. */
   EDMA_StartTransfer(&edma_handle);
       g_Transfer_Done= true;
}
将dma中断标志清除,然后开始准备下一次传输。
4、 adc配置
ADC16_GetDefaultConfig(config1);
config1->enableContinuousConversion= true;
ADC16_Init(ADC_DEMO,config1);
ADC16_EnableHardwareTrigger(ADC_DEMO,false);
if(ADC16_DoAutoCalibration(ADC_DEMO) ==kStatus_Success)
{
        PRINTF("calibrationsuccessful\r\n");
}
ADC16_EnableDMA(ADC0,true);
获取adc默认配置,adc精度12bit,初始化,硬件触发禁用。做校准后,使能ADC dma通道。
配置adc通道
channel_config.channelNumber = 12U;
channel_config.enableDifferentialConversion = false;
channel_config.enableInterruptOnConversionCompleted = false;
ADC16_SetChannelConfig(ADC0, ADC_DEMO_GROUP, &channel_config);
PTB2是adc0的通道12。禁用差分转换,禁用通道转换完成中断。
       结果如下图
2.png

excel点图

3.png

回复

使用道具 举报

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

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2020-6-15 09:51:27 | 显示全部楼层
    一直想DIY一个信号发生器。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20014
    最后登录
    2024-4-25
     楼主| 发表于 2020-6-16 13:34:54 | 显示全部楼层
    jobszheng5 发表于 2020-6-15 09:51
    一直想DIY一个信号发生器。

    玩玩可以,真要测还是不行滴
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-25 14:56 , Processed in 0.121378 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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