本帖最后由 linxi6414 于 2022-8-24 00:01 编辑
需要对一个2K频率的脉冲进行脉冲宽度采集,需要同时采样高电平的时间和低电平的时间,因为输入的频率会有一定的漂移,需要同时测量高低电平的时间,然后算出占空比,程序中要得到的是占空比,现在测试发现无论怎么调,高低电平的时间都是一样的,调占空比的时候,数据会从0-993之间变化,但是PWM_L和PWM_H同时变化,实际输入的脉冲用逻辑分析仪观察是没有问题的,可以1%-99%变化,程序如下:
#include "STC15F2K60S2.H"
#include"PPCA.h"
sbit PWM_IN = P1^0;//CCP1 PWM脉冲输入引脚,频率约为2K的PWM 占空比为1%-99%可调
unsigned char PCADAT_L=0,PCADAT_H=0,CCP_ER=0;
unsigned int PWM_L=0,PWM_H=0,PWM_DAT=0;
void PPCA_Init(void)//PCA初始化函数
{
CCON = 0; //初始化PCA控制寄存器
//PCA定时器停止
//清除CF标志
//清除模块中断标志
CL = 0; //复位PCA寄存器
CH = 0;
CMOD = 0x01; //设置PCA时钟源为系统时钟/12,使能PCA定时器溢出中断
CCAP1L = 0; //PCA模块1实现16位捕获
CCAP1H = 0; //初始化PCA模块1
CCAPM1 = 0x31; //PCA模块1为16位捕获模式(上升沿/下降沿捕获,可测高电平或者低电平宽度),且产生捕获中断
CR = 1; //PCA定时器开始工作
}
void PCA_isr() interrupt 7
{
if (CF) //判断是否为PCA计时溢出中断
{
CF = 0;
if(CCP_ER<10)
{
CCP_ER++;
}
}
if (CCF1) //判断是否为CCF1中断(捕获中断)
{
CCF1 = 0;
PCADAT_L= CCAP1L; //保存本次的捕获值
PCADAT_H= CCAP1H;
CH=0;//如果此处不清零,采集到的数据是乱的,并且上面的CF会发生中断
CL=0;
PWM_DAT=PCADAT_H;
PWM_DAT<<=8;
PWM_DAT|=PCADAT_L;
if(PWM_IN)
{
PWM_L=PWM_DAT;
}
else
{
PWM_H=PWM_DAT;
}
}
}
|