中级会员
- 积分
- 371
- 威望
- 203
- 贡献
- 110
- 兑换币
- 117
- 注册时间
- 2012-12-22
- 在线时间
- 29 小时
|
1贡献
大二开始做轮式机器人,用一块xs128控制一个六驱的底盘加上一个机械手,现在想先做成类似飞思卡尔智能车那样的系统。底盘装了两个AB相编码器(中间两个轮子一边一个),我做到测速部分就卡住了。因为一直测不到脉冲,我先实验一个编码器。除编码器电源线外,我把其中一根信号线接PT7,然后用脉冲累加来计数,就是一直测不到。因为一个人做而且投了好多生活费,所以只能来网上求指点,不知道是编码器的问题还是我的程序问题,希望能有一个方向,谢谢各位了!
这部分是我的程序(跪求TIM设置啊),因为刚开始学写所以很粗糙,如果方便请指点一下我程序中是不是TCNT的寄存器赋值出问题?
/*---------------------------------------------------------*/
/************************************************************
************************************************************/
/*---------------------------------------------------------*/
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
unsigned int data1,data2;
unsigned int pulsenum;
unsigned int i;
#define A1 PTIH_PTIH1 //控制行走部分
#define A2 PTIH_PTIH2
#define A3 PTIH_PTIH3
#define A4 PTIH_PTIH4
/*************************************************************/
/* 初始化锁相环 可以不用看 */
/*************************************************************/
void INIT_PLL(void)
{
CLKSEL &= 0x7f; //set OSCCLK as sysclk
PLLCTL &= 0x8F; //Disable PLL circuit
CRGINT &= 0xDF;
#if(BUS_CLOCK == 40000000)
SYNR = 0x44;
#elif(BUS_CLOCK == 32000000)
SYNR = 0x43;
#elif(BUS_CLOCK == 24000000)
SYNR = 0x42;
#endif
REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
PLLCTL =PLLCTL|0x70; //Enable PLL circuit
asm NOP;
asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK is Locked already
CLKSEL |= 0x80; //set PLLCLK as sysclk
}
/*************************************************************/
/* 初始化PWM 定义一个速度 可以不用看 */
/*************************************************************/
void init_pwm(void)
{
PWMCTL_CON01= 1; //通道01为16位的PWM
PWMPOL_PPOL1= 1; //通道的极性为高电平有效
PWMPRCLK = 0x22; //A时钟和B时钟的分频系数为4,频率为8MHz
PWMSCLA = 1; //SA时钟频率为4MHz
PWMSCLB = 1; //SB时钟频率为4MHz
PWMCLK = 0xa0; //45用SB时钟作为时钟源,01和23用A,B时钟
PWMCAE = 0x00; //脉冲模式为左对齐模式
PWMPER01 = 40000; //周期10ms
PWMDTY01 = 22000; //通道01的占空比设置
PWMCTL_CON23= 1; //通道45为16位的PWM
PWMPOL_PPOL3= 1; //通道的极性为高电平有效
PWMPRCLK = 0x22; //A时钟和B时钟的分频系数为4,频率为8MHz
PWMSCLA = 1; //SA时钟频率为4MHz
PWMSCLB = 1; //SB时钟频率为4MHz
PWMCLK = 0xa0; //45用SB 时钟作为时钟源
PWMCAE = 0x00; //脉冲模式为左对齐模式
PWMPER23 = 40000; //周期10ms
PWMDTY23 = 22000;
PWME_PWME1=1;
PWME_PWME3=1;
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void initialize_ect(void){
TSCR1_TFFCA = 1; // 定时器标志位快速清除
TSCR1_TEN = 1; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
TIOS = 0x00; //IOC7必须设置为输入,否则无法捕捉
//TCTL1 = 0x00; // 后四个通道设置为定时器与输出引脚断开
//TCTL2 = 0x00; // 前四个通道设置为定时器与输出引脚断开
TCTL4 = 0x03;
TIE = 0x00; // 禁止所有通道定时中断
TSCR2 = 0x07; // 预分频系数pr2-pr0:111,,时钟周期为4us,
TFLG1 = 0xff; // 清除各IC/OC中断标志位
TFLG2 = 0xff; // 清除自由定时器中断标志位
}
/*************************************************************/
/* 初始化累加器 */
/*************************************************************/
void INIT_PAI(void)
{
PACTL = 0x50; //始能脉冲累加器,累加上升沿
}
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
DisableInterrupts;
INIT_PLL();
init_pwm();
INIT_PAI();
initialize_ect();
LEDCPU_dir = 1;
EnableInterrupts;
LEDCPU = 0;
DDRH=0xff;
PTH=0x05;//0x0a :前进;0x12:左转;0x14:后退;0x0c:右转
TFLG1_C0F = 1;
TC0 = TCNT+62500; //时间间隔为0.25s
for(;;)
{
for(i=0;i<4;i++) //延时1秒
{
while(TFLG1_C0F == 0);
TFLG1_C0F = 1;
TC0 = TCNT+62500;
}
data1 = data2;
data2 = PACNT;
pulsenum = data2-data1; //计算1秒钟采集的上升沿的数量
}
}
|
附件: 您需要 登录 才可以下载或查看,没有帐号?注册
|