说明
-
实现功能
- 使用sctimer SCT0-OUT4输出PWM,硬件触发ADC采集电压。
-
所用资源
- usart:Debug输出
- lpadc:测量ADC
- dma:搬运ADC数据
- sctimer:驱动PWM输出(
SCT0_Out_4
) - port0_pin23:测量电压的
IO
前期准备
-
到官网下载代码。
-
数据手册:UM11126.pdf
-
首先下载一份adc dma作为基础工程。
-
其次下载一份最简单的pwm示例工工程,后续需要移植该工程的代码。
代码移植
SCT初始化
- 以第一份adc dma作为基础工程,在main函数加入pwm的初始化。
- 需要从pwm示例中复制fsl_sctimer.c和fsl_sctimer.h到工程中并引用。
/* 定义SCT */
int SCT_Init(void)
{
sctimer_config_t sctimerInfo;
sctimer_pwm_signal_param_t pwmParam;
uint32_t event;
uint32_t sctimerClock = SCTIMER_CLK_FREQ;
SCTIMER_GetDefaultConfig(&sctimerInfo);
SCTIMER_Init(SCT0, &sctimerInfo);
pwmParam.output = kSCTIMER_Out_4;
pwmParam.level = kSCTIMER_HighTrue;
pwmParam.dutyCyclePercent = 50;
if (SCTIMER_SetupPwm(SCT0, &pwmParam, kSCTIMER_CenterAlignedPwm, SCT_FREQ, sctimerClock, &event) == kStatus_Fail)
{
return -1;
}
SCTIMER_StartTimer(SCT0, kSCTIMER_Counter_U);
return 0;
}
选择触发源
- 修改ADC初始化函数ADC_Configuration。
- 注意
LPADC_SetConvTriggerConfig
的第二个参数,用于选择TCTRL组(即硬件触发源)。
LPADC_GetDefaultConvTriggerConfig(&lpadcTriggerConfigStruct);
lpadcTriggerConfigStruct.targetCommandId = DEMO_LPADC_USER_CMDID;
lpadcTriggerConfigStruct.enableHardwareTrigger = true;//false;
// lpadcTriggerConfigStruct.
LPADC_SetConvTriggerConfig(DEMO_LPADC_BASE, 2U, &lpadcTriggerConfigStruct);
-
代码对照
-
Keil5 Debug
-
数据手册
回调函数
- ADC测量到的数据需要使用DMA传输。
- DMA传输完成后会触发中断回调函数。
void DEMO_DMA_Callback(dma_handle_t *handle, void *param, bool transferDone, uint32_t tcds)
{
if (true == transferDone)
{
g_DmaTransferDoneFlag = true;
}
}
主循环
- 主循环主要用于启动DMA传输。
while (1)
{
g_DmaTransferDoneFlag = false;
while ((LPADC_GetStatusFlags(DEMO_LPADC_BASE) & DEMO_RESULT_FIFO_READY_FLAG) == 0UL); /* fifo空闲 */
DMA_StartTransfer(&g_DmaHandleStruct); /* 启动传输 */
while (false == g_DmaTransferDoneFlag); /* 等待传输完成 */
//PRINTF("Adc conversion word : 0x%X\r\n", g_AdcConvResult[0]);
PRINTF("value: %d\r\n",
((uint16_t)(g_AdcConvResult[0] & ADC_RESFIFO_D_MASK) >> g_LpadcResultShift));
}
测试
触发频率范围
- 16位adc支持最高频率为1Mhz。
修改触发频率
- 修改pwm输出的频率SCT_FREQ可以控制ADC的采样速率。
SCTIMER_SetupPwm(SCT0, &pwmParam, kSCTIMER_CenterAlignedPwm, SCT_FREQ, sctimerClock, &event)
测试结果
-
10Hz测试结果。
-
30Hz测试结果。