查看: 883|回复: 1

[求助] frdm kv31f ADC 讀取正弦波值

[复制链接]
  • TA的每日心情

    2021-8-30 18:28
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    3

    主题

    13

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    467
    最后登录
    2022-9-8
    发表于 2021-8-13 17:34:20 | 显示全部楼层 |阅读模式
    本帖最后由 Alan_3318a3 于 2021-8-13 17:36 编辑

    使用SDK的ADC中斷範例程式讀取50Hz弦波(如圖1),發現讀取的波形與假設不符(如圖2),請問是那些設置有誤?

    /*
    * Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
    * Copyright 2016-2018 NXP
    * All rights reserved.
    *
    * SPDX-License-Identifier: BSD-3-Clause
    */

    #include "fsl_debug_console.h"
    #include "pin_mux.h"
    #include "clock_config.h"
    #include "board.h"
    #include "fsl_adc16.h"

    /*******************************************************************************
    * Definitions
    ******************************************************************************/
    #define DEMO_ADC16_BASE          ADC0
    #define DEMO_ADC16_CHANNEL_GROUP 0U
    #define DEMO_ADC16_USER_CHANNEL  8U /* PTB0, ADC0_SE8 */

    #define DEMO_ADC16_IRQn             ADC0_IRQn
    #define DEMO_ADC16_IRQ_HANDLER_FUNC ADC0_IRQHandler

    /*******************************************************************************
    * Prototypes
    ******************************************************************************/

    /*******************************************************************************
    * Variables
    ******************************************************************************/
    volatile bool g_Adc16ConversionDoneFlag = false;
    volatile uint32_t g_Adc16ConversionValue;
    volatile uint32_t g_Adc16InterruptCounter;
    const uint32_t g_Adc16_12bitFullRange = 4096U;

    /*******************************************************************************
    * Code
    ******************************************************************************/

    void DEMO_ADC16_IRQ_HANDLER_FUNC(void)
    {
        g_Adc16ConversionDoneFlag = true;
        /* Read conversion result to clear the conversion completed flag. */
        g_Adc16ConversionValue = ADC16_GetChannelConversionValue(DEMO_ADC16_BASE, DEMO_ADC16_CHANNEL_GROUP);
        g_Adc16InterruptCounter++;
        SDK_ISR_EXIT_BARRIER;
    }

    /*!
    * @brief Main function
    */
    int main(void)
    {
        adc16_config_t adc16ConfigStruct;
        adc16_channel_config_t adc16ChannelConfigStruct;

        BOARD_InitBootPins();
        BOARD_InitBootClocks();
        BOARD_InitDebugConsole();
        EnableIRQ(DEMO_ADC16_IRQn);

        PRINTF("\r\nADC16 interrupt Example.\r\n");

        /*
         * adc16ConfigStruct.referenceVoltageSource = kADC16_ReferenceVoltageSourceVref;
         * adc16ConfigStruct.clockSource = kADC16_ClockSourceAsynchronousClock;
         * adc16ConfigStruct.enableAsynchronousClock = true;
         * adc16ConfigStruct.clockDivider = kADC16_ClockDivider8;
         * adc16ConfigStruct.resolution = kADC16_ResolutionSE12Bit;
         * adc16ConfigStruct.longSampleMode = kADC16_LongSampleDisabled;
         * adc16ConfigStruct.enableHighSpeed = false;
         * adc16ConfigStruct.enableLowPower = false;
         * adc16ConfigStruct.enableContinuousConversion = false;
         */
        ADC16_GetDefaultConfig(&adc16ConfigStruct);
    //    adc16ConfigStruct.clockDivider = kADC16_ClockDivider1;

    #ifdef BOARD_ADC_USE_ALT_VREF
        adc16ConfigStruct.referenceVoltageSource = kADC16_ReferenceVoltageSourceValt;
    #endif
        ADC16_Init(DEMO_ADC16_BASE, &adc16ConfigStruct);
        ADC16_EnableHardwareTrigger(DEMO_ADC16_BASE, false); /* Make sure the software trigger is used. */
    #if defined(FSL_FEATURE_ADC16_HAS_CALIBRATION) && FSL_FEATURE_ADC16_HAS_CALIBRATION
        if (kStatus_Success == ADC16_DoAutoCalibration(DEMO_ADC16_BASE))
        {
            PRINTF("ADC16_DoAutoCalibration() Done.\r\n");
        }
        else
        {
            PRINTF("ADC16_DoAutoCalibration() Failed.\r\n");
        }
    #endif /* FSL_FEATURE_ADC16_HAS_CALIBRATION */

        PRINTF("ADC Full Range: %d\r\n", g_Adc16_12bitFullRange);
        PRINTF("Press any key to get user channel's ADC value ...\r\n");

        adc16ChannelConfigStruct.channelNumber                        = DEMO_ADC16_USER_CHANNEL;
        adc16ChannelConfigStruct.enableInterruptOnConversionCompleted = true; /* Enable the interrupt. */
    #if defined(FSL_FEATURE_ADC16_HAS_DIFF_MODE) && FSL_FEATURE_ADC16_HAS_DIFF_MODE
        adc16ChannelConfigStruct.enableDifferentialConversion = false;
    #endif /* FSL_FEATURE_ADC16_HAS_DIFF_MODE */

        g_Adc16InterruptCounter = 0U;

        while (1)
        {
    //        GETCHAR();
            g_Adc16ConversionDoneFlag = false;
            /*
             When in software trigger mode, each conversion would be launched once calling the "ADC16_ChannelConfigure()"
             function, which works like writing a conversion command and executing it. For another channel's conversion,
             just to change the "channelNumber" field in channel configuration structure, and call the function
             "ADC16_ChannelConfigure()"" again.
             Also, the "enableInterruptOnConversionCompleted" inside the channel configuration structure is a parameter for
             the conversion command. It takes affect just for the current conversion. If the interrupt is still required
             for the following conversion, it is necessary to assert the "enableInterruptOnConversionCompleted" every time
             for each command.
            */
            ADC16_SetChannelConfig(DEMO_ADC16_BASE, DEMO_ADC16_CHANNEL_GROUP, &adc16ChannelConfigStruct);
            while (!g_Adc16ConversionDoneFlag)
            {
            }
            PRINTF("ADC Interrupt Count: %d  ", g_Adc16InterruptCounter);
            PRINTF("ADC Value: %d\r\n", g_Adc16ConversionValue);
    //        PRINTF("ADC Interrupt Count: %d\r\n", g_Adc16InterruptCounter);
        }
    }

    圖1

    圖1
    11111.png
    我知道答案 目前已有1人回答
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情

    2021-8-30 18:28
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    3

    主题

    13

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    467
    最后登录
    2022-9-8
     楼主| 发表于 2021-8-16 10:34:20 | 显示全部楼层
    我找到原因了,線沒接好才這樣,之後將UART的Baudrate 改高一點,就可偵測漂亮的波形
    圖片3.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-26 13:20 , Processed in 0.119046 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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