elizabeth 发表于 2017-12-7 17:07:12

HR7P169B捕捉功能


例程:采用T11捕捉信号脉宽,主频16MHz,设定捕捉时钟分频1:32,则时钟周期2us,按12位计数值计算,可捕捉的时间范围为2us~8ms。
#include <hic.h>
#define CaptureOffset 2      //捕捉补偿值,进入中断后清定时计数器值,实际指令执行的时间,以弥补下次捕捉

unsigned int PluseWidth;    //捕捉数组
unsigned char count;                  //捕捉数据计数

void isr(void) interrupt
{
unsigned char i;
if(T11IE && T11IF)      //捕捉定时器中断标志
{
T11H = 0 ;               //清定时计数器值
T11L = 0 ;
PluseWidth = ((unsigned int)(T11PH<<4) & 0xFF00) + (unsigned int)T11RL + CaptureOffset;    // 读取捕捉数据

count++;
if(count>100)         //若连续捕捉个数超过100
{
for(i=0;i<100;i++)
{
PluseWidth = 0;    //数组清0
}
count = 0;                   //个数清0
}

T11CAP0 = ~T11CAP0;      //修改沿方向
T11IF = 0 ;      //清中断标志
}
}

void main(void)
{
// 初始化PB1为输入捕捉端口
PBPD1 = 1 ;      //使能下拉电阻
PBPU1 = 0 ;
PBOD1 = 0 ;
ANSH1 = 1;      //设置PB1为数字I/O
PBT1 = 1;          //设置PB1为输入口

count = 0;          //个数清0

// 初始化定时器
T11CH = 0x80 ;      //配置T11为捕捉模式(T11M2=1),使能预分频器1(PRS1=0)
T11C = 0x06 ;          //使能T11(T11EN=1),预分频器1的分频值1:32(T11PR1S<1:0>=10)
//PRS1 = 1;               //使能预分频器2,预分频器1或2只能选用其中1个,由PRS1位选择
T11CAPC = 0x10 ;    //捕捉每1个脉冲上升沿(T11CAP<1:0>=01)

T11H = 0;      //清T11定时计数器
T11L = 0 ;

T11IE = 1 ;      //使能T11定时器中断
GIE = 1 ;         //使能全局中断

while(1)
{
;
}
}



以某编码协议为例,捕捉数据如下:
http://www.essemi.com/data/upload/201701/f_52f5ac742c002486ba3b4f26139802e3.png

砂山老妖 发表于 2017-12-7 17:14:31

16M,2T,执行8条指令用1微秒,你提到最小测2us,我看见中断中那个for(100)的循环清数组,怎么感觉很悬?
页: [1]
查看完整版本: HR7P169B捕捉功能