智能车制作

标题: 编码器PT7口测速 [打印本页]

作者: zhiyang1989    时间: 2012-5-13 20:15
标题: 编码器PT7口测速
void PLL_Init(void)   //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1
{ CLKSEL=0x00;
  PLLCTL_PLLON=1;                    //锁相环时钟=2*16*(5+1)/(1+1)=48MHz
  REFDV=1;            //总线时钟=48/2=24MHz
  SYNR=0xC5;
  POSTDIV=0x00;
  _asm NOP;
  _asm NOP;
  _asm NOP;
  while((CRGFLG&0x08)==0);
  CLKSEL_PLLSEL=1;        //选定锁相环时钟  */
}

void PIT0_Init(void)          //定时中断初始化函数 0.1MS定时中断设置
{
    PACTL=0x50;
    PITCFLMT_PITE=0;          //定时中断通道0关
    PITCE_PCE0=1;             //定时器通道0使能
    PITMTLD0=120-1;           //8位定时器初值设定。120分频,在24MHzBusClock下,为0.2MHz。即 5us.
    PITLD0=20-1;           //16位定时器初值设定。PITTIME*0.005MS=0.1ms
    PITINTE_PINTE0=1;           //定时器中断通道0中断使能
    PITCFLMT_PITE=1;            //定时器通道0使能
}


void PA_Init(void)
  {
   PACTL=0x50;//PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT
   PACNT = 0x00;    //累加器置初值
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0_INTER()             //2十毫秒计数一次
{
    PIT0Count++;
    if(PIT0Count==200)
    {
       PIT0Count=0;
       //PACTL_PAEN=0;
       nowspeed=PACNT;                //编码器输出脉冲个数
       PACNT=0;
      PITTF_PTF0=1;//清中断标志位


我用的是PT7口测速的  测编码器的波形是好的 但是PACNT检测不到值 为什么总是0啊 求高手

作者: zsk-    时间: 2012-5-13 23:30
PITTF_PTF0=1;//清中断标志位
清标志位应该放在if上面吧   哥们
作者: zsk-    时间: 2012-5-13 23:32
#pragma CODE_SEG NON_BANKED
void interrupt 66 PIT0(void) ///////10ms
{
PITTF_PTF0=1;
pulse_count=PACNT;
PACNT=0x0000;}


另外你定时2*200ms  用得着这么长么
作者: zhiyang1989    时间: 2012-5-14 09:06
zsk- 发表于 2012-5-13 23:30
PITTF_PTF0=1;//清中断标志位
清标志位应该放在if上面吧   哥们

哦 这是手误打错了 但是主要问题应该不是这个吧 我还是没有采集到值 另外PT7口需要设成输入吗

作者: zhiyang1989    时间: 2012-5-14 09:07
zsk- 发表于 2012-5-13 23:32
#pragma CODE_SEG NON_BANKED
void interrupt 66 PIT0(void) ///////10ms
{

这不是定时了0.1ms*200=20ms么
作者: zsk-    时间: 2012-5-14 09:13
zhiyang1989 发表于 2012-5-14 09:06
哦 这是手误打错了 但是主要问题应该不是这个吧 我还是没有采集到值 另外PT7口需要设成输入吗

进中断之后应该马上清标志位,最起码不应该放在if里面吧。不需要,因为这个是TIM模块复用了PT7。顺便问一下,你用的是XS128吧
作者: zhiyang1989    时间: 2012-5-14 09:25
zsk- 发表于 2012-5-14 09:13
进中断之后应该马上清标志位,最起码不应该放在if里面吧。不需要,因为这个是TIM模块复用了PT7。顺便问一下 ...

是的 其实我的程序是清除中断标志位是放在IF外面的 再加个大括号和上面的对应起来 只是上传到这上面的时候弄错了。 我用的是xs128 为什么不需要设PT7口啊 如果要用其他PT口做输入捕捉用的话 就要设定吗
作者: zsk-    时间: 2012-5-14 09:36
XS128只有一个脉冲累加器,输入口就是PT7口(sheet data说的) 。你上面初始化过累加器,那PT7就作为脉冲累加器的输入口了。你若是想用做IC或OC,那就另做初始化了,不能同时用谢谢功能的……
作者: zhiyang1989    时间: 2012-5-14 09:45
zsk- 发表于 2012-5-14 09:36
XS128只有一个脉冲累加器,输入口就是PT7口(sheet data说的) 。你上面初始化过累加器,那PT7就作为脉冲累加器 ...

哦 我知道了 但是最后一个问题就是我现在检测到nowspeed是0啊 这个论坛有人说过他们有的只能检测到小频率的脉冲 大的就检测不到 我不知道是不是我的程序有问题 这个我调了很久了 你是怎样设定的啊 真心求指导
作者: zsk-    时间: 2012-5-14 10:04
zhiyang1989 发表于 2012-5-14 09:45
哦 我知道了 但是最后一个问题就是我现在检测到nowspeed是0啊 这个论坛有人说过他们有的只能检测到小频率 ...

我一会儿可以把我的贴给你,现在用的手机没法贴
作者: zhiyang1989    时间: 2012-5-14 13:06
zsk- 发表于 2012-5-14 10:04
我一会儿可以把我的贴给你,现在用的手机没法贴

好的 真心感谢。。。

作者: zsk-    时间: 2012-5-14 21:27
zhiyang1989 发表于 2012-5-14 13:06
好的 真心感谢。。。

void SET_PLL(void) //设置总线频率为24M
{
CLKSEL=0x00;
PLLCTL=0xe1;
SYNR=2;
REFDV=1;     //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)=2*16M*3/2=48M  
PLLCTL=0x60;
asm NOP;     
asm NOP;
asm NOP;
while((CRGFLG&0x08)==0);
CLKSEL=0x80;  //BUS Clok=pllclk/2=24M
}
void PIT_Init(void) //定时10ms中断初始化函数
{
    PITCFLMT_PITE=0;//PIT定时中断通道0关
    PITCE_PCE0=1;//定时器通道0使能
    PITMTLD0=240-1;//8位定时器初值设定。240分频即24M/240 10us
    PITMUX=0x00;
    PITLD0=1000-1;//16位定时器初值设定  1000*10us=10ms
    PITINTE_PINTE0=1;//定时器中断通道0中断使能
    PITCFLMT_PITE=1;//定时器通道0使能
}
void TIM_Init(void)//脉冲累计初始化
{
    PACTL=0x50;//下降沿触发
    PACNT=0x0000;//清0
}  
void Servo_Init(void)                   //舵机 16 位PWM 控制6050,5175,4300 : 875
{
    PWME_PWME1=0;         //disable PWM1 servo
    PWMPRCLK=0x23;     //CLKA:8 分频3M ,CLKB:总线时钟6M
    PWMCLK=0 ;      //这就是默认值//通道1 用clock A 时钟源 //24MHZ/8=3M
    PWMPOL_PPOL1=0; //先高电平
    PWMCAE=0X00;    //对齐方式默认 左对齐 都是
    PWMCTL_CON01=1; //通道01级联
    PWMPER01=30000;//60000:20ms;;;20000//舵机的频率是300Hz,10ms   
    PWMDTY01=4500;//6000左极限,3500右极限,4500中间
    PWMCNT01=0;   //写计数寄存器,会使PWMDTYx,PWMPERx 进入锁存器,同时使能通道时会从此值 
    PWME_PWME1=1; //PWM 通道1 输出
}
void Forward_Init(void) // 假定前进方向,初始化函数
{  
    PWME_PWME7=0;  //CLOCKA=3M,CLOCKB=6M
    PWME_PWME5=0;
    PWMPOL_PPOL5=1; //low electrical level first,,high electrical level first,but high level makes mc33886 disabled
    PWMPOL_PPOL7=1;
    PWMCAE=0X00; //对齐方式默认左对齐
    PWMCTL_CON45=1;
    PWMCTL_CON67=1; //16BIT连接
    PWMPER45=750;   //设置的频率是8MHZ
    PWMPER67=750; //   
    PWMDTY45=100;
    PWMDTY67=0; //占空比精度1/750
    PWMCNT45=0;
    PWME_PWME5=1;
    PWME_PWME7=1;
}
void main(void)
{
/* put your own code here */
  DisableInterrupts;
  //RTI_Init();
  SET_PLL();
  PIT_Init();  
  TIM_Init();
  Servo_Init ();
  Forward_Init();
  SciInit();
  DDRB=0xff;          //定义为输出
  ATD0DIEN=0xFFFF;
  DDR1AD0=0x00;                              
  DDRA=0x00;
  EnableInterrupts; }
      //prefinal_weight=final_weight;
  } /* loop forever */
  /* please make sure that you never leave main */
#pragma CODE_SEG NON_BANKED
void interrupt 66 PIT0(void) ///////10ms
{
  PITTF_PTF0=1;
  pulse_count=PACNT; //PT7接受脉冲
  PACNT=0;}        
#pragma CODE_SEG DEFAULT  


作者: zhiyang1989    时间: 2012-5-15 12:54
zsk- 发表于 2012-5-14 21:27
void SET_PLL(void) //设置总线频率为24M
{
CLKSEL=0x00;

我知道问题所在了 是因为我的编码器输出的波形幅度太小了导致接收不到PANCT里面的值 不过还是真心谢谢你啊 好人哪。。。。。。

作者: chenjian    时间: 2012-5-15 19:43
楼主可否把他的贴也给我发个呢
作者: zhiyang1989    时间: 2012-5-15 22:50
chenjian 发表于 2012-5-15 19:43
楼主可否把他的贴也给我发个呢

void SET_PLL(void) //设置总线频率为24M
{
CLKSEL=0x00;
PLLCTL=0xe1;
SYNR=2;
REFDV=1;     //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)=2*16M*3/2=48M  
PLLCTL=0x60;
asm NOP;     
asm NOP;
asm NOP;
while((CRGFLG&0x08)==0);
CLKSEL=0x80;  //BUS Clok=pllclk/2=24M
}
void PIT_Init(void) //定时10ms中断初始化函数
{
    PITCFLMT_PITE=0;//PIT定时中断通道0关
    PITCE_PCE0=1;//定时器通道0使能
    PITMTLD0=240-1;//8位定时器初值设定。240分频即24M/240 10us
    PITMUX=0x00;
    PITLD0=1000-1;//16位定时器初值设定  1000*10us=10ms
    PITINTE_PINTE0=1;//定时器中断通道0中断使能
    PITCFLMT_PITE=1;//定时器通道0使能
}
void TIM_Init(void)//脉冲累计初始化
{
    PACTL=0x50;//下降沿触发
    PACNT=0x0000;//清0
}  
void Servo_Init(void)                   //舵机 16 位PWM 控制6050,5175,4300 : 875
{
    PWME_PWME1=0;         //disable PWM1 servo
    PWMPRCLK=0x23;     //CLKA:8 分频3M ,CLKB:总线时钟6M
    PWMCLK=0 ;      //这就是默认值//通道1 用clock A 时钟源 //24MHZ/8=3M
    PWMPOL_PPOL1=0; //先高电平
    PWMCAE=0X00;    //对齐方式默认 左对齐 都是
    PWMCTL_CON01=1; //通道01级联
    PWMPER01=30000;//60000:20ms;;;20000//舵机的频率是300Hz,10ms   
    PWMDTY01=4500;//6000左极限,3500右极限,4500中间
    PWMCNT01=0;   //写计数寄存器,会使PWMDTYx,PWMPERx 进入锁存器,同时使能通道时会从此值 
    PWME_PWME1=1; //PWM 通道1 输出
}
void Forward_Init(void) // 假定前进方向,初始化函数
{  
    PWME_PWME7=0;  //CLOCKA=3M,CLOCKB=6M
    PWME_PWME5=0;
    PWMPOL_PPOL5=1; //low electrical level first,,high electrical level first,but high level makes mc33886 disabled
    PWMPOL_PPOL7=1;
    PWMCAE=0X00; //对齐方式默认左对齐
    PWMCTL_CON45=1;
    PWMCTL_CON67=1; //16BIT连接
    PWMPER45=750;   //设置的频率是8MHZ
    PWMPER67=750; //   
    PWMDTY45=100;
    PWMDTY67=0; //占空比精度1/750
    PWMCNT45=0;
    PWME_PWME5=1;
    PWME_PWME7=1;
}
void main(void)
{
/* put your own code here */
  DisableInterrupts;
  //RTI_Init();
  SET_PLL();
  PIT_Init();  
  TIM_Init();
  Servo_Init ();
  Forward_Init();
  SciInit();
  DDRB=0xff;          //定义为输出
  ATD0DIEN=0xFFFF;
  DDR1AD0=0x00;                              
  DDRA=0x00;
  EnableInterrupts; }
      //prefinal_weight=final_weight;
  } /* loop forever */
  /* please make sure that you never leave main */
#pragma CODE_SEG NON_BANKED
void interrupt 66 PIT0(void) ///////10ms
{
  PITTF_PTF0=1;
  pulse_count=PACNT; //PT7接受脉冲
  PACNT=0;}        
#pragma CODE_SEG DEFAULT  


作者: chenjian    时间: 2012-5-16 10:36
zhiyang1989 发表于 2012-5-15 22:50
void SET_PLL(void) //设置总线频率为24M
{
CLKSEL=0x00;

谢了
作者: chenjian    时间: 2012-5-16 10:36
谢了
作者: 林牛牛    时间: 2012-5-20 01:15
聊得不错!
作者: hjj3099    时间: 2012-5-27 23:27
zhiyang1989 发表于 2012-5-15 12:54
我知道问题所在了 是因为我的编码器输出的波形幅度太小了导致接收不到PANCT里面的值 不过还是真心谢谢你啊 ...

大神,你问题解决了嘛?
    我的PACNT有值,就是用变量读不出来。求大神赐予解决办法!!

作者: 510838570    时间: 2012-5-31 19:10
zhiyang1989 发表于 2012-5-15 12:54
我知道问题所在了 是因为我的编码器输出的波形幅度太小了导致接收不到PANCT里面的值 不过还是真心谢谢你啊 ...

你好,你的问题是怎么样解决的,我遇到和你相同的问题,在示波器能够显示,可是测量到的值都是0
作者: 952252967    时间: 2012-5-31 21:36
牛人
作者: zsk-    时间: 2012-6-2 10:40
怎么解决的啊 ????、、
作者: zhiyang1989    时间: 2012-6-5 13:29
hjj3099 发表于 2012-5-27 23:27
大神,你问题解决了嘛?
    我的PACNT有值,就是用变量读不出来。求大神赐予解决办法!! ...

有值怎么可能读不出来呢 那你怎么知道有值的??

作者: zhiyang1989    时间: 2012-6-5 13:33
510838570 发表于 2012-5-31 19:10
你好,你的问题是怎么样解决的,我遇到和你相同的问题,在示波器能够显示,可是测量到的值都是0

你可以先用函数发生器模拟一个方波 调方波幅度 看下调到什么时候能检测到值 然后接编码器 看编码器的波形幅度 是不是幅度不够... 我的就是幅度不够检测到的值为0
作者: shiyilang    时间: 2012-6-27 21:06

作者: blueskywsh    时间: 2012-9-22 14:37
路过

作者: 冰冰小鱼    时间: 2012-10-16 21:42

作者: icitydesk    时间: 2012-10-17 00:59
学习了了
作者: mxj1005071012    时间: 2013-1-1 21:56
同学你的这个问题解决了吗 我的是一样的问题 无论我定时多久 显示的速度总是0 也就是说脉冲一直为零
作者: mxj1005071012    时间: 2013-1-1 22:19
zhiyang1989 发表于 2012-5-15 12:54
我知道问题所在了 是因为我的编码器输出的波形幅度太小了导致接收不到PANCT里面的值 不过还是真心谢谢你啊 ...

求指教 和你一样的问题 我的测了峰峰值是10V以上  跟别人的差不多
作者: mxj1005071012    时间: 2013-1-1 22:22
zhiyang1989 发表于 2012-6-5 13:33
你可以先用函数发生器模拟一个方波 调方波幅度 看下调到什么时候能检测到值 然后接编码器 看编码器的波形 ...

那你怎么没解决的呢 硬件或者软件应该加什么
作者: 张路军    时间: 2013-3-10 11:12
510838570 发表于 2012-5-31 19:10
你好,你的问题是怎么样解决的,我遇到和你相同的问题,在示波器能够显示,可是测量到的值都是0

我也是一样的问题,同求啊

作者: 老干妈    时间: 2013-3-14 13:53
昨晚刚解决同样的问题,不过我的问题是初始化那边没设置好
作者: 鸡蛋灌饼    时间: 2013-3-29 15:43
PACTL=0x50;这句话是什么意思,为什么有的是0x40 ??求解
作者: 鸡蛋灌饼    时间: 2013-3-29 16:12
初始化之后怎么获得目前速度啊???
作者: 红杏爱蓝颜    时间: 2013-3-30 21:50
有可能主函数里边没有初始化吧,今儿我们仅是这种情况,,,
作者: guangzhejiaoya    时间: 2013-4-12 23:45
鸡蛋灌饼 发表于 2013-3-29 15:43
PACTL=0x50;这句话是什么意思,为什么有的是0x40 ??求解

上升沿计数,使能累加器
作者: 小布的梦    时间: 2014-1-13 21:06
:o:o看看




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2