查看: 825|回复: 0

[原创] 【MCXC444分享】5、LPTMR定时触发ADC

[复制链接]
  • TA的每日心情
    开心
    昨天 09:48
  • 签到天数: 971 天

    连续签到: 11 天

    [LV.10]以坛为家III

    14

    主题

    4645

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7747
    最后登录
    2025-8-26
    发表于 2024-12-10 18:11:10 | 显示全部楼层 |阅读模式
    一直想用定时器定时自动触发一次ADC采样

    在手册中找到ADC可以有多种硬件触发功能,其中就有用LPTMR0触发
    0、理论支持.png
    0、理论支持1.png

    Let's go!
    建立工程,在SDK中选择LPTMR和ADC
    路由ADC,这了选择了12#引脚(ADC0_SE7a),并设置TRG,A,触发源选择为Low_Power_Timer,也就是LPTMR
    3、路由ADC触发源.png

    设置LPTMR,这里方便观察,设置为2Hz,即500ms采样一次(如果频率更高,使用上DMA,可以实现低频的示波器了)
    1、设置LPTMR0.png

    设置ADC,激活连续采样,分组设置,中断(采样后获取数据显示出来)
    4、ADC设置.png
    4、ADC设置2.png

    代码:
    1. uint32_t ADC_FullRange = 0x8000;

    2. /* ADC0_IRQn interrupt handler */
    3. void ADC0_IRQHANDLER(void) {
    4.   /* Array of result values*/
    5.     uint32_t result_values[2] = {0};
    6.     uint16_t AD_Volt;
    7.     float Volt = 0.0f;
    8.     PRINTF("ADC conver finish.");
    9.       /* Get flags for each group */
    10.     for ( int i=0; i<2; i++){
    11.         uint32_t status = ADC16_GetChannelStatusFlags(ADC0_PERIPHERAL, i);
    12.           if ( status == kADC16_ChannelConversionDoneFlag){
    13.               result_values[i] = ADC16_GetChannelConversionValue(ADC0_PERIPHERAL, i);
    14.             AD_Volt = result_values[i];
    15.             Volt = 3.3 * AD_Volt / ADC_FullRange;                // 计算对应电压值
    16.             PRINTF("Channel %d ADC Value: %d Volt Value: %f\r\n",i,AD_Volt,Volt);
    17.           }
    18.     }

    19. }

    20. /*
    21. * @brief   Application entry point.
    22. */
    23. int main(void) {
    24.     /* Init board hardware. */
    25.     BOARD_InitBootPins();
    26.     BOARD_InitBootClocks();
    27.     BOARD_InitBootPeripherals();
    28. #ifndef BOARD_INIT_DEBUG_CONSOLE_PERIPHERAL
    29.     /* Init FSL debug console. */
    30.     BOARD_InitDebugConsole();
    31. #endif
    32.     /* Start the LPTMR timer */
    33.     PRINTF("This project is LPTMR0 trigger ADC0.\r\n");
    34.     /* Force the counter to be placed into memory. */
    35.     volatile static int i = 0 ;
    36.     /* Enter an infinite loop, just incrementing a counter. */
    37.     while(1) {
    38.         i++ ;
    39.         /* 'Dummy' NOP to allow source level single stepping of
    40.             tight while() loop */
    41.         __asm volatile ("nop");
    42.     }
    43.     return 0 ;

    44.   //SDK_ISR_EXIT_BARRIER;
    45.   /* Place your code here */

    46.   /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
    47.      Store immediate overlapping exception return operation might vector to incorrect interrupt. */
    48. /*  #if defined __CORTEX_M && (__CORTEX_M == 4U)
    49.     __DSB();
    50.   #endif*/
    51. }
    复制代码


    效果,悬空了端子,自由采样。
    5、输出.png
    永远开心快乐
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-27 03:36 , Processed in 0.080096 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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