控制任务
检测编码器的脉冲并测速
电路设计
图1 直流电机带减速器和编码器
图2 编码器接线定义
编码器接线定义如下
M1:电机电源接口,绿色的
GND:编码器电源负极输入口,橙色的
C1:编码器A相输出,黄色的,接Arduino控制板2号引脚
C2:编码器B相输出,白色的,接Arduino控制板3号引脚
3.3V:编码器电源正极输入口(兼容3.3V、5V),红色的
M2:电机电源接口,黑色的,
程序设计
1 int motor_c_ENA=6; //控制板与驱动板的引脚连接 2 int motor_c_IN1=8; 3 int motor_c_IN2=7; 4 5 #define ENCODER_A_PIN 2 //编码器A相接控制板2号引脚,对应0号外部中断 6 #define ENCODER_B_PIN 3 //编码器B相接控制板3号引脚, 7 long pulse_number=0; // 脉冲计数 8 int rpm; 9 10 #include <MsTimer2.h> //定时器库的头文件 11 12 void setup() 13 { 14 pinMode(motor_c_ENA,OUTPUT); //电机C使能和PWM调速口 15 pinMode(motor_c_IN1,OUTPUT); //电机C控制口 16 pinMode(motor_c_IN2,OUTPUT); //电机C控制口 17 18 MsTimer2::set(500, send); // 中断设置函数,每 500ms 进入一次中断 19 MsTimer2::start(); //开始计时 20 21 pinMode(ENCODER_A_PIN, INPUT); 22 pinMode(ENCODER_B_PIN, INPUT); 23 attachInterrupt(0, read_quadrature, FALLING); //EN_A脚下降沿触发中断 24 Serial.begin(9600); //初始化Arduino串口 25 } 26 27 void loop() 28 { 29 //C加速正转 30 digitalWrite(motor_c_IN1,0); 31 digitalWrite(motor_c_IN2,1); 32 for (int a=100;a<=255;a++) 33 { 34 analogWrite(motor_c_ENA,a); 35 delay(200); 36 } 37 38 //C减速正转 39 digitalWrite(motor_c_IN1,0); 40 digitalWrite(motor_c_IN2,1); 41 for (int a=255;a>0;a--) 42 { 43 analogWrite(motor_c_ENA,a); 44 delay(200); 45 } 46 } 47 48 void send() //速度串行传送 49 { 50 rpm=int(pulse_number/37.4); 51 //编码器精度为224线,减速器减速比为1:20,故系数=(224/(60/0.5))*20=37.4 52 Serial.print("rpm: "); 53 Serial.println(rpm, DEC); 54 pulse_number = 0; 55 } 56 57 void read_quadrature() //编码器脉冲计数中断函数 58 { 59 if (digitalRead(ENCODER_A_PIN) == LOW) 60 { 61 if (digitalRead(ENCODER_B_PIN) == LOW) // 查询EN_B的电平以确认正转 62 { pulse_number ++; } 63 if (digitalRead(ENCODER_B_PIN) == HIGH) // 查询EN_B的电平以确认反转 64 { pulse_number --; } 65 } 66 }