Add other 2 roller speed sensors, convert motors and rollers to indexed

master
Tom Wilson 4 years ago
parent 82b21b357d
commit 2ee6f8c4c0

@ -15,11 +15,12 @@ void loop() {
delay(100);
// Serial.println(digitalRead(MOTOR_SPEED_SENSE));
Serial.print(get_motor_1_duty());
Serial.print(get_motor_duty(0));
Serial.print(", ");
Serial.print(get_motor_2_duty());
Serial.print(get_motor_duty(1));
Serial.print(", ");
Serial.println(getRoller1Speed());
set_motor_1(true, 0.3);
set_motor_2(true, 0.3);
Serial.println(get_roller_speed(0));
set_motor(0, true, 0.3);
set_motor(1, true, 0.3);
set_motor(2, true, 0.3);
}

@ -56,7 +56,7 @@ static void motor_control_task(void *pvParameters) {
if (m_set.enabled) {
actual_speed = getRoller1Speed();
actual_speed = get_roller_speed(m_id);
error = m_set.desired_speed - actual_speed;
m_stat[m_id].i_error += error * MC_ITERATION_TIME;
d_error = (error - m_stat[m_id].last_error) / MC_ITERATION_TIME;
@ -107,51 +107,21 @@ static void motor_control_task(void *pvParameters) {
}
}
void set_motor_1(bool enabled, float desired_speed) {
void set_motor(int motor_id, bool enabled, float desired_speed) {
motor_settings_t new_settings;
xQueuePeek(motor_settings_queue[0], &new_settings, 0);
// Get copy of current settings
xQueuePeek(motor_settings_queue[motor_id], &new_settings, 0);
new_settings.enabled = enabled;
new_settings.desired_speed = desired_speed;
xQueueOverwrite(motor_settings_queue[0], &new_settings);
// Send new modified settings
xQueueOverwrite(motor_settings_queue[motor_id], &new_settings);
}
void set_motor_2(bool enabled, float desired_speed) {
motor_settings_t new_settings;
xQueuePeek(motor_settings_queue[1], &new_settings, 0);
new_settings.enabled = enabled;
new_settings.desired_speed = desired_speed;
xQueueOverwrite(motor_settings_queue[1], &new_settings);
}
void set_motor_3(bool enabled, float desired_speed) {
motor_settings_t new_settings;
xQueuePeek(motor_settings_queue[2], &new_settings, 0);
new_settings.enabled = enabled;
new_settings.desired_speed = desired_speed;
xQueueOverwrite(motor_settings_queue[2], &new_settings);
}
float get_motor_1_duty() {
float get_motor_duty(int motor_id) {
motor_status_t motor_status;
xQueuePeek(motor_status_queue[0], &motor_status, 0);
return motor_status.duty;
}
float get_motor_2_duty() {
motor_status_t motor_status;
xQueuePeek(motor_status_queue[1], &motor_status, 0);
return motor_status.duty;
}
float get_motor_3_duty() {
motor_status_t motor_status;
xQueuePeek(motor_status_queue[2], &motor_status, 0);
xQueuePeek(motor_status_queue[motor_id], &motor_status, 0);
return motor_status.duty;
}
@ -189,6 +159,18 @@ void motor_control_setup(void) {
mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_1, &pwm_config);
mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_2, &pwm_config);
// Set Timer 0 to generate sync signal when it reaches the top
mcpwm_set_timer_sync_output(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_SWSYNC_SOURCE_TEP);
mcpwm_sync_config_t sync_conf = {
.sync_sig = MCPWM_SELECT_TIMER0_SYNC,
.timer_val = 333,
.count_direction = MCPWM_TIMER_DIRECTION_UP,
};
mcpwm_sync_configure(MCPWM_UNIT_0, MCPWM_TIMER_1, &sync_conf);
sync_conf.timer_val = 666;
mcpwm_sync_configure(MCPWM_UNIT_0, MCPWM_TIMER_2, &sync_conf);
// Bind to output
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, GPIO_ROLLER1_PWM);
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM1A, GPIO_ROLLER2_PWM);

@ -7,13 +7,9 @@
#define MAX_DUTY_RAMP 5.0 // max change in duty per second - where 1.0 is full duty
void set_motor_1(bool enabled, float desired_speed);
void set_motor_2(bool enabled, float desired_speed);
void set_motor_3(bool enabled, float desired_speed);
void set_motor(int motor_id, bool enabled, float desired_speed);
float get_motor_1_duty(void);
float get_motor_2_duty(void);
float get_motor_3_duty(void);
float get_motor_duty(int motor_id);
void motor_control_setup(void);

@ -64,10 +64,10 @@ static bool speed_pulse_isr_handler(mcpwm_unit_t mcpwm, mcpwm_capture_channel_id
return high_task_wakeup == pdTRUE;
}
float getRoller1Speed(void) {
float get_roller_speed(int roller_id) {
pulse_measurement_t pulse_measurement;
// Get the pulse period in APB clock ticks.
xQueuePeek(roller_measurement_queue[0], &pulse_measurement, 0);
xQueuePeek(roller_measurement_queue[roller_id], &pulse_measurement, 0);
if ((pulse_measurement.period == 0) or
((esp_timer_get_time() - pulse_measurement.timestamp) >= ZERO_SPEED_TIMEOUT_US)) {
return 0.0;
@ -88,14 +88,17 @@ void roller_speed_setup(void) {
xQueueOverwrite(roller_measurement_queue[1], &blank_measurement);
xQueueOverwrite(roller_measurement_queue[2], &blank_measurement);
// Set MCPWM0 CAP0 on roller 1 speed, enable pullup input pin
// Attach GPIO to capture units in MCPWM
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM_CAP_0, GPIO_ROLLER1_SPEED);
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM_CAP_1, GPIO_ROLLER2_SPEED);
mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM_CAP_2, GPIO_ROLLER3_SPEED);
// configure MCPWM0 CAP0
// Configure and enable MCPWM capture units
mcpwm_capture_config_t conf = {.cap_edge = MCPWM_POS_EDGE, // trigger on riding edge
.cap_prescale = 1, // pulses per interrupt
.capture_cb = speed_pulse_isr_handler,
.user_data = NULL};
// Enable MCWPM0 CAP0
mcpwm_capture_enable_channel(MCPWM_UNIT_0, MCPWM_SELECT_CAP0, &conf);
mcpwm_capture_enable_channel(MCPWM_UNIT_0, MCPWM_SELECT_CAP1, &conf);
mcpwm_capture_enable_channel(MCPWM_UNIT_0, MCPWM_SELECT_CAP2, &conf);
}

@ -10,10 +10,10 @@
void roller_speed_setup(void);
// Returns the last calculated speed for Roller 1 in revs/second
float getRoller1Speed(void);
// Returns the last calculated speed for roller in revs/second. Only pass 0, 1 or 2
float get_roller_speed(int roller_id);
// Returns the total rev count for Roller 1. Overflows back to 0 at REV_OVERFLOW
float getRoller1Revs(void);
// Returns the total rev count for a roller. Only pass 0, 1 or 2. Overflows back to 0 at REV_OVERFLOW
float get_roller_revs(int roller_id);
#endif
Loading…
Cancel
Save