8H1K08-36I-TSSOP20 关于PWM捕获问题
下面是我根据数据手册修改的程序。使用的是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;
}
}
}
周期和占空比的计算方式和例程不一样
DebugLab 发表于 2024-8-8 09:20
周期和占空比的计算方式和例程不一样
你这个方法已经试过了,不行。 南太平洋飞鱼 发表于 2024-8-8 10:47
你这个方法已经试过了,不行。
能否使用官方的例子试试?50KHz之内的PWM都可以捕获周期和占空比,更高的频率则会占CPU时间比较多。记得将捕获中断设置为最高优先级。 梁工 发表于 2024-8-8 16:39
能否使用官方的例子试试?50KHz之内的PWM都可以捕获周期和占空比,更高的频率则会占CPU时间比较多。记得 ...
板子都做好了,要割线和飞线,很不好弄。可以帮忙指导一下,我的程序是哪里有问提吗? 有哪位大神可以帮忙看一下吗? 本帖最后由 网老四 于 2024-8-13 12:01 编辑
检查下读取捕获值的语句,是不是变量类型不同引起的错误
头文件里,PWMA_CCR1定义的是指针,如果用他对32位变量赋值,会不会把不相关的地址内容赋值过去了.
把占空比和周期变量改为16位再试试,或者高低字节分别取出来再拼装到占空比和周期变量里
经过修改接收变量为u16,分频器设置为4后捕获功能已经实现。多谢大家的热心指导!
页:
[1]