STC8G1K08A输入捕获测不出脉冲宽度
本帖最后由 大量出1nm光刻机 于 2023-7-4 11:00 编辑length无法测出1KHz的一个周期的
#include "STC8xxxx.h"
#include "intrins.h"
#define ZERO P31
#define PWMIN P32
#define PWMOUT P33
int flag;
unsigned short count;
unsigned short count0;
unsigned short count1;
unsigned short pwmDutyCycle;
unsigned short pwm;
unsigned short length;
void INT0_Isr() interrupt 0//将高电平的计数值存入count0
{
((unsigned short*)&count0) = TL0;
((unsigned short*)&count0) = TH0;
}
void TM1_Isr() interrupt 3//输出PWM的低电平
{
TR1 = 0;
PWMOUT = 0;
flag = 1;
}
void PCA_Isr() interrupt 7//上升沿捕获一个PWM周期的宽度的计数值
{
if(CCF0)//PCA捕获中断标志位
{
CCF0 = 0;
count = count1;
((unsigned char*)&count1) = CCAP0L;
((unsigned char*)&count1) = CCAP0H;
length = count1 - count;
}
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
flag = 1;
count0 = 0;
count1 = 0;
pwmDutyCycle = 0;
pwm = 0;
AUXR = 0x00;//12T模式
TMOD = 0x09;//定时器0,GATE置1,不自动重装载
CCON = 0x00;
CMOD = 0x00;//PCA,12分频
CL = 0x00;
CH = 0x00;
CCAPM0 = 0x21;//上升沿捕获
CCAP0L = 0x00;
CCAP0H = 0x00;
TL0 = 0x00;
TH0 = 0x00;
TL1 = 0x00;
TH1 = 0x00;
TR0 = 0;//开启定时器0
IT0 = 1;//使能INT0下降沿
EX0 = 1;//使能INT0中断
CR = 1;//开启PCA计数器
ET0 = 1;//使能定时器0中断
ET1 = 1;//使能定时器1中断
EA = 1;//开启总中断
P54 = 1;
P55 = 1;
while(1)
{
//输入捕获1kHz的PWM,并输出相同占空比的50Hz的PWM
pwmDutyCycle = count0 / length;//占空比
pwm = 65536 - 65536 * pwmDutyCycle;//50Hz的PWM的高电平的装载值
if(ZERO == 0&&flag == 1)
{
TL1 = ((unsigned char*)&pwm);
TH1 = ((unsigned char*)&pwm);
TR1 = 1;//开启定时器1
PWMOUT = 1;
flag = 0;
}
}
}
PCA测周期很方便的,捕捉同一个边沿即可。
页:
[1]