Micro DC Motor with Encoder-SJ02 微型直流带编码器L型减速电机

            目录

1 简介
2 产品参数
3 引脚说明
4 使用教程

4.1 准备
4.2 接线图
4.3 样例代码
4.4 运行现象

简介
该产品是DFRobot专为机器人DIY爱好者设计的一款带AB两相输出编码器的微型直流减速电机。该电机带有一个齿轮齿数比为120:1的变速箱和一个带AB两相输出编码器。编码器电机轴的分辨率为每转16,变速箱的输出轴分辨率为每转1920,同时配合Arduino控制器和电机驱动器或者RoMeo就能够完成检测电机转动方向、闭环PID、测速、PWM调速等。搭配我们的小车平台,你可以实行小车的精确控制。特别是在一些实验和竞赛中,精确的运行控制是非常必要的,是制胜的关键。
编码器原理概述:本产品采用霍尔传感器检测的方式,在电机尾部安装N,S磁极呈扇形依次均匀分布的圆形磁环,当磁极N经过霍尔传感器正面时,编码器输出低电平;当磁极S经过霍尔传感器正面时,编码器输出高电平,采用两个霍尔传感器,不但可以提高编码器的采样精度,还可以检测出,电机转动方向是正转还是反转。

产品参数
1.编码器电压:4.5~7.5V
1.电机工作电压: 3~7.5V(额定电压6V)
3.额定力矩:0.2kgf.cm
4.操作环境温度:-10~+60℃
5.储存温度:-30~+85℃
6.电机类型:130
7.电机最大无负载电流(3V): 140mA
8.电机最大无负载电流(6V): 170mA
9.无负载转速(3V):90rpm
10.无负载转速(6V):160rpm
10.最大输出力矩:0.8kgf.cm
10.无负载转速(6V):最大堵转电流:2.8A
10.齿轮齿数比:1:120
10.无负载转速(6V):160rpm

引脚说明

FIT0458.png

标号
名称
功能描述

1
电机电源引脚+
3-7.5V,额定电压6V

2
电机电源引脚-

3
编码器A相输出
随电机转速的变化输出频率变化的方波

4
编码器B相输出
随电机转速的变化输出频率变化的方波

5
编码器电源正极
4.5-7.5V

6
编码器电源GND

使用教程
准备
硬件
UNO x1
直流电源 x1

软件
Arduino IDE 点击下载Arduino IDE

接线图
FIT0458+UNO.png
====Interrupt Port with Different Board====
Notcie:attachInterrupt()

Interrupt.png
举个例子,当你想在UNO上面使用中断管脚0(中断0),你可以连接2号数字管脚(D2);使用中断管脚1(中断1),你可以连接2号数字管脚(D3)
详细情况请查看 http://arduino.cc/en/Reference/AttachInterrupt

样例代码

//The sample code for driving one way motor encoder
const byte encoder0pinA = 2;//A pin -> the interrupt pin 0
const byte encoder0pinB = 3;//B pin -> the digital pin 3
byte encoder0PinALast;
int duration;//the number of the pulses
boolean Direction;//the rotation direction

void setup()
{
Serial.begin(57600);//Initialize the serial port
EncoderInit();//Initialize the module
}

void loop()
{
Serial.print("Pulse:");
Serial.println(duration);
duration = 0;
delay(100);
}

void EncoderInit()
{
Direction = true;//default -> Forward
pinMode(encoder0pinB,INPUT);
attachInterrupt(0, wheelSpeed, CHANGE);
}

void wheelSpeed()
{
int Lstate = digitalRead(encoder0pinA);
if((encoder0PinALast == LOW) && Lstate==HIGH)
{
int val = digitalRead(encoder0pinB);
if(val == LOW && Direction)
{
Direction = false; //Reverse
}
else if(val == HIGH && !Direction)
{
Direction = true; //Forward
}
}
encoder0PinALast = Lstate;

if(!Direction) duration++;
else duration--;
}

示例代码2(PID控制):通过L298P直流电机驱动板驱动直流电机,PID算法控制电机的转速 (工程实际中,应用最为广泛调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制主要技术之一。)

//The sample code for driving one way motor encoder
#include <PID_v1.h>
const byte encoder0pinA = 2;//A pin -> the interrupt pin 0
const byte encoder0pinB = 3;//B pin -> the digital pin 3
int E_left =5; //L298P直流电机驱动板的使能端口连接到数字接口5
int M_left =4; //L298P直流电机驱动板的转向端口连接到数字接口4
byte encoder0PinALast;
double duration,abs_duration;//the number of the pulses
boolean Direction;//the rotation direction
boolean result;

double val_output;//用于提供给电机PWM功率值。
double Setpoint;
double Kp=0.6, Ki=5, Kd=0;
PID myPID(&abs_duration, &val_output, &Setpoint, Kp, Ki, Kd, DIRECT);

void setup()
{
Serial.begin(9600);//Initialize the serial port
pinMode(M_left, OUTPUT); //L298P直流电机驱动板的控制端口设置为输出模式
pinMode(E_left, OUTPUT);
Setpoint =80; //设置PID的输出值
myPID.SetMode(AUTOMATIC);//设置PID为自动模式
myPID.SetSampleTime(100);//设置PID采样频率为100ms
EncoderInit();//Initialize the module
}

void loop()
{
advance();//电机正转
abs_duration=abs(duration);
result=myPID.Compute();//PID转换完成返回值为1
if(result)
{
Serial.print("Pluse: ");
Serial.println(duration);
duration = 0; //计数清零等待下次计数
}

}

void EncoderInit()
{
Direction = true;//default -> Forward
pinMode(encoder0pinB,INPUT);
attachInterrupt(0, wheelSpeed, CHANGE);
}

void wheelSpeed()
{
int Lstate = digitalRead(encoder0pinA);
if((encoder0PinALast == LOW) && Lstate==HIGH)
{
int val = digitalRead(encoder0pinB);
if(val == LOW && Direction)
{
Direction = false; //Reverse
}
else if(val == HIGH && !Direction)
{
Direction = true; //Forward
}
}
encoder0PinALast = Lstate;

if(!Direction) duration++;
else duration--;

}
void advance()//电机正转
{
digitalWrite(M_left,LOW);
analogWrite(E_left,val_output);
}
void back()//电机反转
{
digitalWrite(M_left,HIGH);
analogWrite(E_left,val_output);
}

void Stop()//电机停止
{
digitalWrite(E_left, LOW);
}

运行现象
代码1运行现象:
说明:数据不断的从串口输出,当电机正转时,输出的数值>0, 电机反向转时,输出数字<0。并且电机速度越快,数字的绝对值越大,反之越小。

FIT04500458 data out+.png FIT04500458 data out-.png
代码2运行现象:
因为程序设定的PID值为80,所以电机会稳定转速在80左右,当外界的力量(比如电机的驱动电压变化,电机受到的阻力变大等)迫使转速改变时,程序会通过PWM调节,使转速稳定在80左右。比如增大电机驱动电压,电机转速会短暂的上升后下降到80,减小电机驱动电压,电机转速会短暂下降后,上升到80。

arduinoPID库函数下载

标签: Arduino传感器