在线时间108 小时
UID3332856
注册时间2016-11-28
NXP金币365
TA的每日心情 | 擦汗 2024-11-7 09:48 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
金牌会员
 
- 积分
- 1243
- 最后登录
- 2025-7-11
|
1. 简介
在快速建立开发环境后,就是逐个尝试使用外设。这里面使用最广泛的就是GPIO、UART、和ADC。
上一帖已经使用了GPIO,那么这个就使用一下后面的。
2 UART接口
2.1 串口是最重要的接口了,因为很多调试工作都需要串口反馈回来,通常需要定义波特率等参数,设置基本是比较简单的。需要和内核的时钟相匹配
- CLOCK_SetClkDiv(kCLOCK_DivFlexcom4Clk, 1u);
- LOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
- CLOCK_SetClkDiv(kCLOCK_DivTraceClk, 2U); CLOCK_AttachClk(kTRACE_DIV_to_TRACE);
- BOARD_InitPins();
- BOARD_InitBootClocks();
- BOARD_InitDebugConsole();
复制代码 2.2 代码就是直接输出hello world,随后侦听端口,及时和控制台交互
- PRINTF("hello world.\r\n");
- while (1)
- {
- ch = GETCHAR();
- PUTCHAR(ch);
- }
复制代码 显示如下
在使用前需要使用putty选择好计算机主机所使用的串口号,以及相匹配的波特率等。
3 LADC接口
3.1 adc就是使用数字采样技术,把模拟量信号转换成数字信号,通常采样的是电压值。
3.2 在代码中首先需要定义引脚,并进行初始设置。这个部分全部封装在初始化配置函数中,可以看出,首先定义采样率,以及采样的能耗指标,因为这个是低功耗ADC,具有节能控制功能,因此还需要设定节能级别,这个就是通过降低采样率和采样精度来获得的。也是一个很实用的功能。
- static void ADC_Configuration(void)
- {
- lpadc_config_t lpadcConfigStruct;
- lpadc_conv_trigger_config_t lpadcTriggerConfigStruct;
- /* Init ADC peripheral. */
- LPADC_GetDefaultConfig(&lpadcConfigStruct);
- lpadcConfigStruct.enableAnalogPreliminary = true;
- lpadcConfigStruct.powerLevelMode = kLPADC_PowerLevelAlt4;
- #if defined(DEMO_LPADC_VREF_SOURCE)
- lpadcConfigStruct.referenceVoltageSource = DEMO_LPADC_VREF_SOURCE;
- #endif /* DEMO_LPADC_VREF_SOURCE */
- #if defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS
- lpadcConfigStruct.conversionAverageMode = kLPADC_ConversionAverage128;
- #endif /* FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS */
- #if defined(FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE)
- lpadcConfigStruct.FIFO0Watermark = FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE - 1U;
- #endif /* FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE */
- LPADC_Init(DEMO_LPADC_BASE, &lpadcConfigStruct);
- #if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U))
- LPADC_DoResetFIFO0(DEMO_LPADC_BASE);
- #else
- LPADC_DoResetFIFO(DEMO_LPADC_BASE);
- #endif
- /* Do ADC calibration. */
- #if defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFS) && FSL_FEATURE_LPADC_HAS_CTRL_CALOFS
- #if defined(FSL_FEATURE_LPADC_HAS_OFSTRIM) && FSL_FEATURE_LPADC_HAS_OFSTRIM
- /* Request offset calibration. */
- #if defined(DEMO_LPADC_DO_OFFSET_CALIBRATION) && DEMO_LPADC_DO_OFFSET_CALIBRATION
- LPADC_DoOffsetCalibration(DEMO_LPADC_BASE);
- #else
- LPADC_SetOffsetValue(DEMO_LPADC_BASE, DEMO_LPADC_OFFSET_VALUE_A, DEMO_LPADC_OFFSET_VALUE_B);
- #endif /* DEMO_LPADC_DO_OFFSET_CALIBRATION */
- #endif /* FSL_FEATURE_LPADC_HAS_OFSTRIM */
- /* Request gain calibration. */
- LPADC_DoAutoCalibration(DEMO_LPADC_BASE);
- #endif /* FSL_FEATURE_LPADC_HAS_CTRL_CALOFS */
- /* Set conversion CMD configuration. */
- LPADC_GetDefaultConvCommandConfig(&g_LpadcCommandConfigStruct);
- g_LpadcCommandConfigStruct.channelNumber = DEMO_LPADC_TEMP_SENS_CHANNEL;
- g_LpadcCommandConfigStruct.sampleChannelMode = DEMO_LPADC_SAMPLE_CHANNEL_MODE;
- g_LpadcCommandConfigStruct.sampleTimeMode = kLPADC_SampleTimeADCK131;
- g_LpadcCommandConfigStruct.hardwareAverageMode = kLPADC_HardwareAverageCount128;
- #if defined(FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE)
- g_LpadcCommandConfigStruct.loopCount = FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE - 1U;
- #endif /* FSL_FEATURE_LPADC_TEMP_SENS_BUFFER_SIZE */
- #if defined(FSL_FEATURE_LPADC_HAS_CMDL_MODE) && FSL_FEATURE_LPADC_HAS_CMDL_MODE
- g_LpadcCommandConfigStruct.conversionResolutionMode = kLPADC_ConversionResolutionHigh;
- #endif /* FSL_FEATURE_LPADC_HAS_CMDL_MODE */
- LPADC_SetConvCommandConfig(DEMO_LPADC_BASE, DEMO_LPADC_USER_CMDID, &g_LpadcCommandConfigStruct);
- /* Set trigger configuration. */
- LPADC_GetDefaultConvTriggerConfig(&lpadcTriggerConfigStruct);
- lpadcTriggerConfigStruct.targetCommandId = DEMO_LPADC_USER_CMDID;
- LPADC_SetConvTriggerConfig(DEMO_LPADC_BASE, 0U, &lpadcTriggerConfigStruct); /* Configurate the trigger0. */
- /* Enable the watermark interrupt. */
- #if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) && (FSL_FEATURE_LPADC_FIFO_COUNT == 2U))
- LPADC_EnableInterrupts(DEMO_LPADC_BASE, kLPADC_FIFO0WatermarkInterruptEnable);
- #else
- LPADC_EnableInterrupts(DEMO_LPADC_BASE, kLPADC_FIFOWatermarkInterruptEnable);
- #endif /* FSL_FEATURE_LPADC_FIFO_COUNT */
- EnableIRQ(DEMO_LPADC_IRQn);
- /* Eliminate the first two inaccurate results. */
- LPADC_DoSoftwareTrigger(DEMO_LPADC_BASE, 1U); /* 1U is trigger0 mask. */
- while (false == g_LpadcConversionCompletedFlag)
- {
- }
- }
复制代码 3.3 运行,这采样的逻辑就比较简单了,启动后,侦测串口的输入,每输入 一次就采样一次,读取温度。转换公式把电压转换为温度值。
- {
- Vbe8 = convResultStruct.convValue >> convResultShift;
- /* Final temperature = A*[alpha*(Vbe8-Vbe1)/(Vbe8 + alpha*(Vbe8-Vbe1))] - B. */
- temperature = parameterSlope * (parameterAlpha * ((float)Vbe8 - (float)Vbe1) /
- ((float)Vbe8 + parameterAlpha * ((float)Vbe8 - (float)Vbe1))) -
- parameterOffset;
- }
复制代码 效果如下
4 小结
上述代码都是demo提供的,上述功能就可以综合起来作为电机控制的基本功能,在结合算法的基础上,实现电机控制。
|
|