找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1495|回复: 5
收起左侧

STC8H单片机PWM捕获问题

[复制链接]
回帖奖励 4 黑币 回复本帖可获得 4 黑币奖励! 每人限 1 次
ID:773929 发表于 2023-8-7 12:41 | 显示全部楼层 |阅读模式
请教各位大佬,使用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
2.png
3.png
回复

使用道具 举报

ID:773929 发表于 2023-8-7 15:52 | 显示全部楼层
找到问题了,串口发送数据的时间影响了测量
回复

使用道具 举报

ID:126987 发表于 2023-8-7 16:34 | 显示全部楼层
串口发送数据会影响PWM测量,需要把PWM的中断优先级提高到0。
回复

使用道具 举报

ID:1034262 发表于 2023-8-7 20:47 | 显示全部楼层
范莉萍 发表于 2023-8-7 15:52
找到问题了,串口发送数据的时间影响了测量

不明白,串口发送数据怎么影响了测量?都用的中断,各自不影响的。对MCU来说,这两个任务都是很简单的任务,不需要消耗多少CPU时间的。
回复

使用道具 举报

ID:773929 发表于 2023-8-9 11:26 | 显示全部楼层
coody_sz 发表于 2023-8-7 20:47
不明白,串口发送数据怎么影响了测量?都用的中断,各自不影响的。对MCU来说,这两个任务都是很简单的任 ...

串口发送用的不是中断,接收用了中断,算了一下,发送这些字符得1ms左右
回复

使用道具 举报

ID:1034262 发表于 2023-8-9 14:35 | 显示全部楼层
范莉萍 发表于 2023-8-9 11:26
串口发送用的不是中断,接收用了中断,算了一下,发送这些字符得1ms左右

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表