Files
HardwareDesign/Homework/Homework5/Encoder/Encoder.ino
2023-07-06 14:23:24 +08:00

149 lines
3.7 KiB
C++

#include <TimerOne.h>
const byte IN1 = 10;
const byte IN2 = 11;
const byte ENABLE = 6;
const byte ENCO_B = 3;
const byte ENCO_A = 2;
const unsigned long RESET_COUNT_PERIOD_IN_US = 50000;
const int EDGES_PER_CYCLE = 13;
const int REDUCTION_RATIO = 20;
int count = 0;
int forward_count = 0;
int backward_count = 0;
unsigned long aFallingTime = 0;
unsigned long bFallingTime = 0;
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENABLE, OUTPUT);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
pinMode(ENCO_B, INPUT);
pinMode(ENCO_A, INPUT);
Serial.begin(115200);
Timer1.initialize();
Timer1.setPeriod(RESET_COUNT_PERIOD_IN_US);
Timer1.attachInterrupt(resetCountAndPrint);
// attachInterrupt(digitalPinToInterrupt(ENCO_A), onEncoAChange, CHANGE);
// attachInterrupt(digitalPinToInterrupt(ENCO_B), onEncoBChange, CHANGE);
attachInterrupt(digitalPinToInterrupt(ENCO_A), onEncoAFalling, FALLING);
// attachInterrupt(digitalPinToInterrupt(ENCO_B), onEncoBFalling, FALLING);
analogWrite(ENABLE, 50);
}
void loop() {
// int statusA = digitalRead(ENCO_A);
// int statusB = digitalRead(ENCO_B);
// // Serial.print("A: ");
// Serial.print('$');
// Serial.print(statusA);
// // Serial.print("B: ");
// Serial.print(' ');
// Serial.print(statusB);
// Serial.println(";");
// bFallingTime = micros();
// aFallingTime = micros();
// Serial.println(bFallingTime - aFallingTime);
}
void resetCountAndPrint() {
Serial.print("Rpm: ");
// Serial.println((double)count * 60 * 1000 * 1000 / RESET_COUNT_PERIOD_IN_US / REDUCTION_RATIO / EDGES_PER_CYCLE);
// Serial.print(forward_count);
// Serial.print(' ');
// Serial.print(backward_count);
// Serial.print(' ');
count = forward_count - backward_count;
Serial.print(forward_count);
Serial.print(' ');
Serial.print(backward_count);
Serial.print(' ');
Serial.println(count);
count = 0;
forward_count = 0;
backward_count = 0;
}
void onEncoAFalling() {
if (digitalRead(ENCO_B) == LOW) {
backward_count++;
}
else {
forward_count++;
}
// aFallingTime = micros();
}
void onEncoBFalling() {
// if (digitalRead(ENCO_A) == LOW) {
// forward_count++;
// }
// else {
// backward_count++;
// }
bFallingTime = micros();
}
void onEncoAChange() {
if (LOW == digitalRead(ENCO_A)) {
if (LOW == digitalRead(ENCO_B)) {
// Serial.println("A 1");
// count--;
backward_count++;
}
if (HIGH == digitalRead(ENCO_B)) {
// Serial.println("A 2");
// count ++;
forward_count++;
}
}
else {
if (HIGH == digitalRead(ENCO_B)) {
// Serial.println("A 3");
// count--;
backward_count++;
}
if (LOW == digitalRead(ENCO_B)) {
// Serial.println("A 4");
// count++;
forward_count++;
}
}
}
void onEncoBChange() {
if (LOW == digitalRead(ENCO_B)) {
if (HIGH == digitalRead(ENCO_A)) {
// Seria/l.println("B 1");
// count--;
backward_count++;
}
if (LOW == digitalRead(ENCO_A)) {
// Serial.println("B 2");
// count++;
forward_count++;
}
}
else {
if (LOW == digitalRead(ENCO_A)) {
// Serial.println("B 3");
// count--;
backward_count++;
}
if (HIGH == digitalRead(ENCO_A)) {
// Serial.println("B 4");
// count++;
forward_count++;
}
}
}