查看: 736|回复: 0

[原创] 【MCXC444分享】3、初探16bit-ADC

[复制链接]
  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 937 天

    连续签到: 12 天

    [LV.10]以坛为家III

    14

    主题

    4398

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7462
    最后登录
    2025-7-20
    发表于 2024-11-17 11:08:09 | 显示全部楼层 |阅读模式
    本帖最后由 ldptest 于 2024-12-10 14:54 编辑

    MCXC444的ADC功能拥有。 16bit ADC,而且速度高达到818 ksps
    4个差分采集通道16个单端采集通道


    。 VrefH/VrefL 或 ValfH/ValfL 参考电压端


    屏幕截图 2024-11-16 224221.png

    Let's go......


    一、使用MCUXpressoIDE建立工程
    具体方法参考我上一贴【MCXC444分享】2、MCUXpressoIDE环境下建立新项目
    我使用的是单端输入,ADC_SE23通道,对应第18pin,PTE30
    屏幕截图 2024-11-17 102904.png

    在外设设置窗口中设置ADC,其中:
    。 采样率使用Single End 16-bit;
    参考电压端使用ValfH/ValfL
    屏幕截图 2024-11-17 103624.png

    在pins设置窗口/外部信号中,把ValfH/ValfL分辨设置为连接VDDA/VSSA
    屏幕截图 2024-11-16 230846.png

    生成工程

    二、修改代码
    1. uint32_t ADC_FullRange = 0x8000;

    2. #define ADC16_BASE          ADC0
    3. #define ADC16_CHANNEL_GROUP 0U
    4. #define ADC16_USER_CHANNEL  23U /* PTE30, ADC0_SE23 */

    5. uint16_t Get_ADC_Value(void)
    6. {
    7.         adc16_channel_config_t adc16ChannelConfigStruct;

    8.     adc16ChannelConfigStruct.channelNumber                        = ADC16_USER_CHANNEL;
    9.     adc16ChannelConfigStruct.enableInterruptOnConversionCompleted = false;
    10.     adc16ChannelConfigStruct.enableDifferentialConversion = false;

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

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

    18. /*
    19. * @brief   Application entry point.
    20. */
    21. int main(void) {

    22.     /* Init board hardware. */
    23.     BOARD_InitBootPins();
    24.     BOARD_InitBootClocks();
    25.     BOARD_InitBootPeripherals();
    26. #ifndef BOARD_INIT_DEBUG_CONSOLE_PERIPHERAL
    27.     /* Init FSL debug console. */
    28.     BOARD_InitDebugConsole();
    29. #endif

    30.     PRINTF("Start 16bit-ADC project\r\n");
    31.     /* Force the counter to be placed into memory. */
    32.     uint16_t Adc_Value;
    33.     int16_t AD_Volt;
    34.     float Volt = 0.0f;
    35.     /* Enter an infinite loop, just incrementing a counter. */
    36.     while(1) {
    37.         Adc_Value = Get_ADC_Value();                                                // 获取AD值
    38.         PRINTF("Channel 23SE ADC Value: %d\r\n",Adc_Value);
    39.         if (Adc_Value < 0x8000)
    40.                 AD_Volt = Adc_Value;
    41.         else
    42.                 AD_Volt = Adc_Value - 0xFFFF - 1;
    43.         Volt = 3.3 * AD_Volt / ADC_FullRange;                // 计算对应电压值
    44.         PRINTF("Channel 23SE Volt Value: %f\r\n",Volt);
    45.         // LED_GREEN_TOGGLE();
    46.         Delay_ms(1000);
    47.         /* 'Dummy' NOP to allow source level single stepping of
    48.             tight while() loop */
    49.         __asm volatile ("nop");
    50.     }
    51.     return 0 ;
    52. }
    复制代码



    注意,PRINTF要能输出浮点数要在工程建立时选择使用PRINTF同时选择"使用浮点版printf"
    屏幕截图 2024-11-17 104854.png
    错过了,也可以如下图设置
    屏幕截图 2024-11-17 105150.png

    三、运行
    接3V3端输出:
    1. Channel 23SE ADC Value: 32113
    2. Channel 23SE Volt Value: 3.234036
    3. Channel 23SE ADC Value: 32113
    4. Channel 23SE Volt Value: 3.234036
    5. Channel 23SE ADC Value: 32113
    6. Channel 23SE Volt Value: 3.234036
    7. Channel 23SE ADC Value: 32113
    8. Channel 23SE Volt Value: 3.234036
    复制代码
    接GND输出
    1. Channel 23SE ADC Value: 2
    2. Channel 23SE Volt Value: 0.000201
    3. Channel 23SE ADC Value: 65535
    4. Channel 23SE Volt Value: 0.000101
    5. Channel 23SE ADC Value: 0
    6. Channel 23SE Volt Value: 0
    7. Channel 23SE ADC Value: 65535
    8. Channel 23SE Volt Value: 0.000101
    9. Channel 23SE ADC Value: 0
    10. Channel 23SE Volt Value: 0
    11. Channel 23SE ADC Value: 65534
    12. Channel 23SE Volt Value: 0.000201
    13. Channel 23SE ADC Value: 3
    14. Channel 23SE Volt Value: 0.000302
    15. Channel 23SE ADC Value: 2
    16. Channel 23SE Volt Value: 0.000201
    复制代码


    存疑
    之所以我的代码中:uint32_t ADC_FullRange = 0x8000;
    因为发现接3.3V时,采集到只有32113,也就是65536的一半,这也只有15bit啊,最高位去哪了?
    屏幕截图 2024-11-17 110422.png




    永远开心快乐
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-20 17:34 , Processed in 0.083313 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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