软件编程实现

2021-12-16  本文已影响0人  lxr_

此程序实现串口接收一个距离值(单位为cm),滑台移动相应的距离,即通过串口控制滑台。

端口定义

//**************滑台控制*********************
int PUL=5;                //电机驱动脉冲控制端口
int DIR=6;                //电机运行方向控制端口
bool DIR_STATE=LOW;       //电机运行方向的状态

int STOP=4;               //接近传感器检测端口

float distance;           //串口接收的距离值,单位为cm

PUL端口的脉冲

周期frequence越小,电机转速越快,但经过测试,并不是所有的速度都能达到,比如细分设置为800时,当周期设为几个微秒时,电机的转速达不到,可能就不会转,可以自己测试。
注:(这里不要被代码里的frequence误导,其实是周期,而不是frequence的中文意思频率,两者是倒数关系)

//控制脉冲频率
void OnePulse(unsigned int frequence)
{
  digitalWrite(PUL,LOW);
  delayMicroseconds(frequence/2);
  digitalWrite(PUL,HIGH);
  delayMicroseconds(frequence);
  digitalWrite(PUL,LOW);
  delayMicroseconds(frequence/2);
}

上面的程序在PUL端口产生的脉冲如下图所示,周期为2frequence*。

脉冲

控制脉冲数量

//脉冲数
void PulseNum(unsigned int num)
{
  for(unsigned int i=num;i>0;i--)
  {
    if(digitalRead(STOP)==LOW)
    {
      return;
    }
    OnePulse(500);
  }
}

检测到STOP端口,即限位开关触发时,此函数退出,即不给PUL提供脉冲,电机停止旋转,保护滑台。

初始化函数

void setup() {

  pinMode(PUL,OUTPUT);          //设置端口模式
  pinMode(DIR,OUTPUT);
  pinMode(STOP,INPUT);

  digitalWrite(DIR,DIR_STATE);  //方向端口DIR初始化

  Serial.begin(115200);         //串口初始化

  while(Serial.read()>0);       //串口缓存清空

  //PulseNum(5000);             //旋转一圈
}

由于本人设置的5000细分,所以旋转一圈需要5000个脉冲

void loop() {

  while(Serial.available())           //串口是否有数据
  {
    distance=Serial.parseFloat();     //从串口解析距离数据
    delay(3);
    if(distance!=0)
    {
      Serial.println(distance);

      //根据接收的distance(单位为cm)计算脉冲数,5000细分滑台移动1mm需要40个脉冲
      int num=abs(distance)*10*40;
      Serial.println(num);
      if(distance<0)
      {
        DIR_STATE=!DIR_STATE;         //电机反向运行
        digitalWrite(DIR,DIR_STATE);  //DIR端口反向
      }
      PulseNum(num);                  //电机开始运行,滑台开始移动
    }

  }
}

对上面的程序解释:由于我的滑台使用的同步带,同步轮旋转一周滑台移动12.5cm,也就是同步轮的直径接近为4cm。
而在细分5000的情况下,电机旋转一周,也就是同步轮旋转一周需要5000个脉冲,那么滑台移动1mm需要5000/125=40个脉冲
故脉冲数=distancex10x30

上一篇 下一篇

猜你喜欢

热点阅读