微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 采用米尔实现三坐标平台控制板(结项)

采用米尔实现三坐标平台控制板(结项)

时间:10-02 整理:3721RD 点击:

采用米尔实现三坐标平台

       米尔的板子试用已经挺久了,本来是想做个3D打印机,但是现有的直线滑台精度达不到,也是自己现在自由时间太少,所以就做了个三坐标直线滑台。也是通过这次试用感觉自己差得太多,所以现在开始还是要好好充充电。

      三坐标平台一共采用的是5个步进电机的直线导轨,其中X、Y轴采用的是两个电机,Z轴采用一个步进电机。连接示意图如下图所示

      

      实物图如下图所示。


       控制界面采用的是用Qt编的界面。界面有电源开关、三个轴的速度控制滑条、位置控制滑条,各个滑条右边是当前值的显示。如下图所示。

         

      整个程序的结构如下图所示,采用米尔官方的驱动,直接通过对驱动的操作进行打包到GPIO内,并用motor类包含motor的所有操作,在MotorControl内进行电机的建立以及控制逻辑的实现。

        

      电源开关power on的时候将下面的各个滑条使能,而关闭的时候则取消使能。

  1. void MotorControl::ChangePower()
  2. {
  3.         int speed_x,speed_y,speed_z;
  4.         int position_x,position_y,position_z;
  5.         if(powerflag==0)
  6.         {
  7.                 speed_x = motor_speed_x->value();
  8.                 speed_y = motor_speed_y->value();
  9.                 speed_z = motor_speed_z->value();
  10.                 position_x = motor_position_x->value();
  11.                 position_y = motor_position_y->value();
  12.                 position_z = motor_position_z->value();
  13.                 label_motor_speed_x->setText(QString::number(speed_x));
  14.                 label_motor_speed_y->setText(QString::number(speed_y));
  15.                 label_motor_speed_z->setText(QString::number(speed_z));
  16.                 label_motor_positon_x->setText(QString::number(position_x));
  17.                 label_motor_positon_y->setText(QString::number(position_y));
  18.                 label_motor_positon_z->setText(QString::number(position_z));
  19.                 powerflag = 1;
  20.                 pushButton_power->setText("power OFF");
  21.                 motor_speed_x->setEnabled(true);
  22.                 motor_speed_y->setEnabled(true);
  23.                 motor_speed_z->setEnabled(true);
  24.                 motor_position_x->setEnabled(true);
  25.                 motor_position_y->setEnabled(true);
  26.                 motor_position_z->setEnabled(true);
  27.                 motor_x_1->TurnOn(speed_x,position_x);
  28.                 motor_x_2->TurnOn(speed_x,position_x);
  29.                 motor_y_1->TurnOn(speed_y,position_y);
  30.                 motor_y_2->TurnOn(speed_y,position_y);
  31.                 motor_z_0->TurnOn(speed_z,position_z);
  32.         }else{
  33.                 powerflag = 0;
  34.                 pushButton_power->setText("power ON");
  35.                 motor_speed_x->setEnabled(false);
  36.                 motor_speed_y->setEnabled(false);
  37.                 motor_speed_z->setEnabled(false);
  38.                 motor_position_x->setEnabled(false);
  39.                 motor_position_y->setEnabled(false);
  40.                 motor_position_z->setEnabled(false);
  41.                 motor_x_1->TurnOff();
  42.                 motor_x_2->TurnOff();
  43.                 motor_y_1->TurnOff();
  44.                 motor_y_2->TurnOff();
  45.                 motor_z_0->TurnOff();
  46.         }
  47.         qDebug() 0){
  48.             timer = 150/speeds; //单位是毫秒
  49.         }else
  50.                 timer = 0;
  51.         qDebug() 0)
  52.              statetimer->start(timer);
  53.         else
  54.              statetimer->stop();            
  55. }

复制代码

       位置滑条总共路程为100,首先将其转换为step_position,即是步进电机从中间位置到目标位置的转换步数。而step变量保存步进电机实际的步进数。当step_position比step大时,正向旋转,而小时反向旋转。

  1. void Motor::GeneratePulse()
  2. {
  3.        qDebug() step)
  4.         {
  5.            if(direction==0)
  6.                  ChangeDirection(1);
  7.         }
  8.         else
  9.         {
  10.            if(direction==1)
  11.                  ChangeDirection(0);
  12.         }
  13.    
  14.         if(powerflag==1)
  15.         {
  16.                 if(pulse_flag==0)
  17.                 {
  18.                         pulse_flag = 1;
  19.                         value_GPIO(motorpulse_x,motorpulse_y,GPIO_HIGH);  //脉冲引脚设置为高电平
  20.                 }else{
  21.                         pulse_flag = 0;
  22.                         value_GPIO(motorpulse_x,motorpulse_y,GPIO_LOW);  //脉冲引脚设置为高电平
  23.                 }
  24.                 if(pulse_flag==0)
  25.                 {
  26.                         pulse_flag = 1;
  27.                         value_GPIO(motorpulse_x,motorpulse_y,GPIO_HIGH);  //脉冲引脚设置为高电平
  28.                 }else{
  29.                         pulse_flag = 0;
  30.                         value_GPIO(motorpulse_x,motorpulse_y,GPIO_LOW);  //脉冲引脚设置为高电平
  31.                 }
  32.         }
  33.         if(direction==1)
  34.           step = step + 1;
  35.         else
  36.           step = step -1;
  37. }

复制代码

     总的来说,用米尔的这块板子,感觉还是很棒的。从刚开始拿到的时候就被Rico Board的PCB的布局以及走线给震撼到了。自己也是画过PCB的,知道能把板子做到这么紧凑、规整得有多深的功底,这应该是我见过的最厉害的了,当然也可能是我见识少。米尔给的资料还是挺全的,但是也有一些小问题,包括启动的问题,Qt开发环境配置的一些问题,应该是编译的时候的问题,但是整体来讲还是很棒的。也是自己能力有限,以及时间最近挺忙,不能玩的更深入一点,所以光是看着挺着急,下面得好好充点电,学学Linux驱动去,感觉米尔这块板子是很好的学习平台。而将其作为工业控制入门或者前期验证平台也是一个很棒的选择,能够快速的将前期的想法进行验证。采用Ti的AM4378芯片,增强了 3D 图形加速功能,可实现丰富的图形用户界面。TI的Cortex系列的工业级芯片的相当长的生命周期,(像现在A8还一直屹立不倒),用这块板子也能起到快速验证这片芯片的作用,而参考价值也是很高,。


47.62 KB, 下载次数: 2

看起来还不错哦!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top