找回密码
 立即注册
查看: 3412|回复: 27

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

[复制链接]

该用户从未签到

1

主题

11

回帖

33

积分

新手上路

积分
33
发表于 2022-12-2 17:03:18 来自手机 | 显示全部楼层 |阅读模式
我把捕获功能的初始化放到了一个函数里,这个函数里有配置模式配置通道,以及捕获边沿还有捕获到的值,那么我需要捕获的时候我调用一下这个函数那么我就得到了一个捕获值,如果连续读取这样是正常的没有问题,如果我在这个函数后面加上关闭计数和关闭使能,我再次连续读取的时候他的值就类似随机数了,如果不关闭计数和使能的话,连续读取结果,得到的结果几乎一致有少许误差,如果后面加上关门计数和使能的话连续读取到的数据完全不对
回复 送花

使用道具 举报

该用户从未签到

552

主题

9529

回帖

1万

积分

管理员

积分
14103
发表于 2022-12-2 17:14:32 | 显示全部楼层
1,你用 STC 的 哪个程序改的,指出来;
2,你想实现啥样的功能描述清楚-任务定义;
3,你修改后的代码发上来;大家来帮你!
另外你要看最新的STC8H用户手册的 第21章,第8大节的 范例程序部分

http://www.stcmcudata.com/STC8F-DATASHEET/STC8H.pdf

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

    [LV.6]常住居民II

    9

    主题

    170

    回帖

    1703

    积分

    版主

    积分
    1703
    发表于 2022-12-2 17:36:36 | 显示全部楼层
    参考下我们最新的STC8H数据手册,下载软件上范例程序
    同时捕获4路输入信号的周期和占空比.jpg
    下载软件STC8H范例-输入捕获模式测量脉冲周期.jpg
    STC8H手册目录.jpg
  • TA的每日心情

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

    [LV.2]偶尔看看I

    3

    主题

    20

    回帖

    149

    积分

    注册会员

    积分
    149
    发表于 2022-12-2 18:14:44 | 显示全部楼层
    本帖最后由 flyarm 于 2022-12-2 18:21 编辑

    参照4通道; 我记得配置的时候要先清计数器,不然就是个随机值; 捕获只需要计算相对值,上一个触发和下一个触发,相对值就可以了,想用绝对值,就第一次触发清0,下一次就直接用读取的值

    该用户从未签到

    552

    主题

    9529

    回帖

    1万

    积分

    管理员

    积分
    14103
    发表于 2022-12-2 18:22:02 | 显示全部楼层
    如果你错误的程序 舍不得贴出来 让 老人查错,怕老人水平又提高了,建议你用仿真功能调试,这样很容易定位问题在哪!本坛 PWM 高手较多,都可以帮到你,楼上老兄弟,实战 STC8H1K08的 PWM 也多次出成熟产品了

    使用STC-USB Link1D的CDC串口仿真8位单片机-深圳国芯人工智能有限公司 (stcai.com)
    使用STC-USB Link1D的CDC串口仿真8位单片机

    该用户从未签到

    1

    主题

    11

    回帖

    33

    积分

    新手上路

    积分
    33
     楼主| 发表于 2022-12-2 18:24:56 | 显示全部楼层
    神农鼎 发表于 2022-12-2 17:14
    1,你用 STC 的 哪个程序改的,指出来;
    2,你想实现啥样的功能描述清楚-任务定义;
    3,你修改后的代码发上 ...

    #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_CR1 = 0x01;                //开始计数
            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_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:27:18 | 显示全部楼层
    flyarm 发表于 2022-12-2 18:14
    参照4通道; 我记得配置的时候要先清计数器,不然就是个随机值; 捕获只需要计算相对值,上一个触发和下一个 ...

    试过不行
  • TA的每日心情

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

    [LV.2]偶尔看看I

    3

    主题

    20

    回帖

    149

    积分

    注册会员

    积分
    149
    发表于 2022-12-2 18:35:10 | 显示全部楼层
    本帖最后由 flyarm 于 2022-12-2 18:36 编辑

    子函数里不要每次都 所有的重新配置; 前面那些初始化一次就行了;   你只需要循环 读标志位和计数器操作

    还是先参照一下例程 4通道捕获....

    该用户从未签到

    1

    主题

    11

    回帖

    33

    积分

    新手上路

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

    ...

    好的我看一下
  • TA的每日心情

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

    [LV.2]偶尔看看I

    3

    主题

    20

    回帖

    149

    积分

    注册会员

    积分
    149
    发表于 2022-12-2 18:40:33 | 显示全部楼层
    还有  PWMA_CR1 = 0x01;                //开始计数
    这个怎么能放到前面,你都开始计数了,怎么又去配置寄存器了?  不是应该配置好了 才开始计数?
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-19 22:11 , Processed in 0.072388 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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