智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 11609|回复: 16
打印 上一主题 下一主题

编码器测速程序,PT7口一直测不到脉冲

  [复制链接]

1

主题

39

帖子

0

精华

高级会员

Rank: 4

积分
539
威望
363
贡献
58
兑换币
0
注册时间
2010-11-1
在线时间
59 小时
跳转到指定楼层
1#
发表于 2011-11-26 08:44:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一个编码器测速的程序,可是在PT7口一直测不到脉冲,单步调试程序不进入中断那部分,不知道怎么回事。各位大侠帮忙指教一下。

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include<MC9S12XS128.h>
word num = 0;//脉冲值
uchar flag = 0,ch;
int a;
//总线超频到20M
void Init_pll(void)
{
    CLKSEL = 0X00;                                                      /* disengage PLL to system      */
    PLLCTL_PLLON = 1;                                                   /* turn on PLL                  */
    SYNR = 4;
    REFDV=1 ;                                                           /* pllclock=2*osc*(1+SYNR)/(1+R */
    _asm(nop);                                                          /* BUS CLOCK=20M                */
    _asm(nop);
    while(!(CRGFLG_LOCK == 1));                                         /* when pll is steady ,then use */
    CLKSEL_PLLSEL = 1;                                                  /* engage PLL to system;        */
}



      
//PT0口用来定时400ms   每1.6s读取一次脉冲值
void PIT_init() {
  
          PITCFLMT_PITE = 0;//禁止PIT
     PITCE_PCE0 = 1;//允许通道0
        PITMUX_PMUX0 = 0;
           
      PITMTLD0=199;   //400ms定时   
      PITLD0=40000-1;
      PITINTE=0X01;
      PITTF_PTF0 = 1;
}
//PT7口用来接收编码器脉冲
void PA_init() {
  
PACTL=0X50;//开启脉冲累加功能,上升沿计数,输入时钟为PA预分频时钟脉冲累加溢出中断使能,输入中断使能
PACNT=0x0000;//清零
TCTL3=0X40;
TIE=0X00;
TIOS=0X00;
PAFLG_PAIF = 1;
PACTL_PAEN = 1;
}


void Init_PWMout(void)
{
    DDRB = 0XFF;
    PORTB = 0X05;
    PWME     = 0x00;                                                    /* 禁止PWM输出                  */
    PWMCTL   = 0x70;                                                    /* 01,23,45通道级联           */
    PWMPOL   = 0x0a;                                                    /* 通道01的输出极性为正极性,23 */
    PWMCAE   = 0x11;                                                    /* 全部通道是中心对齐           */
    PWMCLK   = 0x00;                                                    /* 时钟源为:CLOCKA,CLOCKB     */
    PWMPRCLK = 0x40;                                                    /* 时钟CLOCKA不分频40MHZ,CLOCK */
    PWMPER01 = 500;                                                   /* 电机速度控制 周期 250us F=4K */
    PWMDTY01 = 200;                                                    /* 默认占空比                   */
  //  PWMPER23 = 50000;                                                   /* 舵机方向控制 周期20ms F=50HZ */
  //  PWMDTY23 = 3790;                                                    /* 脉宽控制-调占空比            */
    PWME     = 0x02;                                                    /* 使能PWM输出                  */
}     
     
void main(void) {
     a = 5;
     Init_pll();
     PIT_init();
     Init_PWMout();
     PA_init();
     
  
EnableInterrupts;

  for(;;) {
  
   
  } /* loop forever */
  /* please make sure that you never leave main */
}
#pragma CODE_SEG NON_BANKED
void interrupt 66 PIT0() {
   
   flag++;
   if(flag==4) {
   
   flag=0;
   num=PACNT;//读取脉冲值
  
  
   PACNT=0X0000;//脉冲值清零
   }
   
  PITTF=0X01;
}
#pragma CODE_SEG DEFAULT

4

主题

400

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1646
QQ
威望
989
贡献
361
兑换币
162
注册时间
2012-1-31
在线时间
148 小时
2#
发表于 2012-2-10 22:11:42 | 只看该作者
错误好多啊
回复 支持 反对

使用道具 举报

32

主题

782

帖子

1

精华

常驻嘉宾

帮主

Rank: 8Rank: 8

积分
3869
威望
2079
贡献
698
兑换币
86
注册时间
2010-10-22
在线时间
547 小时
3#
发表于 2012-2-11 02:37:23 | 只看该作者
帮顶
回复 支持 反对

使用道具 举报

1

主题

173

帖子

0

精华

高级会员

Rank: 4

积分
967
威望
667
贡献
128
兑换币
0
注册时间
2011-9-29
在线时间
86 小时
4#
发表于 2012-2-11 22:03:32 | 只看该作者
回复 支持 反对

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
869
QQ
威望
676
贡献
107
兑换币
0
注册时间
2011-10-18
在线时间
43 小时
5#
发表于 2012-2-13 15:25:25 | 只看该作者
回复 支持 反对

使用道具 举报

7

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
698
威望
406
贡献
196
兑换币
10
注册时间
2012-2-23
在线时间
48 小时
毕业学校
湘潭大学
6#
发表于 2012-2-26 15:10:45 | 只看该作者
写出来已经很不错了,让我看看哈
回复 支持 反对

使用道具 举报

7

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
698
威望
406
贡献
196
兑换币
10
注册时间
2012-2-23
在线时间
48 小时
毕业学校
湘潭大学
7#
发表于 2012-2-26 21:34:24 | 只看该作者
我怎么觉得void Init_PWMout(void)
{
    DDRB = 0XFF;
    PORTB = 0X05;
    PWME     = 0x00;                                                    /* 禁止PWM输出                  */
    PWMCTL   = 0x70;                                                    /* 01,23,45通道级联           */
    PWMPOL   = 0x0a;                                                    /* 通道01的输出极性为正极性,23 */
    PWMCAE   = 0x11;                                                    /* 全部通道是中心对齐           */
    PWMCLK   = 0x00;                                                    /* 时钟源为:CLOCKA,CLOCKB     */
    PWMPRCLK = 0x40;                                                    /* 时钟CLOCKA不分频40MHZ,CLOCK */
    PWMPER01 = 500;                                                   /* 电机速度控制 周期 250us F=4K */
    PWMDTY01 = 200;                                                    /* 默认占空比                   */
  //  PWMPER23 = 50000;                                                   /* 舵机方向控制 周期20ms F=50HZ */
  //  PWMDTY23 = 3790;                                                    /* 脉宽控制-调占空比            */
    PWME     = 0x02;                                                    /* 使能PWM输出                  */
}     
     
很乱呢
回复 支持 反对

使用道具 举报

2

主题

39

帖子

0

精华

高级会员

Rank: 4

积分
532
威望
340
贡献
94
兑换币
6
注册时间
2012-3-3
在线时间
49 小时
毕业学校
西南石油大学
8#
发表于 2012-3-10 16:39:08 | 只看该作者
是不是先关中断哦。这有个我在别人那儿看的例子你看看,
void PAInit(void)
{
    DisableInterrupts;    //禁止中断   
   
    TSCR1_TFFCA=1;    //快速清除flag:PAOVF PAIF
   
/*                DATASHEET P472
*           To operate the 16-bit pulse accumulator independently of input capture or output compare 7 and 0
*                respectively the user must set the corresponding bits IOSx = 1, OMx = 0 and OLx = 0. OC7M7 in the
*                OC7M register must also be cleared.
*/
    TIOS_IOS7=1;                   //单独使用16位脉冲累加器
    OC7M_OC7M7=0;;             //注意此时必须令IOS7=1,OC7M7=0,OM7=0,OL7=0
    TCTL1_OM7=0;
    TCTL1_OL7=0;
   
    PACTL_PAMOD=0;               //事件计数方式
    //PACTL_PEDGE=1;             //PT7引脚上的出现上升沿时脉冲累加器计数器加1
    //PACTL_PAOVI=1;             //允许脉冲累加器产生溢出时引发中断
    //PACTL_PAI=1;                //允许PT7引脚上出现上升沿时引发中断
    PACTL_PAEN=1;                //启动脉冲累加器A
    PACNT  =  0x0000;
     
}
回复 支持 反对

使用道具 举报

0

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
威望
231
贡献
59
兑换币
0
注册时间
2012-3-1
在线时间
32 小时
毕业学校
理工大学
9#
发表于 2012-4-11 20:34:57 | 只看该作者
好复杂哎!!!
回复 支持 反对

使用道具 举报

12

主题

97

帖子

0

精华

高级会员

Rank: 4

积分
989
威望
554
贡献
241
兑换币
51
注册时间
2012-2-24
在线时间
97 小时
10#
发表于 2012-5-2 22:39:10 | 只看该作者
中断没使能
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 06:36 , Processed in 0.319629 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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