PWM12 mode for pwm_out and dshot

This commit is contained in:
Daniel Agar
2021-01-28 10:02:40 -05:00
parent 0614789db3
commit 15e76ad993
5 changed files with 113 additions and 17 deletions

View File

@@ -232,12 +232,13 @@ typedef uint16_t servo_position_t;
#define PWM_SERVO_MODE_5PWM1CAP 10 #define PWM_SERVO_MODE_5PWM1CAP 10
#define PWM_SERVO_MODE_6PWM 11 #define PWM_SERVO_MODE_6PWM 11
#define PWM_SERVO_MODE_8PWM 12 #define PWM_SERVO_MODE_8PWM 12
#define PWM_SERVO_MODE_14PWM 13 #define PWM_SERVO_MODE_12PWM 13
#define PWM_SERVO_MODE_4CAP 14 #define PWM_SERVO_MODE_14PWM 14
#define PWM_SERVO_MODE_5CAP 15 #define PWM_SERVO_MODE_4CAP 15
#define PWM_SERVO_MODE_6CAP 16 #define PWM_SERVO_MODE_5CAP 16
#define PWM_SERVO_ENTER_TEST_MODE 17 #define PWM_SERVO_MODE_6CAP 17
#define PWM_SERVO_EXIT_TEST_MODE 18 #define PWM_SERVO_ENTER_TEST_MODE 18
#define PWM_SERVO_EXIT_TEST_MODE 19
#define PWM_SERVO_SET_MODE _PX4_IOC(_PWM_SERVO_BASE, 34) #define PWM_SERVO_SET_MODE _PX4_IOC(_PWM_SERVO_BASE, 34)
/* /*

View File

@@ -221,6 +221,18 @@ int DShot::set_mode(const Mode mode)
break; break;
#endif #endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12
case MODE_12PWM:
PX4_DEBUG("MODE_12PWM");
// default output rates
_output_mask = 0xfff;
_outputs_initialized = false;
_num_outputs = 12;
break;
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14
case MODE_14PWM: case MODE_14PWM:
@@ -642,6 +654,9 @@ int DShot::ioctl(file *filp, int cmd, unsigned long arg)
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8
case MODE_8PWM: case MODE_8PWM:
#endif #endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12
case MODE_12PWM:
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14
case MODE_14PWM: case MODE_14PWM:
#endif #endif
@@ -680,6 +695,13 @@ int DShot::pwm_ioctl(file *filp, const int cmd, const unsigned long arg)
break; break;
#endif #endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12
case MODE_12PWM:
*(unsigned *)arg = 12;
break;
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8
case MODE_8PWM: case MODE_8PWM:
@@ -1003,6 +1025,9 @@ int DShot::module_new_mode(const PortMode new_mode)
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 8 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 8
mode = DShot::MODE_8PWM; mode = DShot::MODE_8PWM;
#endif #endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 12
mode = DShot::MODE_12PWM;
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 14 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 14
mode = DShot::MODE_14PWM; mode = DShot::MODE_14PWM;
#endif #endif
@@ -1268,6 +1293,16 @@ int DShot::custom_command(int argc, char *argv[])
} else if (!strcmp(verb, "mode_pwm8")) { } else if (!strcmp(verb, "mode_pwm8")) {
new_mode = PORT_PWM8; new_mode = PORT_PWM8;
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12
} else if (!strcmp(verb, "mode_pwm12")) {
new_mode = PORT_PWM12;
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14
} else if (!strcmp(verb, "mode_pwm14")) {
new_mode = PORT_PWM14;
#endif #endif
} }
@@ -1371,23 +1406,29 @@ After saving, the reversed direction will be regarded as the normal one. So to r
PRINT_MODULE_USAGE_COMMAND("mode_gpio"); PRINT_MODULE_USAGE_COMMAND("mode_gpio");
PRINT_MODULE_USAGE_COMMAND_DESCR("mode_pwm", "Select all available pins as PWM"); PRINT_MODULE_USAGE_COMMAND_DESCR("mode_pwm", "Select all available pins as PWM");
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14
PRINT_MODULE_USAGE_COMMAND("mode_pwm14");
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12
PRINT_MODULE_USAGE_COMMAND("mode_pwm12");
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8
PRINT_MODULE_USAGE_COMMAND("mode_pwm8"); PRINT_MODULE_USAGE_COMMAND("mode_pwm8");
#endif #endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 6 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 6
PRINT_MODULE_USAGE_COMMAND("mode_pwm6"); PRINT_MODULE_USAGE_COMMAND("mode_pwm6");
PRINT_MODULE_USAGE_COMMAND("mode_pwm5"); PRINT_MODULE_USAGE_COMMAND("mode_pwm5");
PRINT_MODULE_USAGE_COMMAND("mode_pwm5cap1"); PRINT_MODULE_USAGE_COMMAND("mode_pwm5cap1");
PRINT_MODULE_USAGE_COMMAND("mode_pwm4"); PRINT_MODULE_USAGE_COMMAND("mode_pwm4");
PRINT_MODULE_USAGE_COMMAND("mode_pwm4cap1"); PRINT_MODULE_USAGE_COMMAND("mode_pwm4cap1");
PRINT_MODULE_USAGE_COMMAND("mode_pwm4cap2"); PRINT_MODULE_USAGE_COMMAND("mode_pwm4cap2");
PRINT_MODULE_USAGE_COMMAND("mode_pwm3"); PRINT_MODULE_USAGE_COMMAND("mode_pwm3");
PRINT_MODULE_USAGE_COMMAND("mode_pwm3cap1"); PRINT_MODULE_USAGE_COMMAND("mode_pwm3cap1");
PRINT_MODULE_USAGE_COMMAND("mode_pwm2"); PRINT_MODULE_USAGE_COMMAND("mode_pwm2");
PRINT_MODULE_USAGE_COMMAND("mode_pwm2cap2"); PRINT_MODULE_USAGE_COMMAND("mode_pwm2cap2");
#endif #endif
#if defined(BOARD_HAS_PWM) #if defined(BOARD_HAS_PWM)
PRINT_MODULE_USAGE_COMMAND("mode_pwm1"); PRINT_MODULE_USAGE_COMMAND("mode_pwm1");
#endif #endif
PRINT_MODULE_USAGE_COMMAND_DESCR("telemetry", "Enable Telemetry on a UART"); PRINT_MODULE_USAGE_COMMAND_DESCR("telemetry", "Enable Telemetry on a UART");

View File

@@ -78,6 +78,7 @@ public:
MODE_5PWM1CAP, MODE_5PWM1CAP,
MODE_6PWM, MODE_6PWM,
MODE_8PWM, MODE_8PWM,
MODE_12PWM,
MODE_14PWM, MODE_14PWM,
MODE_4CAP, MODE_4CAP,
MODE_5CAP, MODE_5CAP,
@@ -90,6 +91,7 @@ public:
PORT_FULL_GPIO, PORT_FULL_GPIO,
PORT_FULL_PWM, PORT_FULL_PWM,
PORT_PWM14, PORT_PWM14,
PORT_PWM12,
PORT_PWM8, PORT_PWM8,
PORT_PWM6, PORT_PWM6,
PORT_PWM5, PORT_PWM5,

View File

@@ -256,6 +256,22 @@ int PWMOut::set_mode(Mode mode)
break; break;
#endif #endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12
case MODE_12PWM:
PX4_DEBUG("MODE_12PWM");
/* default output rates */
_pwm_default_rate = 50;
_pwm_alt_rate = 50;
_pwm_alt_rate_channels = 0;
_pwm_mask = 0xFFF;
_pwm_initialized = false;
_num_outputs = 12;
update_params();
break;
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14
case MODE_14PWM: case MODE_14PWM:
@@ -751,6 +767,9 @@ int PWMOut::ioctl(file *filp, int cmd, unsigned long arg)
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8
case MODE_8PWM: case MODE_8PWM:
#endif #endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12
case MODE_12PWM:
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14
case MODE_14PWM: case MODE_14PWM:
#endif #endif
@@ -1192,6 +1211,13 @@ int PWMOut::pwm_ioctl(file *filp, int cmd, unsigned long arg)
break; break;
#endif #endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12
case MODE_12PWM:
*(unsigned *)arg = 12;
break;
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8
case MODE_8PWM: case MODE_8PWM:
@@ -1292,6 +1318,10 @@ int PWMOut::pwm_ioctl(file *filp, int cmd, unsigned long arg)
ret = set_mode(MODE_8PWM); ret = set_mode(MODE_8PWM);
break; break;
case PWM_SERVO_MODE_12PWM:
ret = set_mode(MODE_12PWM);
break;
case PWM_SERVO_MODE_14PWM: case PWM_SERVO_MODE_14PWM:
ret = set_mode(MODE_14PWM); ret = set_mode(MODE_14PWM);
break; break;
@@ -1546,6 +1576,9 @@ int PWMOut::fmu_new_mode(PortMode new_mode)
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 8 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 8
servo_mode = PWMOut::MODE_8PWM; servo_mode = PWMOut::MODE_8PWM;
#endif #endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 12
servo_mode = PWMOut::MODE_12PWM;
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 14 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM == 14
servo_mode = PWMOut::MODE_14PWM; servo_mode = PWMOut::MODE_14PWM;
#endif #endif
@@ -1563,6 +1596,13 @@ int PWMOut::fmu_new_mode(PortMode new_mode)
servo_mode = PWMOut::MODE_14PWM; servo_mode = PWMOut::MODE_14PWM;
break; break;
#endif #endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12
case PORT_PWM12:
/* select 12-pin PWM mode */
servo_mode = PWMOut::MODE_12PWM;
break;
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8
case PORT_PWM8: case PORT_PWM8:
@@ -1986,7 +2026,12 @@ int PWMOut::custom_command(int argc, char *argv[])
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 8
} else if (!strcmp(verb, "mode_pwm8")) { } else if (!strcmp(verb, "mode_pwm8")) {
new_mode = PORT_PWM14; new_mode = PORT_PWM8;
#endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 12
} else if (!strcmp(verb, "mode_pwm12")) {
new_mode = PORT_PWM12;
#endif #endif
#if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14 #if defined(BOARD_HAS_PWM) && BOARD_HAS_PWM >= 14
@@ -2042,6 +2087,8 @@ int PWMOut::print_status()
case MODE_8PWM: mode_str = "pwm8"; break; case MODE_8PWM: mode_str = "pwm8"; break;
case MODE_12PWM: mode_str = "pwm12"; break;
case MODE_14PWM: mode_str = "pwm14"; break; case MODE_14PWM: mode_str = "pwm14"; break;
case MODE_4CAP: mode_str = "cap4"; break; case MODE_4CAP: mode_str = "cap4"; break;
@@ -2113,6 +2160,9 @@ mixer files.
# if BOARD_HAS_PWM >= 14 # if BOARD_HAS_PWM >= 14
PRINT_MODULE_USAGE_COMMAND("mode_pwm14"); PRINT_MODULE_USAGE_COMMAND("mode_pwm14");
# endif # endif
# if BOARD_HAS_PWM >= 12
PRINT_MODULE_USAGE_COMMAND("mode_pwm12");
# endif
# if BOARD_HAS_PWM >= 8 # if BOARD_HAS_PWM >= 8
PRINT_MODULE_USAGE_COMMAND("mode_pwm8"); PRINT_MODULE_USAGE_COMMAND("mode_pwm8");
# endif # endif

View File

@@ -70,6 +70,7 @@ enum PortMode {
PORT_FULL_GPIO, PORT_FULL_GPIO,
PORT_FULL_PWM, PORT_FULL_PWM,
PORT_PWM14, PORT_PWM14,
PORT_PWM12,
PORT_PWM8, PORT_PWM8,
PORT_PWM6, PORT_PWM6,
PORT_PWM5, PORT_PWM5,
@@ -109,6 +110,7 @@ public:
MODE_5PWM1CAP, MODE_5PWM1CAP,
MODE_6PWM, MODE_6PWM,
MODE_8PWM, MODE_8PWM,
MODE_12PWM,
MODE_14PWM, MODE_14PWM,
MODE_4CAP, MODE_4CAP,
MODE_5CAP, MODE_5CAP,