智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3084|回复: 4
打印 上一主题 下一主题

[讨论] mc9s12xs128 多输入捕捉与定时

[复制链接]

4

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
威望
157
贡献
50
兑换币
18
注册时间
2012-4-24
在线时间
11 小时
毕业学校
杭州电子科技大学
跳转到指定楼层
1#
发表于 2012-12-7 18:56:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zwxclark 于 2012-12-7 18:59 编辑

各位前辈
我用的是mc9s12xs128
设想用这块芯片的三个具有输入捕捉功能的IO口(如IOC0-IOC2),分别连接三个接近开关,当一个磁性物体以一定速度直线经过三个接近开关,三个接近开关会各自产生电平变化,我通过IO口捕捉电平变化的时间,就可以计算出这个物体的速度与加速度.然后就能确定这个物体到达距第三个接近开关已知距离S位置的时间t.延时时间t之后,单片机普通io口再输出特定脉冲.
问题:

1.这块单片机能实现我这样的功能需求么?
2.其中物体经过三个接近开关的时间或者时间间隔要怎么获取? 因为,
TCNT自由运行计数器只有16位,定时长度太短,所以三个接近开关输入捕捉产生中断的时间,可能会不在同一个周期里面.

34

主题

1589

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6271

论坛元老奖章优秀会员奖章活跃会员奖章在线王奖章

威望
3267
贡献
1194
兑换币
2035
注册时间
2012-11-28
在线时间
905 小时
2#
发表于 2012-12-7 20:11:07 | 只看该作者
啥啊??
回复 支持 反对

使用道具 举报

6

主题

166

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1499
威望
761
贡献
460
兑换币
301
注册时间
2012-8-22
在线时间
139 小时
毕业学校
未毕业
3#
发表于 2012-12-10 12:40:50 | 只看该作者
我觉得可以,而且16位计数器通过分频计数时间可以加长,即使不在一个周期也没问题,但是一定要分清楚什么时候停止计数,如果计数满,可以让一个变量加1.
回复 支持 反对

使用道具 举报

4

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
威望
157
贡献
50
兑换币
18
注册时间
2012-4-24
在线时间
11 小时
毕业学校
杭州电子科技大学
4#
 楼主| 发表于 2012-12-11 15:10:03 | 只看该作者
happyzn75 发表于 2012-12-10 12:40
我觉得可以,而且16位计数器通过分频计数时间可以加长,即使不在一个周期也没问题,但是一定要分清楚什么时 ...

非常感谢,你说的很对.
我的问题目前已经解决,现在计时依靠PIT0计时器产生0.01ms的定时间隔,每一个周期,变量A++,A到最大值65535,变量B++,这样就能满足长时间的计时了.程序如下.
#include <string.h>
#include <stdio.h>
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"



//==================================================
//定时中断,实现计时
//==================================================
//#define PITTIME 60//设定为 50MS定时
unsigned int vTmpPIT=0,vTmpPIT2=0;
unsigned int flag0=0,flag1=0;
double timer1=0.0,timer2=0,timer3=0,speed1=0,distance1=0.05;


void pllclk(void)//24MHz,外部时钟为 16MHz
{
CLKSEL=0X00;
PLLCTL=0xe1;
SYNR=2;//PLLCLK=2*OSCCLK*(SYNR +1)/(REFDV +1)
REFDV=1;
PLLCTL=0X60;
asm NOP;
asm NOP;
asm NOP;
while((CRGFLG&0X08)==0);//时钟校正同步
CLKSEL=0X80;
}

//****T0,T4输入捕捉通道初始化****//  
void ECT0_INIT()  
{
  TSCR1=0X80;      //开启总定时器中断 基本不变
  TSCR2=0X00;      //关闭溢出中断,0分频
  TIOS_IOS0=0;     //定通道0为输入捕捉,1为输出比较IOC0
  TIOS_IOS5=0;     //定通道4为输入捕捉,1为输出比较IOC0
  //TCTL4=0X01;      //上升沿捕捉  0x02为下降沿捕捉
  TCTL3=0X02;      //0101上升沿捕捉  0x02为下降沿捕捉
  TCTL4=0X01;      //上升沿捕捉  0x02为下降沿捕捉
  TIE_C0I=1;       //通道0中断使能
  TIE_C4I=1;       //通道4中断使能
  TFLG1_C0F=1;     //标志位清零
  TFLG1_C4F=1;     //标志位清零

}  

//****T0中断服务程序****//
#pragma CODE_SEG __NEAR_SEG NON_BANKED  //分配内存空间
void interrupt 8 timer_onput0()          //输入捕捉通道0的中断向量为8
{
  flag0=flag0+1;          //中断次数标志位

  if(flag0 == 1)
  {
    TFLG1_C0F=1;     //标志位清零
    //TIE_C0I=0;     // 禁止通道0中断使能,使中断只响应一次
    asm sei;         //关总中断
    PTM_PTM0=~PTM_PTM0;
    PITCFLMT_PITE=1; //开启PIT模块
    PITINTE_PINTE0=1;   
    asm cli;         //开总中断
  }else if(flag0 == 2)
  {

    PTM_PTM0=~PTM_PTM0;

  }  
}
//****T4中断服务程序****//  
#pragma CODE_SEG __NEAR_SEG NON_BANKED  //分配内存空间
void interrupt 12 timer_onput4()          //输入捕捉通道0的中断向量为8
{
  flag1++;          //中断次数标志位

  if(flag1 == 1 && flag0 == 1)
  {            
    timer1=(double) vTmpPIT;
    timer2=(double) vTmpPIT2;
    timer3=timer2*0.65535+timer1*0.00001;//时间计算单位秒s
    speed1=timer3/distance1;
    TFLG1_C4F=1;     //标志位清零
    //TIE_C4I=0;     // 禁止通道0中断使能,使中断只响应一次
    asm sei;         //关总中断
    PTM_PTM0=~PTM_PTM0;
    //PITCFLMT_PITE=0; //关闭PIT模块
    //PITINTE_PINTE0=1;   
    asm cli;         //开总中断
  }
  /*else
   {
    timer1=(double) vTmpPIT;
    timer2=(double) vTmpPIT2;
    timer3=timer2*0.65535+timer1*0.00001;//时间计算单位秒s
    TFLG1_C0F=1;     //标志位清零
    //TIE_C0I=0;     // 禁止通道0中断使能,使中断只响应一次
    asm sei;         //关总中断
    PTM_PTM0=~PTM_PTM0;

    PITCFLMT_PITE=0; //关闭PIT模块
    PITINTE_PINTE0=1;   
    asm cli;         //开总中断
   }
  */

}

//****定时中断初始化函数 0.01MS定时中断设置****//  
void initPIT(void)
{
PITCFLMT_PITE=0;//定时中断通道0关
PITCE_PCE0=1;//定时器通道 0使能
//PITMTLD0=40-1;//8位定时器初值设定。40*60=2400分频,在 24MHzBusClock下,为 0.01MHz。定时长度即 100us=0.1ms
PITMTLD0=4-1;//8位定时器初值设定。4*60=240分频,在 24MHzBusClock下,为 0.1MHz。定时长度即 10us=0.01ms  
PITLD0=60-1;//16位定时器初值设定。PITTIME*0.01MS
PITINTE_PINTE0=1;//定时器中断通道 0中断使能
//PITCFLMT_PITE=1;//定时器通道0使能
}

//****PIT0 中断服务程序****//  
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void)
{
vTmpPIT++;

if(vTmpPIT==65535)
  {
  vTmpPIT2++;
  PTM_PTM0=~PTM_PTM0;
  }

PITTF_PTF0=1;//清中断标志位
}

//****IO口初始化,M口为输出 ****//  
void initIOBoutput(void)
{
DDRM=0XFF;
PTM=0XFF;
}
//****主函数 ****//
void main(void)
{

ECT0_INIT();
pllclk();
initIOBoutput();
initPIT();
PTM=0B11111110;
EnableInterrupts;
for(;;){}
}



回复 支持 反对

使用道具 举报

7

主题

39

帖子

0

精华

高级会员

Rank: 4

积分
736
威望
396
贡献
196
兑换币
192
注册时间
2012-9-6
在线时间
72 小时
毕业学校
广东石油化工学院
5#
发表于 2013-8-8 22:13:34 | 只看该作者
zwxclark 发表于 2012-12-11 15:10
非常感谢,你说的很对.
我的问题目前已经解决,现在计时依靠PIT0计时器产生0.01ms的定时间隔,每一个周期,变 ...

看不懂啊亲,我也需要测量脉宽啊,但是就是不知道怎么测。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-8 14:00 , Processed in 0.090887 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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