- 打卡等级:初来乍到
- 打卡总天数:3
- 最近打卡:2024-08-30 11:21:10
注册会员
- 积分
- 54
|
下面是我根据数据手册修改的程序。使用的是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;
}
}
}
|
|