請教各位大佬,使用STC8H8K64單片機的PWM捕獲功能捕獲紅外接收頭的脈沖,也可以說是任意脈沖,但是遇到了一些問題,根據stc isp軟件商的例程,我將捕獲高電平脈沖寬度和捕獲低電平寬度結合起來,這樣就可以測出高低電平脈沖寬度了,但是測試的時候發現單獨測高電平正常,測到了23個,低電平也正常,但是結合起來后,高低電平一共才測到二十幾個,而且數值還不正確,求大佬解答!
程序:
#include "stc8H.h"
#include "intrins.h"
#include <stdio.h>
#include "uart.h"
#define VAL 300
unsigned int captures[VAL];
unsigned int num = 0;
unsigned int Overflow = 0; //溢出次數
void IR()
{
P1M0 = 0x00;
P1M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P_SW2 = 0x80;
PWM1_PS = 0x05;
//(CC1捕獲TI1上升沿,CC2捕獲TI1下降沿)
PWMA_CCER1 = 0x00;
PWMA_CCMR1 = 0x01; //CC1為輸入模式,且映射到TI1FP1上
PWMA_CCMR2 = 0x02; //CC2為輸入模式,且映射到TI1FP2上
PWMA_CCER1 = 0x11; //使能CC1/CC2上的捕獲功能
PWMA_CCER1 |= 0x00; //設置捕獲極性為CC1的上升沿
PWMA_CCER1 |= 0x20; //設置捕獲極性為CC2的下降沿
PWMA_CR1 = 0x01;
PWMA_IER = 0x04; //使能CC2捕獲中斷
PWMA_IER |= 0x02; //使能CC1捕獲中斷
EA = 1;
}
void PWMA_ISR() interrupt 26
{
unsigned int cnt_l;
unsigned int cnt_h;
if (PWMA_SR1 & 0x02)
{
PWMA_SR1 &= ~0x02;
cnt_l = (PWMA_CCR1 - PWMA_CCR2)/6; //差值即為低電平寬度 cnt/時鐘頻率 = 脈寬(us)
UartSendUint((unsigned int)cnt_l);
UartSendString("-low\r\n");
}
if (PWMA_SR1 & 0x04)
{
PWMA_SR1 &= ~0x04;
cnt_h = (PWMA_CCR2 - PWMA_CCR1)/6; //差值即為高電平寬度
UartSendUint((unsigned int)cnt_h);
UartSendString("-high\r\n");
}
}
void main()
{
IR();
UartInit();
//UartSendString("Starting\r\n");
//UartSendUint(1211);
while(1)
{
}
}
|