查看: 781|回复: 3

[求助] MKV30如何使用ADC的差分模式

[复制链接]
  • TA的每日心情
    无聊
    2021-1-15 10:56
  • 签到天数: 39 天

    [LV.5]常住居民I

    21

    主题

    116

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    436
    最后登录
    2021-10-9
    发表于 2020-11-12 15:56:42 | 显示全部楼层 |阅读模式
    MKV30这款芯片支不支持ADC的差分输入,例程中没有,如果有,如何配置成差分模式呢

    最佳答案

    https://www.nxpic.org.cn/module/ ... =%E5%B7%AE%E5%88%86
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20003
    最后登录
    2024-4-24
    发表于 2020-11-13 08:51:46 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2021-1-15 10:56
  • 签到天数: 39 天

    [LV.5]常住居民I

    21

    主题

    116

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    436
    最后登录
    2021-10-9
     楼主| 发表于 2020-11-13 13:12:35 | 显示全部楼层
    小恩GG 发表于 2020-11-13 08:51
    https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=614978&highlight=%E5%B7%AE%E5%88% ...

    借鉴了链接的代码。和我的没啥区别,但是没有效果。咋回事


    #include "ADC.h"
    /***********************************************************************************************************************
    * BOARD_InitPeripherals functional group
    **********************************************************************************************************************/
    #define ADC16_RESULT_REG_ADDR    0x4003b010U
    #define DEMO_ADC16_SAMPLE_COUNT 16U /* The ADC16 sample count. */

    volatile bool g_Transfer_Done = false; /* DMA transfer completion flag. */
    edma_transfer_config_t g_transferConfig;
    uint32_t g_adc16SampleDataArray[DEMO_ADC16_SAMPLE_COUNT];
    /***********************************************************************************************************************
    * DMA initialization code
    **********************************************************************************************************************/

    static void Edma_Callback(edma_handle_t *handle, void *userData, bool transferDone, uint32_t tcds)
    {
        /* Clear Edma interrupt flag. */
        EDMA_ClearChannelStatusFlags(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, kEDMA_InterruptFlag);
        /* Setup transfer */
        EDMA_PrepareTransfer(&g_transferConfig, (void *)ADC16_RESULT_REG_ADDR, sizeof(uint32_t),
                             (void *)g_adc16SampleDataArray, sizeof(uint32_t), sizeof(uint32_t),
                             sizeof(g_adc16SampleDataArray), kEDMA_PeripheralToMemory);
        EDMA_SetTransferConfig(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, &g_transferConfig, NULL);
        /* Enable transfer. */
        EDMA_StartTransfer(&DMA_CH1_Handle);
        g_Transfer_Done = true;
    }

    const edma_config_t DMA_config = {
      .enableContinuousLinkMode = false,
      .enableHaltOnError = false,
      .enableRoundRobinArbitration = false,
      .enableDebugMode = false
    };
    edma_handle_t DMA_CH1_Handle;
    edma_handle_t DMA_CH2_Handle;

    void ADC_DMA_init(void) {

      /* Channel CH1 initialization */
      /* Set the source kDmaRequestMux0ADC0 request in the DMAMUX */
      DMAMUX_SetSource(DMA_DMAMUX_BASEADDR, DMA_CH1_DMA_CHANNEL, DMA_CH1_DMA_REQUEST);
      /* Enable the channel 1 in the DMAMUX */
      DMAMUX_EnableChannel(DMA_DMAMUX_BASEADDR, DMA_CH1_DMA_CHANNEL);
      /* Create the eDMA DMA_CH1_Handle handle */
      EDMA_CreateHandle(&DMA_CH1_Handle, DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL);

      /* Channel CH2 initialization */
      /* Set the source kDmaRequestMux0ADC1 request in the DMAMUX */
      DMAMUX_SetSource(DMA_DMAMUX_BASEADDR, DMA_CH2_DMA_CHANNEL, DMA_CH2_DMA_REQUEST);
      /* Enable the channel 2 in the DMAMUX */
      DMAMUX_EnableChannel(DMA_DMAMUX_BASEADDR, DMA_CH2_DMA_CHANNEL);
      /* Create the eDMA DMA_CH2_Handle handle */
      EDMA_CreateHandle(&DMA_CH2_Handle, DMA_DMA_BASEADDR, DMA_CH2_DMA_CHANNEL);
    }
    void EDMA_Configuration(void)
    {
            edma_config_t userConfig;

        EDMA_GetDefaultConfig(&userConfig);
        EDMA_Init(DMA_DMA_BASEADDR, &DMA_config);
        EDMA_CreateHandle(&DMA_CH1_Handle, DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL);
        EDMA_SetCallback(&DMA_CH1_Handle, Edma_Callback, NULL);
        EDMA_PrepareTransfer(&g_transferConfig, (void *)ADC16_RESULT_REG_ADDR, sizeof(uint32_t),
                             (void *)g_adc16SampleDataArray, sizeof(uint32_t), sizeof(uint32_t),
                             sizeof(g_adc16SampleDataArray), kEDMA_PeripheralToMemory);
        EDMA_SubmitTransfer(&DMA_CH1_Handle, &g_transferConfig);
        /* Enable interrupt when transfer is done. */
        EDMA_EnableChannelInterrupts(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, kEDMA_MajorInterruptEnable);
    #if defined(FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT) && FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT
        /* Enable async DMA request. */
        EDMA_EnableAsyncRequest(DMA_DMA_BASEADDR, DMA_CH1_DMA_CHANNEL, true);
    #endif /* FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT */
        /* Enable transfer. */
        EDMA_StartTransfer(&DMA_CH1_Handle);
    }
    /***********************************************************************************************************************
    * ADC0 initialization code
    **********************************************************************************************************************/

    adc16_channel_config_t ADC0_channelsConfig[1] = {
      {
        .channelNumber = 1U,
        .enableDifferentialConversion = false,
        .enableInterruptOnConversionCompleted = false,
      }
    };
    const adc16_config_t ADC0_config = {
      .referenceVoltageSource = kADC16_ReferenceVoltageSourceVref,
      .clockSource = kADC16_ClockSourceAsynchronousClock,
      .enableAsynchronousClock = true,
      .clockDivider = kADC16_ClockDivider8,
      .resolution = kADC16_ResolutionSE16Bit,
      .longSampleMode = kADC16_LongSampleDisabled,
      .enableHighSpeed = false,
      .enableLowPower = false,
      .enableContinuousConversion = true
    };
    const adc16_channel_mux_mode_t ADC0_muxMode = kADC16_ChannelMuxA;
    const adc16_hardware_average_mode_t ADC0_hardwareAverageMode = kADC16_HardwareAverageCount8;

    void ADC0_init(void) {
      /* Initialize ADC16 converter */
      ADC16_Init(ADC0_PERIPHERAL, &ADC0_config);
      /* Make sure, that software trigger is used */
      ADC16_EnableHardwareTrigger(ADC0_PERIPHERAL, false);
      /* Configure hardware average mode */
      ADC16_SetHardwareAverage(ADC0_PERIPHERAL, ADC0_hardwareAverageMode);
      /* Configure channel multiplexing mode */
      ADC16_SetChannelMuxMode(ADC0_PERIPHERAL, ADC0_muxMode);
      /* Initialize channel */
      ADC16_SetChannelConfig(ADC0_PERIPHERAL, 0U, &ADC0_channelsConfig[0]);
      /* Enable DMA. */
      ADC16_EnableDMA(ADC0_PERIPHERAL, true);
    }

    /***********************************************************************************************************************
    * ADC1 initialization code
    **********************************************************************************************************************/

    adc16_channel_config_t ADC1_channelsConfig[1] = {
      {
        .channelNumber = 1U,
        .enableDifferentialConversion = true,
        .enableInterruptOnConversionCompleted = false,
      }
    };
    const adc16_config_t ADC1_config = {
      .referenceVoltageSource = kADC16_ReferenceVoltageSourceVref,
      .clockSource = kADC16_ClockSourceAsynchronousClock,
      .enableAsynchronousClock = true,
      .clockDivider = kADC16_ClockDivider8,
      .resolution = kADC16_ResolutionSE16Bit,
      .longSampleMode = kADC16_LongSampleDisabled,
      .enableHighSpeed = false,
      .enableLowPower = false,
      .enableContinuousConversion = false
    };
    const adc16_channel_mux_mode_t ADC1_muxMode = kADC16_ChannelMuxA;
    const adc16_hardware_average_mode_t ADC1_hardwareAverageMode = kADC16_HardwareAverageDisabled;

    void ADC1_init(void) {
      /* Initialize ADC16 converter */
      ADC16_Init(ADC1_PERIPHERAL, &ADC1_config);
      /* Make sure, that software trigger is used */
      ADC16_EnableHardwareTrigger(ADC1_PERIPHERAL, false);
      /* Configure hardware average mode */
      ADC16_SetHardwareAverage(ADC1_PERIPHERAL, ADC1_hardwareAverageMode);
      /* Configure channel multiplexing mode */
      ADC16_SetChannelMuxMode(ADC1_PERIPHERAL, ADC1_muxMode);
      /* Initialize channel */
      ADC16_SetChannelConfig(ADC1_PERIPHERAL, 0U, &ADC1_channelsConfig[0]);
       /* Enable DMA. */
       ADC16_EnableDMA(ADC1_PERIPHERAL, true);       

    }
    uint32_t ADC_Value = 0;

    void DifferentialSample_DC(void)
    {
          
          
            while (0U == (kADC16_ChannelConversionDoneFlag & ADC16_GetChannelStatusFlags(ADC0, 0)))
            {
            }
            ADC_Value = ADC16_GetChannelConversionValue(ADC0, 0);
            ADC_Value = ADC_Value*3000/4095;
         

    }
    /***********************************************************************************************************************
    * Initialization functions
    **********************************************************************************************************************/
    void ADC_InitPeripherals(void)
    {
      /* Global initialization */
      DMAMUX_Init(DMAMUX);
      EDMA_Init(DMA_DMA_BASEADDR, &DMA_config);
      EDMA_Configuration();
      /* Initialize components */
      ADC_DMA_init();
      ADC0_init();
      ADC1_init();
            DifferentialSample_DC();
    }

    /***********************************************************************************************************************
    * BOARD_InitBootPeripherals function
    **********************************************************************************************************************/
    void ADC_InitBootPeripherals(void)
    {
      ADC_InitPeripherals();
    }
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2021-1-15 10:56
  • 签到天数: 39 天

    [LV.5]常住居民I

    21

    主题

    116

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    436
    最后登录
    2021-10-9
     楼主| 发表于 2020-11-13 15:32:54 | 显示全部楼层

    我现在使用SDK里面的例程移植过来,可以采集出AD,但是16个大小的数组,只有第一个有数据其他都是0
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-24 17:15 , Processed in 0.127518 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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