查看: 815|回复: 2

[分享] 【MCXC444分享】ADC测试

[复制链接]
  • TA的每日心情
    开心
    昨天 16:28
  • 签到天数: 1483 天

    连续签到: 3 天

    [LV.10]以坛为家III

    152

    主题

    3148

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    8660
    最后登录
    2025-7-30
    发表于 2024-11-7 08:16:47 | 显示全部楼层 |阅读模式
    本帖最后由 TLLED 于 2024-11-7 08:16 编辑


    测试板卡ADC功能,采集电位器电压显示在SCLD并串口打印输出。

    一、硬件部分

    主板ADC部分电路
    电位器连接到主板ADC引脚PTB0
    002.png

    二、配置ADC引脚

    配置ADC引脚

    003.png

    三、程序部分

    3.1、adc.c
    1. #include "pin_mux.h"
    2. #include "fsl_adc16.h"
    3. #include "fsl_debug_console.h"
    4. #include "adc/adc.h"

    5. #define ADC16_BASE          ADC0
    6. #define ADC16_CHANNEL_GROUP 0U
    7. #define ADC16_USER_CHANNEL  8U /* PTB0, ADC0_SE8 */

    8. const uint32_t g_Adc16_12bitFullRange = 4096U;

    9. adc16_config_t adc16ConfigStruct;
    10. adc16_channel_config_t adc16ChannelConfigStruct;

    11. uint32_t adc_readval(void)
    12. {
    13.         uint32_t adv=0;
    14.         ADC16_SetChannelConfig(ADC16_BASE, ADC16_CHANNEL_GROUP, &adc16ChannelConfigStruct);
    15.         while (0U == (kADC16_ChannelConversionDoneFlag & ADC16_GetChannelStatusFlags(ADC16_BASE, ADC16_CHANNEL_GROUP)));

    16.         adv=ADC16_GetChannelConversionValue(ADC16_BASE, ADC16_CHANNEL_GROUP);
    17.         return adv;
    18. }

    19. void init_adc(void)
    20. {
    21.         
    22.         
    23.         init_adc_pins();
    24.         
    25.         /*
    26.          * adc16ConfigStruct.referenceVoltageSource = kADC16_ReferenceVoltageSourceVref;
    27.          * adc16ConfigStruct.clockSource = kADC16_ClockSourceAsynchronousClock;
    28.          * adc16ConfigStruct.enableAsynchronousClock = false;
    29.          * adc16ConfigStruct.clockDivider = kADC16_ClockDivider8;
    30.          * adc16ConfigStruct.resolution = kADC16_ResolutionSE12Bit;
    31.          * adc16ConfigStruct.longSampleMode = kADC16_LongSampleDisabled;
    32.          * adc16ConfigStruct.enableHighSpeed = false;
    33.          * adc16ConfigStruct.enableLowPower = false;
    34.          * adc16ConfigStruct.enableContinuousConversion = false;
    35.          */
    36.         
    37.         ADC16_GetDefaultConfig(&adc16ConfigStruct);
    38. #ifdef BOARD_ADC_USE_ALT_VREF
    39.     adc16ConfigStruct.referenceVoltageSource = kADC16_ReferenceVoltageSourceValt;
    40. #endif
    41.     ADC16_Init(ADC16_BASE, &adc16ConfigStruct);
    42.     ADC16_EnableHardwareTrigger(ADC16_BASE, false); /* Make sure the software trigger is used. */
    43.                
    44. #if defined(FSL_FEATURE_ADC16_HAS_CALIBRATION) && FSL_FEATURE_ADC16_HAS_CALIBRATION
    45.     if (kStatus_Success == ADC16_DoAutoCalibration(ADC16_BASE))
    46.     {
    47.         PRINTF("ADC16_DoAutoCalibration() Done.\r\n");
    48.     }
    49.     else
    50.     {
    51.         PRINTF("ADC16_DoAutoCalibration() Failed.\r\n");
    52.     }
    53. #endif /* FSL_FEATURE_ADC16_HAS_CALIBRATION */
    54.                
    55.     PRINTF("ADC Full Range: %d\r\n", g_Adc16_12bitFullRange);
    56.     PRINTF("Press any key to get user channel's ADC value ...\r\n");

    57.     adc16ChannelConfigStruct.channelNumber                        = ADC16_USER_CHANNEL;
    58.     adc16ChannelConfigStruct.enableInterruptOnConversionCompleted = false;
    59. #if defined(FSL_FEATURE_ADC16_HAS_DIFF_MODE) && FSL_FEATURE_ADC16_HAS_DIFF_MODE
    60.     adc16ChannelConfigStruct.enableDifferentialConversion = false;
    61. #endif /* FSL_FEATURE_ADC16_HAS_DIFF_MODE */               
    62.         
    63. }
    复制代码

    3.2、adc.h
    1. #ifndef __ADC_H
    2. #define __ADC_H

    3. #define BOARD_ADC_USE_ALT_VREF 1U

    4. void init_adc(void);
    5. uint32_t adc_readval(void);

    6. #endif
    复制代码

    3.3、main.c
    1. #include "pin_mux.h"
    2. #include "clock_config.h"
    3. #include "board.h"
    4. #include "fsl_debug_console.h"
    5. #include "fsl_gpio.h"
    6. #include "slcd/slcd.h"
    7. #include "led/led.h"
    8. #include "systick/systick.h"
    9. #include "slcd_engine.h"
    10. #include "adc/adc.h"

    11. void init_board(void)
    12. {

    13.         SysTick_Init();
    14.         BOARD_InitPins();
    15.         BOARD_BootClockRUN();
    16.         BOARD_InitDebugConsole();
    17.         init_led();
    18.         init_adc();
    19.         init_slcd();
    20. }

    21. int main(void)
    22. {
    23.         uint32_t m_adv=0;
    24.         float vl= 0.0f;
    25.         
    26.         init_board();

    27. while (1)
    28. {
    29.         m_adv = adc_readval();
    30.         vl = (m_adv*3.3)/4096;
    31.         slcd_disp_adc(m_adv);
    32.         
    33.         PRINTF("m_adv=%d  vl=%0.1fV \r\n",m_adv,vl);
    34.         SysTick_Delay_ms(1000);
    35. }
    36. }
    复制代码

    四、程序运行

    4.1、slcd显示ADC采样值
    adc.jpg

    4.2、串口打印输出

    004.png

    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    9

    帖子

    0

    注册会员

    Rank: 2

    积分
    71
    最后登录
    2025-6-27
    发表于 2025-6-24 10:22:24 | 显示全部楼层
    如何使用内部基准呢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    9

    帖子

    0

    注册会员

    Rank: 2

    积分
    71
    最后登录
    2025-6-27
    发表于 2025-6-24 10:22:58 | 显示全部楼层
    我修改成kADC16_ReferenceVoltageSourceVref也不行
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-30 19:16 , Processed in 0.082002 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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