智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2705|回复: 7
打印 上一主题 下一主题

[编程类] 飞思卡尔两路输入捕捉测速。。。求助大家

[复制链接]

1

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
110
威望
55
贡献
25
兑换币
35
注册时间
2013-7-3
在线时间
17 小时
毕业学校
吉林大学
跳转到指定楼层
1#
发表于 2013-7-11 19:26:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
9贡献
飞思卡尔两路输入捕捉测速。。。检查了好久就是不好使。。。求助大家了
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */



void initPT();
void initPA();
void initPIT(void);  //PIT初始化                          没有看门狗  
void stop(void);
void backward(void);
void forward(void);
void  delay();
void  Init_PLL();
int i=0,j=0,sign=1,a=1;
void  Init_PLL()
{
  CLKSEL=0X7F;
  PLLCTL=0XBF;
  SYNR=0X53;     //01010011  80MHZ,总线40MHZ
  REFDV=0X07;   
  PLLCTL=0X60;
  while(( CRGFLG&0x08)==0);  //等待锁相环稳定
  CLKSEL=0X80;      //使用PLL
}
void main()
{

  void initPT();
  void initPA();
  Init_PLL();  //总线时钟为40MHZ
asm ANDCC #$AF;//将不可屏蔽,可屏蔽中断开启
IRQCR=0xC0;
EnableInterrupts;
for(;;)
    {
asm ANDCC #$AF;//将不可屏蔽,可屏蔽中断开启  
    }
}
//设置下降沿触发,使能
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 5 XIRQ_interrupt(void)// XIRQ中断程序,对应按下j1
{if(a==1) {
  forward();
}
a=0;
asm ORCC #$EF;//关不可屏蔽
}
#pragma CODE_SEG DEFAULT//将不可屏蔽中断关闭}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 6 IRQ_interrupt(void)//IRQ中断程序,对应按下j2
{asm ANDCC #$EF; //开可屏蔽
initPIT();
TSCR1_TEN=1;//允许定时器工作
TIOS=0xFC;//通道0,1设置为输入捕捉
TCTL4=0x05;//设置上升沿捕捉
TIE=0x03;//允许通道0,1捕捉后中断
}
#pragma CODE_SEG DEFAULT
//CCR中的I位置0  允许中断
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 8 huoer_interrupt(void)
{
asm ORCC #$FF;//CCR中的I位置1  不允许中断         车轮
TSCR1_TFFCA=1;// 定时器标识位快速清零
TSCR1_TEN=1;//允许定时器工作
i++;//计数变量自加1
TFLG1_C0F=1;//中断标志位置0
asm ANDCC #$EF;
}
#pragma CODE_SEG DEFAULT
//CCR中的I位置0  允许中断
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 9 huoer1_interrupt(void)
{
asm ORCC #$FF;//CCR中的I位置1  不允许中断       带轮
TSCR1_TFFCA=1;// 定时器标识位快速清零
TSCR1_TEN=1;//允许定时器工作
j++;//计数变量自加1
TFLG1_C1F=1;//中断标志位置0
asm ANDCC #$EF;
}//CCR中的I位置0  允许中断}

void initPIT(void)
{
PITCFLMT_PITE=0;//关闭PIT模块                       初始化PIT
PITCE_PCE0=1;//定时器通道0使能
PITMUX_PMUX0=0;//定时器通道0使用微定时器0
PITMTLD0=100-1;//8位微定时器加载初值                                                         值需计算  40M下总线5um
PITLD0=2000-1;//16位定时器加载初值                                                                 值需计算
PITINTE_PINTE0=1;//定时器0通道的中断使能
PITCFLMT_PITE=1;//定时器的通道0使能
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void)
{
asm ORCC #$FF;//CCR中的I位置1  不允许中断            PIT中断函数
PITTF_PTF0=1;//清中断标志位   写1清除
TSCR1_TEN=0;//不允许定时器工作
i=i*85;    //主要调试对象
j=j*100;
if(i<=j)
{backward();
a=1;}
i=0;
j=0;
asm ANDCC #$EF;//CCR中的I位置0  允许中断}
#pragma CODE_SEG DEFAULT
}
void stop()      //电机停转程序   
{
    PORTA=0x00;//PORTA_PA0=0;控制使能端PORTA_PA1=0;正转停ZPORTA_PA2=0; 反转停止
  }



void forward()      //电机正转程序
  {
   PORTA=0xF3;//PORTA_PA0=1; PORTA_PA1=1ORTA_PA2=0;
   
  delay(15);   //主要调试对象
   stop();
  sign=1;
  }


void backward()     //电机反转程序
  {
   PORTA=0x05;// PORTA_PA0=1;PORTA_PA1=0;PORTA_PA2=1;
   delay(15);   //主要调试对象
   stop();
   sign=2;
   }

void initPA()
{DDRA=0xFF;}
void initPT()
{DDRT=0x00;}
  
void delay(int c)
{
   int cnt;
   int cnt1;

   for(cnt=0;cnt<2*c;cnt++)
    {

       for(cnt1=0;cnt1<625;cnt1++)
       {
           _asm NOP; _asm NOP;_asm NOP;_asm NOP;
           _asm NOP; _asm NOP;_asm NOP;_asm NOP;
           _asm NOP; _asm NOP;_asm NOP;_asm NOP;
           _asm NOP; _asm NOP;_asm NOP;_asm NOP;
           _asm NOP; _asm NOP;_asm NOP;_asm NOP;
       }

  }

}

1

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
110
威望
55
贡献
25
兑换币
35
注册时间
2013-7-3
在线时间
17 小时
毕业学校
吉林大学
2#
 楼主| 发表于 2013-7-11 19:30:26 | 只看该作者
IRQ   XIRQ是一个单刀双掷的开关     PA口接外部的驱动芯片    PT0,1输入捕捉。。。。在下接触飞思卡尔不到两周   求助大家了   谢谢
回复

使用道具 举报

22

主题

159

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3264

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

威望
1546
贡献
894
兑换币
974
注册时间
2014-2-20
在线时间
412 小时
3#
发表于 2014-4-28 21:26:45 | 只看该作者
问下楼主。 这样测速会有问题吗? 我现在也遇到了这个问题。 在纠结是打算用两个输入捕捉还是一个脉冲累加器  一个 输入捕捉。  不知道是不是都可行!!
回复

使用道具 举报

54

主题

782

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3569
QQ
威望
1896
贡献
243
兑换币
1222
注册时间
2012-11-24
在线时间
715 小时
4#
发表于 2014-4-30 09:29:05 | 只看该作者

RE: 飞思卡尔两路输入捕捉测速。。。求助大家

ゞ亂⒎㈧糟 发表于 2014-4-28 21:26
问下楼主。 这样测速会有问题吗? 我现在也遇到了这个问题。 在纠结是打算用两个输入捕捉还是一个脉冲累加器 ...

内部输入捕捉会占用中断时间
回复

使用道具 举报

22

主题

159

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3264

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

威望
1546
贡献
894
兑换币
974
注册时间
2014-2-20
在线时间
412 小时
5#
发表于 2014-4-30 14:49:22 | 只看该作者
yyyzrxh 发表于 2014-4-30 09:29
内部输入捕捉会占用中断时间

那就只能用外部计数器了吗
回复

使用道具 举报

54

主题

782

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3569
QQ
威望
1896
贡献
243
兑换币
1222
注册时间
2012-11-24
在线时间
715 小时
6#
发表于 2014-5-2 11:55:37 | 只看该作者
一个脉冲累加器,一个外部计数器
回复

使用道具 举报

13

主题

63

帖子

0

精华

高级会员

Rank: 4

积分
609
威望
322
贡献
147
兑换币
193
注册时间
2014-3-16
在线时间
70 小时
毕业学校
实验小学
7#
发表于 2014-5-2 16:38:22 | 只看该作者
本帖最后由 小蛇 于 2014-5-2 16:44 编辑
yyyzrxh 发表于 2014-5-2 11:55
一个脉冲累加器,一个外部计数器

请问一下, 你说的脉冲累加器和外部计数器分别是哪些模块?
回复

使用道具 举报

2

主题

291

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1578
QQ
威望
740
贡献
524
兑换币
501
注册时间
2013-10-30
在线时间
157 小时
8#
发表于 2014-8-16 12:14:56 | 只看该作者
不用这么复杂吧,直接用输入捕捉计算相邻两次脉冲的差值,计算间隔时间,算出速度。单片机的性能优越,占不了多少中断时间的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-29 17:25 , Processed in 0.090609 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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