找回密码
 立即注册
查看: 881|回复: 7

8H1K08-36I-TSSOP20 关于PWM捕获问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-08-30 11:21:10

2

主题

9

回帖

54

积分

注册会员

积分
54
发表于 2024-8-8 08:33:53 | 显示全部楼层 |阅读模式
下面是我根据数据手册修改的程序。使用的是PWM2P(P1.2)来捕获PWM的周期和占空比。使用示波器测量输入信号的频率和占空比都很稳定,但是使用捕获功能读出来的周期和占空比就一直在变化,而且幅度非常大。有大佬可以帮忙看一下是什么问题吗?
还有就是感觉这个程序没有考虑到溢出的情况,如果PWMA_CCER1,PWM1_CCMR2溢出了不是记录的周期和占空比都错误了吗?
另:这个程序没有设置捕获时钟的频率。得到周期和占空比的实际数值后要怎么换算成真确的周期时长和占空比时长。





#include "config.h"
#include        "STC8H_PWM.h"
#include        "STC8G_H_GPIO.h"


u32 pwm_in_cycle, pwm_in_duty = 0;
u8 capture_duty_flag = 0;
u8 capture_cycle_flag = 0;
void Capture_init(void)
{
        //        要先写PWMA_CCER1 寄存器的 CC1E=1,才可以配置PWM1_CCMR2
        
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.Pin  = GPIO_Pin_2;               
        GPIO_InitStructure.Mode = GPIO_HighZ;               
        GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);        //初始化

        

        PWMA_CCER1 = 0x00;
        PWMA_CCMR1 = 0x02; //CC1 为输入模式,且映射到 TI2FP1 上
        PWMA_CCMR2 = 0x01; //CC2 为输入模式,且映射到 TI2FP2 上
        PWMA_CCER1 = 0x11; //使能 CC1/CC2 上的捕获功能
        PWMA_CCER1 &= 0xFD; //设置捕获极性为 CC1 的上升沿
        PWMA_CCER1 |= 0x20; //设置捕获极性为 CC2 的下降沿
        PWMA_SMCR = 0x64; //TS=TI1FP1,SMS=TI1 上升沿复位模式
        PWMA_CR1 = 0x01;
        PWMA_IER = 0x06; //使能 CC1/CC2 捕获中断
        
}



void PWMA_ISR() interrupt 26
{
        if (PWMA_SR1 & 0x02)                //CC1IF:PWMA通道1发生捕获比较中断请求标志。
        {
                PWMA_SR1 &= ~0x02;
                if(capture_cycle_flag == 0)
                {
                        pwm_in_cycle = PWMA_CCR1;
                        capture_cycle_flag = 1;
                }
        }

        if(PWMA_SR1 & 0x04)                //CC2OF:PWMA通道2发生重复捕获中断请求标志。
        {
                PWMA_SR1 &= ~0x04;
                if(capture_duty_flag == 0)
                {
                        pwm_in_duty = PWMA_CCR2;
                        capture_duty_flag = 1;
                }
        }

}


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-06-17 09:09:48
已绑定手机

79

主题

5137

回帖

9134

积分

超级版主

DebugLab

积分
9134
发表于 2024-8-8 09:20:02 | 显示全部楼层

周期和占空比的计算方式和例程不一样
截图202408080919229185.jpg
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-08-30 11:21:10

2

主题

9

回帖

54

积分

注册会员

积分
54
发表于 2024-8-8 10:47:01 | 显示全部楼层
Debu*** 发表于 2024-8-8 09:20
周期和占空比的计算方式和例程不一样

你这个方法已经试过了,不行。

点评

能否使用官方的例子试试?50KHz之内的PWM都可以捕获周期和占空比,更高的频率则会占CPU时间比较多。记得将捕获中断设置为最高优先级。  详情 回复 发表于 2024-8-8 16:39
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-06-17 10:15:05

74

主题

6093

回帖

1万

积分

超级版主

积分
12733
发表于 2024-8-8 16:39:44 | 显示全部楼层
南太平*** 发表于 2024-8-8 10:47
你这个方法已经试过了,不行。

能否使用官方的例子试试?50KHz之内的PWM都可以捕获周期和占空比,更高的频率则会占CPU时间比较多。记得将捕获中断设置为最高优先级。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-08-30 11:21:10

2

主题

9

回帖

54

积分

注册会员

积分
54
发表于 2024-8-8 18:37:46 | 显示全部楼层
梁*** 发表于 2024-8-8 16:39
能否使用官方的例子试试?50KHz之内的PWM都可以捕获周期和占空比,更高的频率则会占CPU时间比较多。记得 ...

板子都做好了,要割线和飞线,很不好弄。可以帮忙指导一下,我的程序是哪里有问提吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-08-30 11:21:10

2

主题

9

回帖

54

积分

注册会员

积分
54
发表于 2024-8-13 10:23:14 | 显示全部楼层
有哪位大神可以帮忙看一下吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:409
  • 最近打卡:2025-06-17 00:48:11

8

主题

353

回帖

2476

积分

金牌会员

积分
2476
发表于 2024-8-13 11:53:13 | 显示全部楼层
本帖最后由 网老四 于 2024-8-13 12:01 编辑

检查下读取捕获值的语句,是不是变量类型不同引起的错误
头文件里,PWMA_CCR1定义的是指针,如果用他对32位变量赋值,会不会把不相关的地址内容赋值过去了.
把占空比和周期变量改为16位再试试,或者高低字节分别取出来再拼装到占空比和周期变量里

截图202408131201323242.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-08-30 11:21:10

2

主题

9

回帖

54

积分

注册会员

积分
54
发表于 2024-8-19 09:57:49 | 显示全部楼层
经过修改接收变量为u16,分频器设置为4后捕获功能已经实现。多谢大家的热心指导!
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 20:16 , Processed in 0.167883 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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