Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ardupilot
GitHub Repository: Ardupilot/ardupilot
Path: blob/master/ArduSub/actuators.cpp
4232 views
1
#include "Sub.h"
2
#include "actuators.h"
3
4
5
6
const AP_Param::GroupInfo Actuators::var_info[] = {
7
8
// @Param: 1_INC
9
// @DisplayName: Increment step for actuator 1
10
// @Description: Initial increment step for changing the actuator's PWM
11
// @Units: us
12
// @User: Standard
13
AP_GROUPINFO("1_INC", 1, Actuators, actuator_increment_step[0], ACTUATOR_DEFAULT_INCREMENT),
14
15
// @Param: 2_INC
16
// @DisplayName: Increment step for actuator 2
17
// @Description: Initial increment step for changing the actuator's PWM
18
// @Units: us
19
// @User: Standard
20
AP_GROUPINFO("2_INC", 2, Actuators, actuator_increment_step[1], ACTUATOR_DEFAULT_INCREMENT),
21
22
// @Param: 3_INC
23
// @DisplayName: Increment step for actuator 3
24
// @Description: Initial increment step for changing the actuator's PWM
25
// @Units: us
26
// @User: Standard
27
AP_GROUPINFO("3_INC", 3, Actuators, actuator_increment_step[2], ACTUATOR_DEFAULT_INCREMENT),
28
29
// @Param: 4_INC
30
// @DisplayName: Increment step for actuator 4
31
// @Description: Initial increment step for changing the actuator's PWM
32
// @Units: us
33
// @User: Standard
34
AP_GROUPINFO("4_INC", 4, Actuators, actuator_increment_step[3], ACTUATOR_DEFAULT_INCREMENT),
35
36
// @Param: 5_INC
37
// @DisplayName: Increment step for actuator 5
38
// @Description: Initial increment step for changing the actuator's PWM
39
// @Units: us
40
// @User: Standard
41
AP_GROUPINFO("5_INC", 5, Actuators, actuator_increment_step[4], ACTUATOR_DEFAULT_INCREMENT),
42
43
// @Param: 6_INC
44
// @DisplayName: Increment step for actuator 6
45
// @Description: Initial increment step for changing the actuator's PWM
46
// @Units: us
47
// @User: Standard
48
AP_GROUPINFO("6_INC", 6, Actuators, Actuators::actuator_increment_step[5], ACTUATOR_DEFAULT_INCREMENT),
49
50
AP_GROUPEND
51
};
52
53
Actuators::Actuators() {
54
AP_Param::setup_object_defaults(this, var_info);
55
}
56
57
58
void Actuators::initialize_actuators() {
59
const SRV_Channel::Function first_aux = SRV_Channel::Function::k_actuator1;
60
for (int i = 0; i < ACTUATOR_CHANNELS; i++) {
61
uint8_t channel_number;
62
if (!SRV_Channels::find_channel((SRV_Channel::Function)(first_aux + i), channel_number)) {
63
continue;
64
}
65
SRV_Channel* chan = SRV_Channels::srv_channel(channel_number);
66
uint16_t servo_min = chan->get_output_min();
67
uint16_t servo_max = chan->get_output_max();
68
uint16_t servo_range = servo_max - servo_min;
69
70
uint16_t servo_trim = chan->get_trim();
71
// set current value to trim
72
aux_actuator_value[i] = (servo_trim - servo_min) / static_cast<float>(servo_range);
73
}
74
update_actuators();
75
}
76
77
void Actuators::update_actuators() {
78
const SRV_Channel::Function first_aux = SRV_Channel::Function::k_actuator1;
79
for (int i = 0; i < ACTUATOR_CHANNELS; i++) {
80
uint8_t channel_number;
81
if (!SRV_Channels::find_channel((SRV_Channel::Function)(first_aux + i), channel_number)) {
82
continue;
83
}
84
SRV_Channel* chan = SRV_Channels::srv_channel(channel_number);
85
uint16_t servo_min = chan->get_output_min();
86
uint16_t servo_max = chan->get_output_max();
87
uint16_t servo_range = servo_max - servo_min;
88
chan->set_output_pwm(servo_min + servo_range * aux_actuator_value[i]);
89
}
90
}
91
92
void Actuators::increase_actuator(uint8_t actuator_num) {
93
if (actuator_num >= ACTUATOR_CHANNELS) {
94
return;
95
}
96
aux_actuator_value[actuator_num] = constrain_float(aux_actuator_value[actuator_num] + actuator_increment_step[actuator_num], 0.0f, 1.0f);
97
}
98
99
void Actuators::decrease_actuator(uint8_t actuator_num) {
100
if (actuator_num >= ACTUATOR_CHANNELS) {
101
return;
102
}
103
aux_actuator_value[actuator_num] = constrain_float(aux_actuator_value[actuator_num] - actuator_increment_step[actuator_num], 0.0f, 1.0f);
104
}
105
106
void Actuators::min_actuator(uint8_t actuator_num) {
107
if (actuator_num >= ACTUATOR_CHANNELS) {
108
return;
109
}
110
aux_actuator_value[actuator_num] = 0;
111
}
112
113
void Actuators::max_actuator(uint8_t actuator_num) {
114
if (actuator_num >= ACTUATOR_CHANNELS) {
115
return;
116
}
117
aux_actuator_value[actuator_num] = 1;
118
}
119
120
void Actuators::min_toggle_actuator(uint8_t actuator_num) {
121
if (actuator_num >= ACTUATOR_CHANNELS) {
122
return;
123
}
124
if (aux_actuator_value[actuator_num] < 0.4) {
125
aux_actuator_value[actuator_num] = 0.5;
126
} else {
127
aux_actuator_value[actuator_num] = 0;
128
}
129
}
130
131
void Actuators::max_toggle_actuator(uint8_t actuator_num) {
132
if (actuator_num >= ACTUATOR_CHANNELS) {
133
return;
134
}
135
if (aux_actuator_value[actuator_num] >= 0.6) {
136
aux_actuator_value[actuator_num] = 0.5;
137
} else {
138
aux_actuator_value[actuator_num] = 1;
139
}
140
}
141
142
void Actuators::center_actuator(uint8_t actuator_num) {
143
if (actuator_num >= ACTUATOR_CHANNELS) {
144
return;
145
}
146
aux_actuator_value[actuator_num] = 0.5;
147
}
148
149