请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR68791 我使用定时器 TA0在捕获模式下测量两个输入信号(CCR1和 CCR2)的脉冲宽度(时钟为 SMCLK 除以4 (4MHz))。出于测试目的,两个输入信号具有相同的源(366Hz)。
测量结果为290Hz。
如果我禁用第二个中断(例如 CCR2)、则测量值正确。
在我看来、中断可能会丢失。
只要中断仍处于挂起状态、我就使用 DO/while 环路来处理挂起的中断。
错误测量的其他原因可能是检测到了错误的 IRQ 源、因此测量使用了错误的 CCR 计数器。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////// //转速中断的中断服务例程// 中断在的上升沿触发 // //转速脉冲。 在上升沿、捕捉当前// /////计数器值并将其存储在 CCR1/2 // //////////////////////////////////////////////////////////////////////////////////////////////////////////////中 #pragma vector=TIMER0_A1_vector __interrupt void ISR_Timer_A (void) { //调试静态 int 计数= 0; 静态 int lastCCR[2]={0、0}; UINT16电流 CCRx; uint8风扇; uint16_t ccrNr = 0xFFFF; 操作 { switch (__even_in_range (TA0IV、0x0E)) { 案例 TA0IV_TACCR1://* TA0CCR1_CCIFG * currentCCRx = TA0CCR1; FANNr = 0; ccrNr = TIMER_A_CAPTURECMPARE 寄存器_1; 中断; 案例 TA0IV_TACCR2://* TA0CCR2_CCIFG * currentCCRx = TA0CCR2; FANNr = 1; ccrNr = TIMER_A_CAPTURECMPARE 寄存器_2; 中断; 默认值: ccrNr = 0xFFFF; 中断; } // Timer_A_clearTimerInterrupt (timer_A0_BASE); if (ccrNr!=0xFFFF) { uint16 ccrx = currentCCRx - lastCCR[fanNr]; lastCCR[fanNr]= currentCCRx; i2cIFMemoryMap.rawTacho[fanNr]= ccrx; addToTachoArray( fanNr,ccrx ); Timer_A_clearCaptureCompareInterrupt (timer_A0_BASE、ccrNr); 转速计 IrqCount[fanNr]++; } }while (ccrNr!=0xFFFF); }