使用NXP S32K148EVB的官方开发板,UART1引脚RX-PTC6 TX-PTC7。
ProcessorExpert配置
I/O配置
选择FTM0 0通道 PTD15设置为输入 用以采集PWM频率及占空比
添加FTM模块
选中FTM_IC右键添加模块
配置PTM_IC采集频率
选择PTM0 通道0 模式为测量模式
配置FTM_IC 采集占空比
FTM0 通道0 边沿采集模式 双边沿采集
补全代码
生成/补全代码
频率采集代码:
FTM_DRV_Init(INST_FLEXTIMER_IC1, &flexTimer_ic1_InitConfig, &ftm1StateStruct);
FTM_DRV_InitInputCapture(INST_FLEXTIMER_IC1, &flexTimer_ic1_InputCaptureConfig);
FTMIC_frequency = FTM_DRV_GetFrequency(INST_FLEXTIMER_IC1);
/* Get values */
inputCaptureMeas = FTM_DRV_GetInputCaptureMeasurement(INST_FLEXTIMER_IC1, 0U);
/* Calculate the signal frequency using recorded data*/
inputCaptureMeas = FTMIC_frequency / (inputCaptureMeas); //最终计算所得频率=时钟频率/脉冲一周期起振次数
占空比采集代码:
flexTimer_ic1_InputCaptureChannelConfig[0].channelsCallbacks = channelsCallbacks_0;//检测到边沿跳变执行次回调函数
FTM_DRV_Init(INST_FLEXTIMER_IC1, &flexTimer_ic1_InitConfig, &ftm1StateStruct);
FTM_DRV_InitInputCapture(INST_FLEXTIMER_IC1, &flexTimer_ic1_InputCaptureConfig);
FTMIC_frequency = FTM_DRV_GetFrequency(INST_FLEXTIMER_IC1);
void channelsCallbacks_0(ic_event_t event, void *userData)
{
static uint16_t GetCNVBuff[3];
uint16_t CalculationResut1,CalculationResut2;
uint32_t Pinstate;
Pinstate = (PINS_DRV_ReadPins(PTD)>>15)&0x01; //读取输入引脚状态
/* 取三个跳变沿时间点 (三个跳变沿 PWM为一周期)*/
GetCNVBuff[0] = GetCNVBuff[1];
GetCNVBuff[1] = GetCNVBuff[2];
GetCNVBuff[2] = FTM_DRV_GetInputCaptureMeasurement(INST_FLEXTIMER_IC1, 0U);//读取C(n)V寄存器计数
CalculationResut1 = GetCNVBuff[1]-GetCNVBuff[0]; //取两个相邻跳变沿之间的时间计数差值
CalculationResut2 = GetCNVBuff[2]-GetCNVBuff[1]; //同上
if(Pinstate) //由于不知道两个跳变之间是高电平还是低电平 故判断PWM当前状态 计算占空比
{
Duty_cycle = (uint16_t)(((CalculationResut1*100)/(CalculationResut1 + CalculationResut2)));
}
else
{
Duty_cycle = (uint16_t)(((CalculationResut2*100)/(CalculationResut1 + CalculationResut2)));
}
}
————————————————————————————————————————————
小学生一枚,在此做个学习笔记,有什么不妥的地方还请海涵。