123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- #include <AP_HAL/AP_HAL.h>
- #include <AP_Math/AP_Math.h>
- #include <AP_Vehicle/AP_Vehicle.h>
- #include <AP_Math/AP_Math.h>
- #include "SRV_Channel.h"
- extern const AP_HAL::HAL& hal;
- SRV_Channel::servo_mask_t SRV_Channel::have_pwm_mask;
- const AP_Param::GroupInfo SRV_Channel::var_info[] = {
-
-
-
-
-
-
-
- AP_GROUPINFO("MIN", 1, SRV_Channel, servo_min, 1100),
-
-
-
-
-
-
-
- AP_GROUPINFO("MAX", 2, SRV_Channel, servo_max, 1900),
-
-
-
-
-
-
-
- AP_GROUPINFO("TRIM", 3, SRV_Channel, servo_trim, 1500),
-
-
-
-
-
- AP_GROUPINFO("REVERSED", 4, SRV_Channel, reversed, 0),
-
-
-
-
-
- AP_GROUPINFO("FUNCTION", 5, SRV_Channel, function, 0),
- AP_GROUPEND
- };
- SRV_Channel::SRV_Channel(void)
- {
- AP_Param::setup_object_defaults(this, var_info);
-
- have_pwm_mask = ~uint16_t(0);
- }
- uint16_t SRV_Channel::pwm_from_range(int16_t scaled_value) const
- {
- if (servo_max <= servo_min || high_out == 0) {
- return servo_min;
- }
- scaled_value = constrain_int16(scaled_value, 0, high_out);
- if (reversed) {
- scaled_value = high_out - scaled_value;
- }
- return servo_min + ((int32_t)scaled_value * (int32_t)(servo_max - servo_min)) / (int32_t)high_out;
- }
- uint16_t SRV_Channel::pwm_from_angle(int16_t scaled_value) const
- {
- if (reversed) {
- scaled_value = -scaled_value;
- }
- scaled_value = constrain_int16(scaled_value, -high_out, high_out);
- if (scaled_value > 0) {
- return servo_trim + ((int32_t)scaled_value * (int32_t)(servo_max - servo_trim)) / (int32_t)high_out;
- } else {
- return servo_trim - (-(int32_t)scaled_value * (int32_t)(servo_trim - servo_min)) / (int32_t)high_out;
- }
- }
- void SRV_Channel::calc_pwm(int16_t output_scaled)
- {
- if (have_pwm_mask & (1U<<ch_num)) {
- return;
- }
-
- if (SRV_Channel::should_e_stop(get_function()) && SRV_Channels::emergency_stop) {
- output_scaled = 0;
- }
- uint16_t pwm;
- if (type_angle) {
- pwm = pwm_from_angle(output_scaled);
- } else {
- pwm = pwm_from_range(output_scaled);
- }
- set_output_pwm(pwm);
- }
- void SRV_Channel::set_output_pwm(uint16_t pwm)
- {
- output_pwm = pwm;
- have_pwm_mask |= (1U<<ch_num);
- }
- void SRV_Channel::set_angle(int16_t angle)
- {
- type_angle = true;
- high_out = angle;
- type_setup = true;
- }
- void SRV_Channel::set_range(uint16_t high)
- {
- type_angle = false;
- high_out = high;
- type_setup = true;
- }
- float SRV_Channel::get_output_norm(void)
- {
- uint16_t mid = (servo_max + servo_min) / 2;
- float ret;
- if (mid <= servo_min) {
- return 0;
- }
- if (output_pwm < mid) {
- ret = (float)(output_pwm - mid) / (float)(mid - servo_min);
- } else if (output_pwm > mid) {
- ret = (float)(output_pwm - mid) / (float)(servo_max - mid);
- } else {
- ret = 0;
- }
- if (get_reversed()) {
- ret = -ret;
- }
- return ret;
- }
- uint16_t SRV_Channel::get_limit_pwm(LimitValue limit) const
- {
- switch (limit) {
- case SRV_CHANNEL_LIMIT_TRIM:
- return servo_trim;
- case SRV_CHANNEL_LIMIT_MIN:
- return reversed?servo_max:servo_min;
- case SRV_CHANNEL_LIMIT_MAX:
- return reversed?servo_min:servo_max;
- case SRV_CHANNEL_LIMIT_ZERO_PWM:
- default:
- return 0;
- }
- }
- bool SRV_Channel::is_motor(SRV_Channel::Aux_servo_function_t function)
- {
- return ((function >= SRV_Channel::k_motor1 && function <= SRV_Channel::k_motor8) ||
- (function >= SRV_Channel::k_motor9 && function <= SRV_Channel::k_motor12));
- }
- bool SRV_Channel::should_e_stop(SRV_Channel::Aux_servo_function_t function)
- {
- return ((function >= SRV_Channel::k_heli_rsc && function <= SRV_Channel::k_motor8) ||
- function == SRV_Channel::k_starter || function == SRV_Channel::k_throttle ||
- function == SRV_Channel::k_throttleLeft || function == SRV_Channel::k_throttleRight ||
- (function >= SRV_Channel::k_boost_throttle && function <= SRV_Channel::k_motor12) ||
- function == k_engine_run_enable);
- }
|