此程序实现串口接收一个距离值(单位为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
网友评论