查看: 1504|回复: 1

[原创] 【MCX-N947分享】+连接外设UART和LADC

[复制链接]
  • TA的每日心情
    擦汗
    2024-11-7 09:48
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    35

    主题

    82

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1243
    最后登录
    2025-7-11
    发表于 2024-7-3 16:28:49 | 显示全部楼层 |阅读模式
    1. 简介
    在快速建立开发环境后,就是逐个尝试使用外设。这里面使用最广泛的就是GPIO、UART、和ADC。
    上一帖已经使用了GPIO,那么这个就使用一下后面的。
    2 UART接口
    2.1 串口是最重要的接口了,因为很多调试工作都需要串口反馈回来,通常需要定义波特率等参数,设置基本是比较简单的。需要和内核的时钟相匹配
    1. CLOCK_SetClkDiv(kCLOCK_DivFlexcom4Clk, 1u);
    2. LOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    3.     CLOCK_SetClkDiv(kCLOCK_DivTraceClk, 2U);    CLOCK_AttachClk(kTRACE_DIV_to_TRACE);
    4.     BOARD_InitPins();
    5.     BOARD_InitBootClocks();
    6.     BOARD_InitDebugConsole();
    复制代码
    2.2 代码就是直接输出hello world,随后侦听端口,及时和控制台交互
    1.     PRINTF("hello world.\r\n");
    2.     while (1)
    3.     {
    4.         ch = GETCHAR();
    5.         PUTCHAR(ch);
    6.     }
    复制代码
    显示如下
    2.PNG
    在使用前需要使用putty选择好计算机主机所使用的串口号,以及相匹配的波特率等。
    1.PNG

    3 LADC接口
    3.1 adc就是使用数字采样技术,把模拟量信号转换成数字信号,通常采样的是电压值。
    3.2 在代码中首先需要定义引脚,并进行初始设置。这个部分全部封装在初始化配置函数中,可以看出,首先定义采样率,以及采样的能耗指标,因为这个是低功耗ADC,具有节能控制功能,因此还需要设定节能级别,这个就是通过降低采样率和采样精度来获得的。也是一个很实用的功能。
    1. static void ADC_Configuration(void)
    2. {
    3.     lpadc_config_t lpadcConfigStruct;
    4.     lpadc_conv_trigger_config_t lpadcTriggerConfigStruct;

    5.     /* Init ADC peripheral. */
    6.     LPADC_GetDefaultConfig(&lpadcConfigStruct);
    7.     lpadcConfigStruct.enableAnalogPreliminary = true;
    8.     lpadcConfigStruct.powerLevelMode          = kLPADC_PowerLevelAlt4;
    9. #if defined(DEMO_LPADC_VREF_SOURCE)
    10.     lpadcConfigStruct.referenceVoltageSource = DEMO_LPADC_VREF_SOURCE;
    11. #endif /* DEMO_LPADC_VREF_SOURCE */
    12. #if defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS
    13.     lpadcConfigStruct.conversionAverageMode = kLPADC_ConversionAverage128;
    14. #endif /* FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS */
    15. #if defined(FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE)
    16.     lpadcConfigStruct.FIFO0Watermark = FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE - 1U;
    17. #endif /* FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE */
    18.     LPADC_Init(DEMO_LPADC_BASE, &lpadcConfigStruct);
    19. #if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U))
    20.     LPADC_DoResetFIFO0(DEMO_LPADC_BASE);
    21. #else
    22.     LPADC_DoResetFIFO(DEMO_LPADC_BASE);
    23. #endif

    24.     /* Do ADC calibration. */
    25. #if defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFS) && FSL_FEATURE_LPADC_HAS_CTRL_CALOFS
    26. #if defined(FSL_FEATURE_LPADC_HAS_OFSTRIM) && FSL_FEATURE_LPADC_HAS_OFSTRIM
    27.     /* Request offset calibration. */
    28. #if defined(DEMO_LPADC_DO_OFFSET_CALIBRATION) && DEMO_LPADC_DO_OFFSET_CALIBRATION
    29.     LPADC_DoOffsetCalibration(DEMO_LPADC_BASE);
    30. #else
    31.     LPADC_SetOffsetValue(DEMO_LPADC_BASE, DEMO_LPADC_OFFSET_VALUE_A, DEMO_LPADC_OFFSET_VALUE_B);
    32. #endif /* DEMO_LPADC_DO_OFFSET_CALIBRATION */
    33. #endif /* FSL_FEATURE_LPADC_HAS_OFSTRIM */
    34.     /* Request gain calibration. */
    35.     LPADC_DoAutoCalibration(DEMO_LPADC_BASE);
    36. #endif /* FSL_FEATURE_LPADC_HAS_CTRL_CALOFS */

    37.     /* Set conversion CMD configuration. */
    38.     LPADC_GetDefaultConvCommandConfig(&g_LpadcCommandConfigStruct);
    39.     g_LpadcCommandConfigStruct.channelNumber       = DEMO_LPADC_TEMP_SENS_CHANNEL;
    40.     g_LpadcCommandConfigStruct.sampleChannelMode   = DEMO_LPADC_SAMPLE_CHANNEL_MODE;
    41.     g_LpadcCommandConfigStruct.sampleTimeMode      = kLPADC_SampleTimeADCK131;
    42.     g_LpadcCommandConfigStruct.hardwareAverageMode = kLPADC_HardwareAverageCount128;
    43. #if defined(FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE)
    44.     g_LpadcCommandConfigStruct.loopCount = FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE - 1U;
    45. #endif /* FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE */
    46. #if defined(FSL_FEATURE_LPADC_HAS_CMDL_MODE) && FSL_FEATURE_LPADC_HAS_CMDL_MODE
    47.     g_LpadcCommandConfigStruct.conversionResolutionMode = kLPADC_ConversionResolutionHigh;
    48. #endif /* FSL_FEATURE_LPADC_HAS_CMDL_MODE */
    49.     LPADC_SetConvCommandConfig(DEMO_LPADC_BASE, DEMO_LPADC_USER_CMDID, &g_LpadcCommandConfigStruct);

    50.     /* Set trigger configuration. */
    51.     LPADC_GetDefaultConvTriggerConfig(&lpadcTriggerConfigStruct);
    52.     lpadcTriggerConfigStruct.targetCommandId = DEMO_LPADC_USER_CMDID;
    53.     LPADC_SetConvTriggerConfig(DEMO_LPADC_BASE, 0U, &lpadcTriggerConfigStruct); /* Configurate the trigger0. */

    54.     /* Enable the watermark interrupt. */
    55. #if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U))
    56.     LPADC_EnableInterrupts(DEMO_LPADC_BASE, kLPADC_FIFO0WatermarkInterruptEnable);
    57. #else
    58.     LPADC_EnableInterrupts(DEMO_LPADC_BASE, kLPADC_FIFOWatermarkInterruptEnable);
    59. #endif /* FSL_FEATURE_LPADC_FIFO_COUNT */
    60.     EnableIRQ(DEMO_LPADC_IRQn);

    61.     /* Eliminate the first two inaccurate results. */
    62.     LPADC_DoSoftwareTrigger(DEMO_LPADC_BASE, 1U); /* 1U is trigger0 mask. */
    63.     while (false == g_LpadcConversionCompletedFlag)
    64.     {
    65.     }
    66. }
    复制代码
    3.3 运行,这采样的逻辑就比较简单了,启动后,侦测串口的输入,每输入 一次就采样一次,读取温度。转换公式把电压转换为温度值。
    1.         {
    2.             Vbe8 = convResultStruct.convValue >> convResultShift;
    3.             /* Final temperature = A*[alpha*(Vbe8-Vbe1)/(Vbe8 + alpha*(Vbe8-Vbe1))] - B. */
    4.             temperature = parameterSlope * (parameterAlpha * ((float)Vbe8 - (float)Vbe1) /
    5.                                             ((float)Vbe8 + parameterAlpha * ((float)Vbe8 - (float)Vbe1))) -
    6.                           parameterOffset;
    7.         }
    复制代码
    效果如下
    4.PNG
    4 小结
    上述代码都是demo提供的,上述功能就可以综合起来作为电机控制的基本功能,在结合算法的基础上,实现电机控制。

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3887

    主题

    7494

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39462
    最后登录
    2025-7-25
    发表于 2024-7-4 13:46:58 | 显示全部楼层
    看看电机控制能做个啥应用
    qiandao qiandao
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-27 17:44 , Processed in 0.086124 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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