智能车制作

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

作者: 智能.卓越    时间: 2013-10-31 21:08
标题: 编码器测速问题
这是一段卖家给的测速程序,试了好多次都是没有结果,求大神帮我看看给点建议,我不太会改,只能勉强看懂。
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define PUPAE 0
/*void 1(unsigned int m)
{
unsigned char base=0xff;
for(;m;m--)
{
      for(base=0xff;base;base--);
       }
    }*/
   
volatile int back_speed_left = 0,back_speed_right = 0 ;   
   
void intchu()
{
     DDRA = 0x00;  //输入
     PUCR|=(1<<PUPAE);
     DDRB |= 0X01 ;//输出
     
     PORTB &=0XFE;
  
     
   
}
void inticlock()
{                    //倍到40 正常16/2
     SYNR=0x44;
     REFDV=0x81;
     POSTDIV=0x00;
     while(CRGFLG_LOCK!=1);
     CLKSEL_PLLSEL=1;
}  
//串口初始化
void SCIInt(void){         
    char temp;
    //SCI0BDH = 0x01;
    //SCI0BDL = 0x05;
   
    SCI0BDL = 0x16;//设置波特率为115200
    SCI0BDH = 0x00;
    SCI0CR1_M = 0;  //数据位8位 停止位一位
    SCI0CR1_PE = 0;  //无奇偶校验
    temp = SCI0DRL;   //把寄存器清空,准备发数据到上位机
    temp = SCI0DRH;
    //SCI0CR2 = 0x2c;  //发送允许
    SCI0CR2 = 0x2c;     //两个一起发 发送允许 接收中断允许  
}
     
void send(uchar a)
{
     while(!SCI0SR1_TDRE);
     SCI0DRL=a;
     SCI0DRH=0x00;
}     
     
void sendInt(int num)
{
     char dat_h,dat_l;
     dat_l=(uchar)(num);//低字节直接赋值 高位舍去
     dat_h=(uchar)(num>>8);  //拆分高字节
    send(dat_h);
    send(dat_l);
}
     
         
/* 初始化计数器模块(TIM - Timer Module) *
* PT7:用于测速(捕捉脉冲的上升沿)      */

void Init_TIM(void)
{
    DDRT&=~(1<<7);
    PERT|=(1<<7);//编码器脉冲累加器口为输入,上拉有效。其他口没作用。

   
    PACTL = 0x40;     // 使能累加器
    PACNT = 0x0000;   // 累加器清零
}

/*void Init_CD4520(void)
{
   
   PT0AD0 = 0;
   ATD0DIEN=0xff00;  //ATD输入使能
   DDR0AD0 = 0x00;         //用AD复用的IO口高八位  设置为输入
   DDR1AD0_DDR1AD06 = 1; //
   PT1AD0_PT1AD06 = 1;
  
   asm(nop);
   asm(nop);

   PT1AD0_PT1AD06 = 0;
   asm(nop);
   asm(nop);
} */
void Init_CD4520(void)
{
   PORTB |= 0x01;
   asm(nop);
   asm(nop);
   asm(nop);
   asm(nop);
   asm(nop);
   asm(nop);
   asm(nop);
   asm(nop);
   PORTB &=0XFE;
}

// 时钟模块 输出比较。。。。
void intTime_OUTPUT(void){
    TIOS_IOS1 = 1;   //选择输出比较方向为output
    //TCTL4_EDG1B = 0 ;   //选择扑捉形式  上升沿
    //TCTL4_EDG1A = 1 ;
    TSCR2_PR2 = 0 ;       //预分频到5兆
    TSCR2_PR1 = 1 ;
    TSCR2_PR0 = 1 ;
    TC1 = 25000;          //要比较的数
    TIE_C1I = 1;        //时钟使能
    TSCR1_TEN = 1 ;     //整个时钟使能
}


     
void main(void) {
      intchu();
      inticlock();
      SCIInt();
      Init_TIM();
      Init_CD4520();
      intTime_OUTPUT();
      EnableInterrupts;
  for(;;) {
  
  }
}
volatile int count = 0;
#pragma CODE_SEG __NEAR_SEG NON_BANKED
  #pragma TRAP_PROC
  void Interrupts()
  {
       TFLG1_C1F=1;//接受中断信号
       TC1+=25000;
       count++;
       if(count >= 500)
       {
           count=0;
           back_speed_left = PORTA;
           back_speed_right = PACNT;         
           sendInt(back_speed_left);
           sendInt(back_speed_right);
           
           PORTB |= 0x01;
           asm(nop);
           asm(nop);
           asm(nop);
           asm(nop);
           asm(nop);
           asm(nop);
           asm(nop);
           asm(nop);
           PORTB &=0XFE;
   
           
           PACNT = 0;     
       }
  }
#pragma CODE_SEG DEFAULT  

作者: 飞鸿印雪    时间: 2013-10-31 21:36
自己写吧  不难的
作者: 天河之外    时间: 2013-12-19 12:28

作者: moxiaoran    时间: 2014-1-12 18:23

作者: 小布的梦    时间: 2014-1-12 22:17
:lol:lol:lol:lol:lol
作者: jamesZB    时间: 2014-3-29 10:32
你的cd4520在哪买的,几个引脚?


作者: 思源    时间: 2014-7-8 01:23
CD4520的程序块中,没有对芯片进行使能。
void Init_CD4520(void)
{
   //PORTA = 0xff;
   //DDRA = 0x00;  //输入//***********************加上也行一样PORTA = 0xff;DDRA = 0x00;
   DDRE_DDRE3 = 1;
   PORTE_PE3= 1;
   asm(nop);
   asm(nop);
   
   PORTE_PE3= 0;
   asm(nop);
   asm(nop);
   
}




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