控制任務
檢測編碼器的脈沖並測速
電路設計
圖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 }