在线时间2 小时
UID2113304
注册时间2014-7-31
NXP金币0
该用户从未签到
新手上路

- 积分
- 16
- 最后登录
- 1970-1-1
|
大家好,我使用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;
}
请各位大侠帮忙解答,小弟不胜感激,焦急等待中!
|
|