找回密码
 立即注册
查看: 3656|回复: 12

PWM捕获问题

[复制链接]

该用户从未签到

2

主题

14

回帖

64

积分

注册会员

积分
64
发表于 2022-12-14 15:46:27 | 显示全部楼层 |阅读模式
芯片为STC32,问题是cnt1 和cnt2的值根本和发送过来的波形值对不上,占空比和周期都不对 。发送波形为200HZ,40%占比 占空比和周期乱跳。

PWM捕获问题-1.png PWM捕获问题-2.png
这是P10端口输入波形
PWM捕获问题-3.png
==============================================



void PWM_Init() //PWM捕捉初始化
{
                PWMA_CCER1=0x00;
                PWMA_CCMR1=0x31;    //CC1为输入模式,且映射到TI1FP1上
                PWMA_CCMR2=0x32;    //CC2为输入模式,且映射到TI1FP2上
                PWMA_CCER1=0x11;    //使能CC1/CC2上的捕获功能
                PWMA_CCER1|=0x00;   //设置捕获极性为CC1的上升沿
                PWMA_CCER1|=0x20;   //设置捕获极性为CC2的下降沿
                PWMA_SMCR=0x54;     //TS=TI1FP1,SMS=TI1上升沿复位模式
                PWMA_CR1=0x01;      //开启计数器
                PWMA_IER=0x06;                        //使能CC1/CC2捕获中断       
}




void PWMA_ISR() interrupt 26    //PWM中断 P10脚
{
        if (PWMA_SR1 & 0x02)
        {
                PWMA_SR1 &= ~0x02;
                cnt1=(PWMA_CCR1H<<8)+PWMA_CCR1L;  //CC1捕捉周期
                PWMA_INT=1;
        }
        if (PWMA_SR1 & 0x04)
        {
                PWMA_SR1 &= ~0x04;
                cnt2=(PWMA_CCR2H<<8)+PWMA_CCR2L;                //CC2捕捉占空比
                PWMA_INT1=1;
        }
}



                                if(PWMA_INT==1)
                                {
                                        printf("t3.txt=\"%d\"",cnt1);
                                        UART_Send_END();
                                        for(l=0;l<20;l++)
                                        {
                                                printf("add 2,0,80");
                                                UART_Send_END();          //发送3个FF
                                        }
                                        PWMA_INT=0;
                                }
                                if(PWMA_INT1==1)
                                {
                                        printf("t5.txt=\"%d\"",cnt2);
                                        UART_Send_END();
                                        for(l=0;l<20;l++)
                                        {
                                                printf("add 2,0,130");
                                                UART_Send_END();          //发送3个FF
                                        }
                                        PWMA_INT1=0;
                                }


=======================================================

回复 送花

使用道具 举报

  • TA的每日心情
    开心
    2024-4-30 09:05
  • 签到天数: 79 天

    [LV.6]常住居民II

    9

    主题

    170

    回帖

    1703

    积分

    版主

    积分
    1703
    发表于 2022-12-14 16:21:45 | 显示全部楼层
    可以先参考下我们手册和下载软件上的范例,也请论坛大师帮忙看下此客户问题!
    STC8H_STC32G的PWM,输入捕获模式同时测量脉冲周期和占空比-1.png
    STC8H输入捕获模式同时测量脉冲周期和占空比范例.png

    该用户从未签到

    2

    主题

    14

    回帖

    64

    积分

    注册会员

    积分
    64
     楼主| 发表于 2022-12-15 09:08:42 | 显示全部楼层
    这个是完全按照例程做的  
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    722

    回帖

    2574

    积分

    超级版主

    积分
    2574
    发表于 2022-12-15 09:31:49 | 显示全部楼层


    没有你的源代码,只能猜测,有没有可能是你下面的两个串口发送数据占用时间太长
    导致无法及时处理PWMA_INT和PWMA_INT1两个信号
    1.png

    该用户从未签到

    2

    主题

    14

    回帖

    64

    积分

    注册会员

    积分
    64
     楼主| 发表于 2022-12-15 09:55:11 | 显示全部楼层
    PWMA_INT和PWMA_INT1这两是标志   今天我也把循环去掉了  还是显示的不对  CNT1和cnt2正常就是读到数 我就发出去了,上面的代码都是和捕获有关系的

    点评

    zhp
    我们可以大概计算一下,你的信号源是200Hz,一个周期就是5ms 你的串口波特率为9600,传输一个字节(起始+数据+停止),10个bit的时间大概为1ms 一个信号源周期内部顶多传输5个字节的串口数据 不知你的代码后面有怎  详情 回复 发表于 2022-12-15 12:20

    该用户从未签到

    2

    主题

    14

    回帖

    64

    积分

    注册会员

    积分
    64
     楼主| 发表于 2022-12-15 10:02:48 | 显示全部楼层
    是不是和定时器有关系呢  我用时钟是片内24M得 外部没接晶振   PWM这个定时器 和 其他定时器是独立的还是一起的 MAIN_Fosc是24M
    //===================   本地常量声明   ====================
                            
    #define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒

    void Timer0_Init() //定时器初始化
    {
                    AUXR = 0x80;                                            //定时器0设置为1T,16位定时器自动重新加载,
                    TH0 = (u8)(Timer0_Reload / 256);
                    TL0 = (u8)(Timer0_Reload % 256);
                    ET0 = 1;                                                // 定时器0中断
                    TR0 = 1;                                                //定时器0开启
    }

    这个是串口的
    #define BRT_A    (65536-(MAIN_Fosc/9600)/4)
    void UART_Init()     
    {
    // PCON|=0x00; //PCON的最高位SMOD=1时波特率加倍
    TMOD=0x00;  //时器1为方式2 初值自动装入 产生波特率
    TH1=BRT_A>>8;   //定时器初始为0xFF0XF7,晶振为24MHz,本函数实际产生的波特率为9600bps
    TL1=BRT_A;         //同上  f70xF4
    SCON=0x50;         //串口设置为方式1,REN=1,允许接收
    TR1=1;      //启动定时器1
    T1x12=1;
    S1BRT=0;
    ES=1;       //使能串口接收中断,
    EA=1;     //打开所有中断
    }

    该用户从未签到

    2

    主题

    14

    回帖

    64

    积分

    注册会员

    积分
    64
     楼主| 发表于 2022-12-15 10:22:54 | 显示全部楼层
    PWMA_SMCR=0x54;     //TS=TI1FP1,SMS=TI1上升沿复位模式
    这句具体含义,我看资料说就是每当捕捉到上升沿的时候,计数器的值会存到PWMA_CCR1里并且计数器清零,这样就得到了周期得值  当下降沿时就读到了高电平的宽度了  感觉跟计数器的时间有关系    还有就是数组乱跳

    点评

    计数器只要不改变输入时钟,就不会有跳动的可能,除非你在不好做过程中,不断的改变时钟频率。  详情 回复 发表于 2022-12-15 10:44
  • TA的每日心情

    2024-5-3 14:22
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    3

    主题

    20

    回帖

    149

    积分

    注册会员

    积分
    149
    发表于 2022-12-15 10:36:40 | 显示全部楼层
    把捕获的 优先级调到最高

    该用户从未签到

    46

    主题

    3029

    回帖

    6827

    积分

    超级版主

    积分
    6827
    发表于 2022-12-15 10:44:50 | 显示全部楼层
    yanwei0433 发表于 2022-12-15 10:22
    PWMA_SMCR=0x54;     //TS=TI1FP1,SMS=TI1上升沿复位模式
    这句具体含义,我看资料说就是每当捕捉到上升沿 ...

    计数器只要不改变输入时钟,就不会有跳动的可能,除非你在不好做过程中,不断的改变时钟频率。
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    722

    回帖

    2574

    积分

    超级版主

    积分
    2574
    发表于 2022-12-15 12:20:22 | 显示全部楼层
    本帖最后由 zhp 于 2022-12-15 13:18 编辑
    yanwei0433 发表于 2022-12-15 09:55
    PWMA_INT和PWMA_INT1这两是标志   今天我也把循环去掉了  还是显示的不对  CNT1和cnt2正常就是读到数 我就 ...

    我们可以大概计算一下,你的信号源是200Hz,一个周期就是5ms
    你的串口波特率为9600,传输一个字节(起始+数据+停止),10个bit的时间大概为1ms
    一个信号源周期内部顶多传输5个字节的串口数据

    不知你的代码后面有怎么修改,但你之前的代码中,
    检测到PWMA_INT为1时,串口差不多要传输275个字节的数据,
    检测到PWMA_INT1为1时,串口差不多要传输295个字节的数据

    PWMA_INT和PWMA_INT1两个信号的处理严重滞后,串口打印出来的数据肯定是不正确的


    附件是我按照你的程序模式,写的测试程序,
    提高串口波特率,传输字节少一点,捕获到的周期和占空比都非常稳定
    1.png

    TestPWM.rar

    27.99 KB, 下载次数: 69

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-17 10:17 , Processed in 0.081473 second(s), 72 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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