标题: STC8H单片机PWM捕获问题 [打印本页]

作者: 范莉萍    时间: 2023-8-7 12:41
标题: STC8H单片机PWM捕获问题
请教各位大佬,使用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)
        {
               
        }
}

1.png (97.98 KB, 下载次数: 51)

1.png

2.png (97.22 KB, 下载次数: 44)

2.png

3.png (98.93 KB, 下载次数: 50)

3.png

作者: 范莉萍    时间: 2023-8-7 15:52
找到问题了,串口发送数据的时间影响了测量

作者: davidliu2016    时间: 2023-8-7 16:34
串口发送数据会影响PWM测量,需要把PWM的中断优先级提高到0。
作者: coody_sz    时间: 2023-8-7 20:47
范莉萍 发表于 2023-8-7 15:52
找到问题了,串口发送数据的时间影响了测量

不明白,串口发送数据怎么影响了测量?都用的中断,各自不影响的。对MCU来说,这两个任务都是很简单的任务,不需要消耗多少CPU时间的。
作者: 范莉萍    时间: 2023-8-9 11:26
coody_sz 发表于 2023-8-7 20:47
不明白,串口发送数据怎么影响了测量?都用的中断,各自不影响的。对MCU来说,这两个任务都是很简单的任 ...

串口发送用的不是中断,接收用了中断,算了一下,发送这些字符得1ms左右
作者: coody_sz    时间: 2023-8-9 14:35
范莉萍 发表于 2023-8-9 11:26
串口发送用的不是中断,接收用了中断,算了一下,发送这些字符得1ms左右

有中断不用,中断发送效率高,一个字节只需要2us左右就可以装载完。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1