概述
脉冲累加
原理分析:
XS128的脉冲累加如同字面一样,对外部给予的脉冲加以在16位的计数寄存器里累计,当寄存器溢出时可以产生中断。在智能车里用于点击的闭环控制。另外脉冲累加也可以用于事件时间累计,累计脉冲为时钟分频后的脉冲。脉冲累加的外部引脚为T7脚。
寄存器介绍
控制寄存器
PAEN脉冲累加使能。PAMOD模式选择,计外部脉冲时设为1,对时间进行累加设为0。
PEDGE为触发控制位,为外部脉冲时1表示上升沿计数,0表示下降沿计数,计时间时,1表示高电平计数,0表示低电平计数。计时间时的分频系数。PAOVI为溢出中断使能,在计数器溢出的时候会产生中断。PAI为输入中断,当有脉冲的时候就会产生中断。
标志寄存器
PAOVF为溢出中断表示位,在中断函数后面要写1清零。PAIF为输入中断。
脉冲累加计数寄存器
该寄存器可读可写。
代码参考:
溢出中断:
#include <hidef.h>
#include "derivative.h"
void IO_Init(void){
DDRB = 0xff ;
// 设置LED口为输出
PORTB = 0xff ;
// LED初始为灭
DDRA_DDRA4 = 1 ;
// 设置A0脚为输出模拟输入捕捉信号
PORTA_PA4 = 1 ;
// A0初始为高电平
}
void PA_Init(void)
{
PACTL= 0x52 ;
// 使能脉冲累加,事件计数,上升沿计数,使能溢出中断
PAFLG_PAOVF = 1 ;
// 清楚溢出中断标志位
PACNT = 0x0000 ;
// 计数器清零
EnableInterrupts
// 开总中断
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt VectorNumber_Vtimpaaovf void PAI(void) { //17
static uint count1,count2;
count1=count2;
count2=PACNT;
//计算一定时间内采集的脉冲个数
PORTB_PB1=~PORTB_PB1;
PAFLG_PAOVF = 1 ;
// 清中断标志位
}
#pragma CODE_SEG DEFAULT
void Delay(void)
{
word i , j ;
for(i = 0 ; i < 200 ; i++)
for(j = 0 ; j < 2000 ; j++) ;
}
void main(void)
{
IO_Init();
PA_Init() ;
for(;;)
{
PORTA_PA4 = ~PORTA_PA4 ;
}
}
输入中断:
/************************************
*
TIM 脉冲累加 Paulse Accumulator
*
线路连接:对应引脚为PT7 应将PT7与中断源相连(本程序将PT7与PA4相连)
*
2014/7/8 by Quex
************************************/
#include <hidef.h>
#include "derivative.h"
void Delay_ms(uint ms){
uint i,j;
if (ms<1) ms=1;
for(i=0;i<ms;i++)
for(j=0;j<1335;j++);
//16MHz--1ms
}
void PAI_Init(void){
PACTL=0x51;
//脉冲累加使能,上升沿,事件计数,使能输入中断
PAFLG_PAIF=1; //清除标志位
PACNT=0x0000;
}
void IO_Init(void){
DDRB=0xff;
PORTB=0xff;
DDRA=0xff;
PORTA_PA4=1;
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt VectorNumber_Vtimpaie void PAI(){
//18
static uint count1,count2;
count1=count2;
count2=PACNT;
//计算一定时间内采集的脉冲个数
//液晶显示
PORTB_PB1=~PORTB_PB1;
PAFLG_PAIF=1;
}
#pragma CODE_SEG DEFAULT
void main(void) {
IO_Init();
PAI_Init();
EnableInterrupts;
for(;;) {
PORTA_PA4=~PORTA_PA4;
Delay_ms(1000);
_FEED_COP();
}
}
/************************************
*
TIM 脉冲累加 Paulse Accumulator
*
线路连接:对应引脚为PT7 应将PT7与中断源相连(本程序将PT7与PA4相连)
*
2014/7/8 by Quex
************************************/
#include <hidef.h>
#include "derivative.h"
void Delay_ms(uint ms){
uint i,j;
if (ms<1) ms=1;
for(i=0;i<ms;i++)
for(j=0;j<1335;j++);
//16MHz--1ms
}
void PAI_Init(void){
PACTL=0x51;
//脉冲累加使能,上升沿,事件计数,使能输入中断
PAFLG_PAIF=1; //清除标志位
PACNT=0x0000;
}
void IO_Init(void){
DDRB=0xff;
PORTB=0xff;
DDRA=0xff;
PORTA_PA4=1;
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt VectorNumber_Vtimpaie void PAI(){
//18
static uint count1,count2;
count1=count2;
count2=PACNT;
//计算一定时间内采集的脉冲个数
//液晶显示
PORTB_PB1=~PORTB_PB1;
PAFLG_PAIF=1;
}
#pragma CODE_SEG DEFAULT
void main(void) {
IO_Init();
PAI_Init();
EnableInterrupts;
for(;;) {
PORTA_PA4=~PORTA_PA4;
Delay_ms(1000);
_FEED_COP();
}
}
最后
以上就是顺心睫毛为你收集整理的xs128TIM之脉冲累加 脉冲累加的全部内容,希望文章能够帮你解决xs128TIM之脉冲累加 脉冲累加所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复