root / trunk / code / projects / diagnostic_station / station / test_motors.c @ 1213
History | View | Annotate | Download (2.83 KB)
1 |
#include "test_motors.h" |
---|---|
2 |
#include "global.h" |
3 |
|
4 |
#include "comm_robot.h" |
5 |
|
6 |
// NB don't produce overflows!
|
7 |
#define vel_min 100 |
8 |
#define vel_max 250 |
9 |
#define vel_inc 10 |
10 |
#define vel_delay 200 |
11 |
|
12 |
static void test_motors_direction_velocity (uint8_t direction1, uint8_t direction2, uint8_t velocity) |
13 |
{ |
14 |
robot_set_motors (direction1, velocity, direction2, velocity); |
15 |
delay_ms (vel_delay); |
16 |
|
17 |
// wait (steady)
|
18 |
//
|
19 |
// reset_encoders ();
|
20 |
// for (measurements)
|
21 |
// {
|
22 |
// measure left/right
|
23 |
// wait
|
24 |
// }
|
25 |
} |
26 |
|
27 |
|
28 |
#define acceleration_increasing 1 |
29 |
#define acceleration_decreasing 2 |
30 |
|
31 |
// TODO: pass number of steps instead
|
32 |
static void test_motors_direction_acceleration (uint8_t direction1, uint8_t direction2, uint8_t vel_start, uint8_t vel_end, int8_t vel_step, char *acceleration_string) |
33 |
{ |
34 |
// Use 16 bit variable for vel to avoid problems with overflow (if vel=250 and 10 is added, it would be 260-256=4
|
35 |
// which is still smaller than vel_max). There are more elegant solutions to this problem, but this one is
|
36 |
// easy and performance is not an issue here anyway.
|
37 |
|
38 |
// Distinguish between start>=end/start<end because we have to use the corresponding stop condition.
|
39 |
if (vel_end>=vel_start)
|
40 |
for (uint16_t vel=vel_start; vel<=vel_end; vel+=vel_step)
|
41 |
test_motors_direction_velocity (direction1, direction2, vel); |
42 |
else
|
43 |
for (uint16_t vel=vel_start; vel>=vel_end; vel+=vel_step)
|
44 |
test_motors_direction_velocity (direction1, direction2, vel); |
45 |
|
46 |
|
47 |
// Send data
|
48 |
for (uint8_t i=1; i<=2; ++i) |
49 |
{ |
50 |
uint8_t direction=(i==1)?direction1:direction2;
|
51 |
|
52 |
if (direction!=motor_direction_off)
|
53 |
{ |
54 |
usb_puts ("data motor ");
|
55 |
usb_puti (i); |
56 |
usb_puts (" ");
|
57 |
usb_puts (motor_direction_string (direction)); |
58 |
usb_puts (" ");
|
59 |
usb_puts (acceleration_string); |
60 |
usb_puts (" ");
|
61 |
|
62 |
usb_puts (" 160/100 170/200 180/300 190/400 200/500 210/600 220/700" NL);
|
63 |
} |
64 |
} |
65 |
} |
66 |
|
67 |
static void test_motors_direction (uint8_t direction1, uint8_t direction2) |
68 |
{ |
69 |
test_motors_direction_acceleration (direction1, direction2, vel_min, vel_max, vel_inc, "increasing");
|
70 |
test_motors_direction_acceleration (direction1, direction2, vel_max, vel_min, -vel_inc, "decreasing");
|
71 |
} |
72 |
|
73 |
|
74 |
void test_motor_all (void) |
75 |
{ |
76 |
usb_puts("# Testing motors" NL);
|
77 |
|
78 |
test_motors_direction (motor_direction_forward, motor_direction_backward); |
79 |
test_motors_direction (motor_direction_backward, motor_direction_forward); |
80 |
|
81 |
robot_set_motors_off (); |
82 |
|
83 |
usb_puts("# Testing motors finished" NL);
|
84 |
} |
85 |
|
86 |
void test_motor (uint8_t num)
|
87 |
{ |
88 |
if (num==1) |
89 |
{ |
90 |
test_motors_direction (motor_direction_forward, motor_direction_off); |
91 |
test_motors_direction (motor_direction_backward, motor_direction_off); |
92 |
} |
93 |
else if (num==2) |
94 |
{ |
95 |
test_motors_direction (motor_direction_off, motor_direction_forward); |
96 |
test_motors_direction (motor_direction_off, motor_direction_backward); |
97 |
} |
98 |
} |