查看: 2879|回复: 3

[S12] MC9S12使用ECT捕获时脉冲数丢失

[复制链接]

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
16
最后登录
1970-1-1
发表于 2015-1-21 17:23:50 | 显示全部楼层 |阅读模式
大家好,我使用MC9S12XEP100中的ECT模块编写了一个捕获频率个数的程序,这个程序在频率较低时工作正常,但是频率较高时(大于1Khz)时,捕获脉冲数目不对,比实际少了数多,例如2Khz时,捕获到的频率还不到1Khz,程序如下,
/*-----------------------------------------------------------
This soft is used for testing the VMS with XEP100 MCU
-------------------------------------------------------------*/
#include <hidef.h>      /* common defines and macros */
#include <MC9S12XEP100.h>     /* derivative information */
#include <stdtypes.h>
#include "vms_fun.h"
#pragma LINK_INFO DERIVATIVE "mc9s12xep100"

//=====================================================================
//    variable definition
//=====================================================================  
int iSpeedNum=500;//定时时间次数,一次为1MS
word  iPulesNumAll=0;//总脉冲数
word V=0;//速度变量
unsigned char can_state=0;//can state flag     v6
Byte HV=0;
Byte LV=0;
unsigned char Data[2];

void Init_PT0_ICapture(void)
{
   ECT_TSCR1=0;
   ECT_TIOS=0;//设定通道4为输入捕捉工作方式
   ECT_TSCR2=0x07;//开启定时器中断 500ms中断
   
  ECT_TFLG1=0xFF; //清除中断标志位
  ECT_TCTL3=0x02; //设置输入捕捉方式的捕捉方式
   ECT_TIE=0xFF;  //定时器中断使能
  ECT_TSCR1=0x80;
}
void Init_MDC(void)
{
    ECT_MCCTL=0xDF;//设定模数计数器工作方式,中断使能,计数器使能
               //分频系数为16
   ECT_MCCNT=1000;//定时器赋初值 (1/16M)*16*1000= 1ms
}

//=====================================================================
//  main codes
//=====================================================================
void main(void)
{
   
    SetPll();
    Init_IO();
    Mscan2Ini();
    Init_PWM();
    Init_PT0_ICapture();
    Init_MDC();
    CAN2RFLG = 0xC3; //清唤醒中断标志 清状态改变中断标志 清溢出中断标志 清接收缓冲区满标志
   CAN2RIER = 0x01; //接收缓冲区满事件中断允许
   
    PWME|=0b1101;
    PORTAB_PA0=1;
   PORTAB_PA2=1;

      
    PORTAB_PA1=1;
  }
   
   
  
    EnableInterrupts;
   
    //MAIN CIRCLES
    for(;;) {}
        
      
            
  
}
//=====================================================================
//    interrupt ISR     0x76---20.48ms
//=====================================================================
#pragma CODE_SEG __NEAR_SEG NON_BANKED
//----------------------------------------------
void interrupt 26 MDC_ISR(void)
{
  static unsigned int count=0;
  count++;
  if(count==iSpeedNum)        //500MS读取一次
    {
      V=2*iPulesNumAll*60/118;   //计算当前速度
      //V=0x1111;
      V=V+8000;
     LV=(Byte)V;
     HV=(Byte)(V>>8);
     Data[0]=LV;
     Data[1]=HV;  
      //V=V+8000-2425;   
      iPulesNumAll=0;
      count=0;
      can_state=CAN2SendFrame ((CAN_ID29_to_ID32(0x80b9699)), 0x00, sizeof(Data), &Data);
     PORTAB_PA2=~PORTAB_PA2;
    }
  ECT_MCFLG = 0x80;  //清中断标志位
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 12 PT4_Capture(void)
{
  ECT_TFLG1=0xFF;  //清中断标志位
iPulesNumAll++;  //脉冲计数
PORTAB_PA1=~PORTAB_PA1;
}


请各位大侠帮忙解答,小弟不胜感激,焦急等待中!
我知道答案 目前已有3人回答
回复

使用道具 举报

该用户从未签到

11

主题

835

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1795
最后登录
2016-4-2
发表于 2015-1-31 22:27:43 | 显示全部楼层
会不会是溢出了?
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

825

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1687
最后登录
2015-2-10
发表于 2015-1-31 22:27:46 | 显示全部楼层
把变量设置大一点
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

35

帖子

0

注册会员

Rank: 2

积分
83
最后登录
2015-2-6
发表于 2015-1-31 22:27:48 | 显示全部楼层
同意,mark
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-17 12:21 , Processed in 0.087150 second(s), 24 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表