Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#ifndef _MOTOR_H_
#define _MOTOR_H_
#include "bsp_can.h"
#include "bsp_pwm.h"
#include "pid.h"
#define CAN_TX1_ID 0x200
#define CAN_TX2_ID 0x1FF
#define CAN_RX1_START 0x201
#define CAN_RX2_START 0x205
enum motors {
/* can motors */
M3508,
GM6020,
M2006,
general_motor,
/* pwm motors */
M2305,
};
//
typedef struct {
uint16_t rx_id;
uint16_t tx_id;
uint8_t can_id;
} can_info_t;
/**
* @struct GM6020_info_t
* @brief store GM6020 motor data
* @var rx_id sensor CAN receive id
* @var tx_id sensor CAN transmit id
* @var can_id CAN id chosen from [CAN1, CAN2]
* @var angle most recent angle data
* @var current_get actual current / torque output
* @var current_set target current / torque output
*/
typedef struct {
int16_t angle;
int16_t speed;
int16_t current;
int8_t temp;
} GM6020_info_t;
typedef struct {
int16_t angle;
int16_t speed;
int16_t current;
int8_t temp;
} M3508_info_t;
typedef union{
GM6020_info_t GM6020_info;
M3508_info_t M3508_info;
} motor_info_t;
// Une struct par moteur
typedef struct
{
can_info_t can_info; // Can ID information
//M3508_info_t info;
motor_info_t info; // Specific info about the motor
int type; // Type du moteur, ex:GM6020
pid_struct_t pid_pos; // Controler
pid_struct_t pid_speed; // Controler
float target;
float voltage;
} motor_t;
//id:0 -> 0x200, 1 -> 0x1ff
void set_motor_voltage(uint8_t id, motor_t *motor1, motor_t *motor2, motor_t *motor3, motor_t *motor4);
static int16_t correct_output(motor_t *motor);
uint8_t get_motor_data(motor_t *motor);
static void get_6020_data(motor_t* motor, uint8_t buf[CAN_DATA_SIZE]);
void set_motor_position(motor_t *motor);
void set_motor_speed(motor_t *motor);
void run_motor_from_command(motor_t *motor, pid_struct_t pid_param, float target, float fdb);
#endif