2018-05-08 23:23:39 +02:00
|
|
|
#define halBlueLeft 2
|
|
|
|
#define halYellowLeft 22
|
|
|
|
#define halGreenLeft 19
|
|
|
|
|
|
|
|
#define halBlueRight 23
|
|
|
|
#define halYellowRight 18
|
|
|
|
#define halGreenRight 5
|
|
|
|
|
2018-05-26 22:17:12 +02:00
|
|
|
#define FORWARD 0
|
|
|
|
#define BACKWARD 1
|
|
|
|
|
2018-05-08 23:23:39 +02:00
|
|
|
#define wheelCircumference 26.062
|
2018-05-26 22:17:12 +02:00
|
|
|
#define pulsesPerRotation 22
|
|
|
|
|
|
|
|
#include "driver/pcnt.h"
|
2018-05-08 23:23:39 +02:00
|
|
|
|
|
|
|
TaskHandle_t rpmTaskHandle;
|
2018-06-17 22:09:05 +02:00
|
|
|
float rpmRight = 0;
|
|
|
|
float rpmLeft = 0;
|
2018-05-08 23:23:39 +02:00
|
|
|
|
|
|
|
int lastState[2] = {1, 1};
|
2018-05-26 22:17:12 +02:00
|
|
|
int16_t counter[2] = {0, 0};
|
|
|
|
int direction[2] = {0, 0};
|
2018-05-08 23:23:39 +02:00
|
|
|
|
|
|
|
long rpmTimer = 0;
|
|
|
|
|
|
|
|
// Zero states are non existant
|
|
|
|
int motorPosition[2][2][2] {
|
|
|
|
{
|
|
|
|
{0, 1},
|
|
|
|
{3, 2}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{5, 6},
|
|
|
|
{4, 0}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
// old state, new state
|
|
|
|
int relativeLookup[6][6] {
|
|
|
|
{ 0, 1, 2, 3,-2,-1}, // 1
|
|
|
|
{-1, 0, 1, 2, 3,-1}, // 2
|
|
|
|
{-2,-1, 0, 1, 2, 3}, // 3
|
|
|
|
{-3,-2,-1, 0, 1, 2}, // 4
|
|
|
|
{ 1,-3,-2,-1, 0, 1}, // 5
|
|
|
|
{ 1, 2,-3,-2,-1, 0} // 6
|
|
|
|
};
|
|
|
|
|
2018-05-26 22:17:12 +02:00
|
|
|
#define PCNT_UNIT_LEFT PCNT_UNIT_0
|
|
|
|
#define PCNT_UNIT_RIGHT PCNT_UNIT_1
|
|
|
|
|
|
|
|
|
2018-05-08 23:23:39 +02:00
|
|
|
int getState(bool isLeft) {
|
|
|
|
if(isLeft) {
|
|
|
|
return motorPosition[digitalRead(halBlueLeft)][digitalRead(halYellowLeft)][digitalRead(halGreenLeft)];
|
|
|
|
} else {
|
|
|
|
return motorPosition[digitalRead(halBlueRight)][digitalRead(halYellowRight)][digitalRead(halGreenRight)];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void initRPMPins() {
|
|
|
|
pinMode(halBlueLeft, INPUT_PULLUP);
|
|
|
|
pinMode(halYellowLeft, INPUT_PULLUP);
|
|
|
|
pinMode(halGreenLeft, INPUT_PULLUP);
|
|
|
|
|
|
|
|
pinMode(halBlueRight, INPUT_PULLUP);
|
|
|
|
pinMode(halYellowRight, INPUT_PULLUP);
|
|
|
|
pinMode(halGreenRight, INPUT_PULLUP);
|
2018-05-26 22:17:12 +02:00
|
|
|
|
|
|
|
// init counter
|
|
|
|
pcnt_config_t pcnt_config_left = {
|
|
|
|
.pulse_gpio_num = halBlueLeft,
|
|
|
|
.ctrl_gpio_num = PCNT_PIN_NOT_USED,
|
|
|
|
.lctrl_mode = PCNT_MODE_KEEP,
|
|
|
|
.hctrl_mode = PCNT_MODE_KEEP,
|
|
|
|
.pos_mode = PCNT_COUNT_INC, // count both rising and falling edges
|
|
|
|
.neg_mode = PCNT_COUNT_INC,
|
|
|
|
.counter_h_lim = 32767,
|
|
|
|
.counter_l_lim = -1,
|
|
|
|
.unit = PCNT_UNIT_LEFT,
|
|
|
|
.channel = PCNT_CHANNEL_0
|
|
|
|
};
|
|
|
|
|
|
|
|
pcnt_config_t pcnt_config_right = {
|
|
|
|
.pulse_gpio_num = halBlueRight,
|
|
|
|
.ctrl_gpio_num = PCNT_PIN_NOT_USED,
|
|
|
|
.lctrl_mode = PCNT_MODE_KEEP,
|
|
|
|
.hctrl_mode = PCNT_MODE_KEEP,
|
|
|
|
.pos_mode = PCNT_COUNT_INC, // count both rising and falling edges
|
|
|
|
.neg_mode = PCNT_COUNT_INC,
|
|
|
|
.counter_h_lim = 32767,
|
|
|
|
.counter_l_lim = -1,
|
|
|
|
.unit = PCNT_UNIT_RIGHT,
|
|
|
|
.channel = PCNT_CHANNEL_0
|
|
|
|
};
|
|
|
|
|
|
|
|
pcnt_unit_config(&pcnt_config_left);
|
|
|
|
pcnt_unit_config(&pcnt_config_right);
|
|
|
|
|
|
|
|
|
|
|
|
pcnt_counter_pause(PCNT_UNIT_LEFT);
|
|
|
|
pcnt_counter_pause(PCNT_UNIT_RIGHT);
|
|
|
|
|
|
|
|
pcnt_counter_clear(PCNT_UNIT_LEFT);
|
|
|
|
pcnt_counter_clear(PCNT_UNIT_RIGHT);
|
|
|
|
|
|
|
|
pcnt_counter_resume(PCNT_UNIT_LEFT);
|
|
|
|
pcnt_counter_resume(PCNT_UNIT_RIGHT);
|
|
|
|
|
2018-05-08 23:23:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void measureRpm(void * parameter) {
|
2018-05-26 22:17:12 +02:00
|
|
|
|
2018-05-08 23:23:39 +02:00
|
|
|
while(true) {
|
|
|
|
if(millis()-rpmTimer>250) {
|
2018-05-26 22:17:12 +02:00
|
|
|
// read counters
|
|
|
|
pcnt_get_counter_value(PCNT_UNIT_LEFT, &counter[1]);
|
|
|
|
pcnt_get_counter_value(PCNT_UNIT_RIGHT, &counter[0]);
|
|
|
|
|
|
|
|
pcnt_counter_clear(PCNT_UNIT_LEFT);
|
|
|
|
pcnt_counter_clear(PCNT_UNIT_RIGHT);
|
2018-05-08 23:23:39 +02:00
|
|
|
|
2018-05-26 22:17:12 +02:00
|
|
|
|
|
|
|
rpmRight = (counter[0]/pulsesPerRotation)*4;
|
|
|
|
rpmLeft = (counter[1]/pulsesPerRotation)*4;
|
|
|
|
kmh = (wheelCircumference/100) * (rpmRight+rpmLeft)/2 * 3600/1000;
|
2018-06-17 22:09:05 +02:00
|
|
|
//Serial.print(kmh); Serial.print(" "); Serial.println(direction[0]);
|
2018-05-08 23:23:39 +02:00
|
|
|
sendSpeed = abs(floor(kmh));
|
|
|
|
sendSpeedDecimals = (kmh - sendSpeed) * 100;
|
|
|
|
counter[true] = 0;
|
|
|
|
counter[false] = 0;
|
|
|
|
rpmTimer = millis();
|
|
|
|
}
|
|
|
|
|
2018-05-08 23:32:11 +02:00
|
|
|
int state = getState(0);
|
|
|
|
if(lastState[0] != state) {
|
2018-05-26 22:17:12 +02:00
|
|
|
if(relativeLookup[lastState[0]-1][state-1] > 0) {
|
|
|
|
direction[0] = FORWARD;
|
|
|
|
} else {
|
|
|
|
direction[0] = BACKWARD;
|
|
|
|
}
|
2018-05-08 23:32:11 +02:00
|
|
|
lastState[0] = state;
|
2018-05-08 23:23:39 +02:00
|
|
|
}
|
|
|
|
|
2018-05-08 23:32:11 +02:00
|
|
|
state = getState(1);
|
|
|
|
if(lastState[1] != state) {
|
2018-05-26 22:17:12 +02:00
|
|
|
if(relativeLookup[lastState[1]-1][state-1] > 0) {
|
|
|
|
direction[1] = FORWARD;
|
|
|
|
} else {
|
|
|
|
direction[1] = BACKWARD;
|
|
|
|
}
|
|
|
|
|
2018-05-08 23:32:11 +02:00
|
|
|
lastState[1] = state;
|
2018-05-08 23:23:39 +02:00
|
|
|
}
|
|
|
|
|
2018-05-26 22:17:12 +02:00
|
|
|
vTaskDelay(1 / portTICK_PERIOD_MS);
|
2018-05-08 23:23:39 +02:00
|
|
|
}
|
|
|
|
}
|