智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2567|回复: 4
打印 上一主题 下一主题

[单片机] 轮式机器人

[复制链接]

3

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
威望
203
贡献
110
兑换币
117
注册时间
2012-12-22
在线时间
29 小时
跳转到指定楼层
1#
发表于 2013-10-10 23:51:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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秒钟采集的上升沿的数量
  }
}


附件: 您需要 登录 才可以下载或查看,没有帐号?注册

3

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
威望
203
贡献
110
兑换币
117
注册时间
2012-12-22
在线时间
29 小时
2#
 楼主| 发表于 2013-10-10 23:52:50 | 只看该作者
我也明白我主函数写的超级晕,正在努力学习用指针之类更高级的写法!
回复

使用道具 举报

9

主题

161

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2881

优秀会员奖章活跃会员奖章在线王奖章

威望
1361
贡献
804
兑换币
904
注册时间
2012-12-9
在线时间
358 小时
3#
发表于 2013-10-12 00:02:42 | 只看该作者
其实 你可以先测一下 编码器有没有信号  ,  编码器信号线要有上拉
回复

使用道具 举报

3

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
威望
203
贡献
110
兑换币
117
注册时间
2012-12-22
在线时间
29 小时
4#
 楼主| 发表于 2013-10-13 20:31:14 | 只看该作者
破风浪挂云帆 发表于 2013-10-12 00:02
其实 你可以先测一下 编码器有没有信号  ,  编码器信号线要有上拉

嗯嗯嗯  刚刚测试成功了  谢谢啊  请问要用上PID闭环控制我现在应该学什么呢?

回复

使用道具 举报

3

主题

16

帖子

0

精华

高级会员

Rank: 4

积分
534
威望
270
贡献
164
兑换币
160
注册时间
2016-3-28
在线时间
50 小时
毕业学校
安徽
5#
发表于 2016-5-7 15:53:22 | 只看该作者
确定这是你自己写的?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-5 19:44 , Processed in 0.048648 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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