请教各位大佬,使用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)
{
}
}
|