void PWM0_IRQHandler(void)
{
uint32_t reg = PWM0->CAPINTSTS;
if(reg & PWM_CAPINTSTS_CAPIF0)
{ // channel 0 interrupt
if(reg & PWM_CAPINTSTS_CFLI0)
{
sampletime++;
u32Count[0] = PWM_GetFallingCounter(0);
}
else if(reg & PWM_CAPINTSTS_CRLI0)
{
sampletime++;
u32Count[1] = PWM_GetRisingCounter(0);
}
if(sampletime==2)
{
Frequency=6000000/((0xFFFF - u32Count[0])+(0xFFFF - u32Count[1]));
sampletime=0;
PWM0->CAPINTSTS = reg;
}
/* if(PWM_GetCaptureIntFlag(0))
{
PWM_ClearCaptureInt(0);
} */
}
S_DRVPWM_TIME_DATA_T sPt;
u8 CapTimer = 0;
u8 u8Timer=1;
GCR->PA_H_MFP = (GCR->PA_H_MFP & ~(PA12_MFP_MASK)) | PA12_MFP_PWM0_CH0;
PWM_Init(0);
PWM_Enable(0);
PWM_CaptureEnable(0);
PWM_EnableInt(0);
PWM_EnableCaptureInt(0,0);
sPt.u8Mode = PWM_CTL_CHMOD_AUTO_RELOAD;
sPt.u8PreScale = 1; // actually 1 + 1
sPt.u8Div = PWM_CLKSEL_CLKSEL_DIV1;
sPt.u32Cn = 0xFFFF; // Max CN in non-cascade mode
sPt.u16Cm = 0; // don't care in capture function
/* Set PWM Timer 3 for Capture */
PWM_SetClk(CapTimer, &sPt);
/* Enable Interrupt Sources of PWM Capture3 */
PWM_EnableCaptureInt(CapTimer, PWM_CAPINTEN_CRLIE | PWM_CAPINTEN_CFLIE);
PWM_SetCaptureAttribute(CapTimer, 0, 0, PWM_CAPCTL_CAPRELOAD_MASK);
/* Enable Input function for PWM 3 */
PWM_ConfigCaptureIntput(CapTimer, 1);
/* Enable the PWM Capture3 */
PWM_CaptureEnable(CapTimer);
示波器输入1k hz波形,用以上方法采出来只有996hz,大家如何处理这种误差的?
还有高频信号捕出来就完全不对了,这又该如何处理呢?
求大侠指教
|