找回密码
 立即注册
楼主: 骏***

8h系列pwm捕获功能使能问题

[复制链接]

该用户从未签到

550

主题

9345

回帖

1万

积分

管理员

积分
13916
发表于 2022-12-2 18:45:29 | 显示全部楼层
本坛 PWM 实战型 老兄弟多,给力!!!

该用户从未签到

1

主题

11

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2022-12-2 18:46:40 | 显示全部楼层
flyarm 发表于 2022-12-2 18:40
还有  PWMA_CR1 = 0x01;                //开始计数
这个怎么能放到前面,你都开始计数了,怎么又去配置寄 ...

这个开始计数我放到前面试过,放到最后也试过,还是没有解决问题

该用户从未签到

1

主题

11

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2022-12-2 18:48:02 | 显示全部楼层
#include <STC8H.H>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
ulong a2;
uint cnt;
uint shujuik()//启动捕获功能        并初始化
{
       
        ulong shuj=0,li;
        double yi=0;
       
//        PWMA_CNTR=0x00;//清理计数器后也是不正常
       
        PWMA_CCER1 = 0x00;
        PWMA_CCMR1 = 0xfd; //CC1 为输入模式,且映射到 TI1FP1 上
        PWMA_CCMR2 = 0xfe; //CC2 为输入模式,且映射到 TI1FP2 上
        PWMA_CCER1 = 0x11; //使能 CC1/CC2 上的捕获功能
        PWMA_CCER1 |= 0x00; //设置捕获极性为 CC1 的上升沿
        PWMA_CCER1 |= 0x20; //设置捕获极性为 CC2 的下降沿
       
        PWMA_CR1 = 0x01;                //开始计数
        PWMA_SR1=0x00;                        //清理标志位
       
        while((PWMA_SR1&0x04)!=0x04);//等待捕获完成
        PWMA_SR1=0x00;                        //清理标志位
        shuj=PWMA_CCR2- PWMA_CCR1;//读取结果
       
        SBUF=shuj>>8;//发送结果
        while(TI==0);
        TI=0;
        SBUF=shuj;
        while(TI==0);
        TI=0;
       
        return shuj;
}
void main()
{
//***************************************************这里是串口初始化
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器时钟1T模式
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设置定时器模式
        TL1 = 0xE0;                //设置定时初始值        11.0592
        TH1 = 0xFE;                //设置定时初始值
        TR1 = 1;                //定时器1开始计时
        P_SW2 |= 0x80; //使能访问 XFR
        P1M0 = 0x00;P1M1 = 0x00;
        //***************************************************************
       
       
        while(1)
        {
                while(RI==0);//用电脑向串口随便发送一个数据
                RI=0;
                shujuik();//捕获功能
               
                PWMA_CCER1 = 0x00;//如果不注释输出的结果就不是正确的
                PWMA_CR1=0x00;
                       
        }
}

该用户从未签到

1

主题

11

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2022-12-2 18:51:31 | 显示全部楼层
神农鼎 发表于 2022-12-2 18:45
本坛 PWM 实战型 老兄弟多,给力!!!

我也问过STC的技术支持他们说只要使能肯定可以用说绝对不是IC的问题,我这实在没办法了,也找不到问题出在哪里

该用户从未签到

550

主题

9345

回帖

1万

积分

管理员

积分
13916
发表于 2022-12-2 19:00:34 | 显示全部楼层
老兄弟回去做饭吃了,等他吃饱了,再回来帮你

该用户从未签到

1

主题

11

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2022-12-2 19:08:03 | 显示全部楼层
flyarm 发表于 2022-12-2 18:35
子函数里不要每次都 所有的重新配置; 前面那些初始化一次就行了;   你只需要循环 读标志位和计数器操作

...

只要关闭计数使用时再打开就还是那样
#include <STC8H.H>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
ulong a2;
uint cnt;
uint shujuik()//启动捕获功能        并初始化
{
       
        ulong shuj=0,li;
        double yi=0;

       

        PWMA_CR1 = 0x01;                //开始计数
        PWMA_SR1=0x00;                        //清理标志位
       
        while((PWMA_SR1&0x04)!=0x04);//等待捕获完成
        PWMA_SR1=0x00;                        //清理标志位
        shuj=PWMA_CCR2- PWMA_CCR1;//读取结果
       
        SBUF=shuj>>8;//发送结果
        while(TI==0);
        TI=0;
        SBUF=shuj;
        while(TI==0);
        TI=0;
       
        return shuj;
}
void main()
{
//***************************************************这里是串口初始化
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器时钟1T模式
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设置定时器模式
        TL1 = 0xE0;                //设置定时初始值        11.0592
        TH1 = 0xFE;                //设置定时初始值
        TR1 = 1;                //定时器1开始计时
        P_SW2 |= 0x80; //使能访问 XFR
        P1M0 = 0x00;P1M1 = 0x00;
        //***************************************************************
       
        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 的下降沿
       
       
        while(1)
        {
                while(RI==0);//用电脑向串口随便发送一个数据
                RI=0;
                shujuik();//捕获功能
               

                PWMA_CR1=0x00;
                       
        }
}
  • TA的每日心情
    开心
    2024-4-29 10:31
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    16

    主题

    711

    回帖

    2532

    积分

    超级版主

    积分
    2532
    发表于 2022-12-2 21:53:41 | 显示全部楼层
    骏杰 发表于 2022-12-2 19:08
    只要关闭计数使用时再打开就还是那样
    #include
    #define uint unsigned int

    请问一下,你的这段代码的目的是为了捕获高电平的宽度吗?

    如果是这样的话,你这段代码看似正确,但其实有个比较隐藏的问题
    就是你必须保证你每次开始捕获时CC1(P1.0)口的电平都必须是低电平
    也就是必须CC1的上升沿时先捕获计数值到PWMA_CCR1,然后在CC1的下降沿时捕获计数值到到PWMA_CCR2
    最后再用PWMA-CCR2-PWMA_CCR1得到高电平的宽度

    但实际上你无法保证每次捕获时P1.0口的电平都是低电平
    如果开始捕获时,P1.0的电平已经是高电平,则当满足(PWMA_SR1&0x04)==0x04时,
    只是产生了一次CC1的下降沿捕获,这时你再用PWMA-CCR2-PWMA_CCR1得到的值必然是不准确的

    该用户从未签到

    1

    主题

    11

    回帖

    33

    积分

    新手上路

    积分
    33
     楼主| 发表于 2022-12-2 22:46:09 | 显示全部楼层
    zhp 发表于 2022-12-2 21:53
    请问一下,你的这段代码的目的是为了捕获高电平的宽度吗?

    如果是这样的话,你这段代码看似正确,但其实 ...

    你说的这个问题,我也考虑过我在前面加上while((PWMA_SR1&0x02)!=0x02)加上这一条区别不是很大
  • TA的每日心情
    开心
    2024-4-29 10:31
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    16

    主题

    711

    回帖

    2532

    积分

    超级版主

    积分
    2532
    发表于 2022-12-3 09:41:13 来自手机 | 显示全部楼层
    骏杰 发表于 2022-12-2 22:46
    你说的这个问题,我也考虑过我在前面加上while((PWMA_SR1&0x02)!=0x02)加上这一条区别不是很大 ...

    如果仅仅只是加你说的这段还是肯定不行
    如果是先捕获下降沿,后捕获到上上升沿,CC2-CC1也不是你所需要的值
  • TA的每日心情
    开心
    2024-4-29 10:31
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    16

    主题

    711

    回帖

    2532

    积分

    超级版主

    积分
    2532
    发表于 2022-12-3 09:47:21 来自手机 | 显示全部楼层
    骏杰 发表于 2022-12-2 22:46
    你说的这个问题,我也考虑过我在前面加上while((PWMA_SR1&0x02)!=0x02)加上这一条区别不是很大 ...

    或许比较好的方式是连续判断两次下降沿,如下:while((PWMA_SR1&0x04)!=0x04);
    PWMA_SR1=0x00;
    while((PWMA_SR1&0x04)!=0x04);
    PWMA_SR1=0x00;
    完成后再执行你后面的操作
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-7 21:28 , Processed in 0.067762 second(s), 63 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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