mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-27 06:13:34 +08:00
adc: publish system_power ORB topic from ADC
This commit is contained in:
committed by
Lorenz Meier
parent
ea5279389f
commit
6ea22c8c07
@@ -41,6 +41,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
#include <board_config.h>
|
||||||
#include <drivers/device/device.h>
|
#include <drivers/device/device.h>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@@ -64,6 +65,8 @@
|
|||||||
#include <systemlib/err.h>
|
#include <systemlib/err.h>
|
||||||
#include <systemlib/perf_counter.h>
|
#include <systemlib/perf_counter.h>
|
||||||
|
|
||||||
|
#include <uORB/topics/system_power.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Register accessors.
|
* Register accessors.
|
||||||
* For now, no reason not to just use ADC1.
|
* For now, no reason not to just use ADC1.
|
||||||
@@ -119,6 +122,8 @@ private:
|
|||||||
unsigned _channel_count;
|
unsigned _channel_count;
|
||||||
adc_msg_s *_samples; /**< sample buffer */
|
adc_msg_s *_samples; /**< sample buffer */
|
||||||
|
|
||||||
|
orb_advert_t _to_system_power;
|
||||||
|
|
||||||
/** work trampoline */
|
/** work trampoline */
|
||||||
static void _tick_trampoline(void *arg);
|
static void _tick_trampoline(void *arg);
|
||||||
|
|
||||||
@@ -134,13 +139,16 @@ private:
|
|||||||
*/
|
*/
|
||||||
uint16_t _sample(unsigned channel);
|
uint16_t _sample(unsigned channel);
|
||||||
|
|
||||||
|
// update system_power ORB topic, only on FMUv2
|
||||||
|
void update_system_power(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
ADC::ADC(uint32_t channels) :
|
ADC::ADC(uint32_t channels) :
|
||||||
CDev("adc", ADC_DEVICE_PATH),
|
CDev("adc", ADC_DEVICE_PATH),
|
||||||
_sample_perf(perf_alloc(PC_ELAPSED, "ADC samples")),
|
_sample_perf(perf_alloc(PC_ELAPSED, "ADC samples")),
|
||||||
_channel_count(0),
|
_channel_count(0),
|
||||||
_samples(nullptr)
|
_samples(nullptr),
|
||||||
|
_to_system_power(0)
|
||||||
{
|
{
|
||||||
_debug_enabled = true;
|
_debug_enabled = true;
|
||||||
|
|
||||||
@@ -290,6 +298,43 @@ ADC::_tick()
|
|||||||
/* scan the channel set and sample each */
|
/* scan the channel set and sample each */
|
||||||
for (unsigned i = 0; i < _channel_count; i++)
|
for (unsigned i = 0; i < _channel_count; i++)
|
||||||
_samples[i].am_data = _sample(_samples[i].am_channel);
|
_samples[i].am_data = _sample(_samples[i].am_channel);
|
||||||
|
update_system_power();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ADC::update_system_power(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_ARCH_BOARD_PX4FMU_V2
|
||||||
|
system_power_s system_power;
|
||||||
|
system_power.timestamp = hrt_absolute_time();
|
||||||
|
|
||||||
|
system_power.voltage5V_v = 0;
|
||||||
|
for (unsigned i = 0; i < _channel_count; i++) {
|
||||||
|
if (_samples[i].am_channel == 4) {
|
||||||
|
// it is 2:1 scaled
|
||||||
|
system_power.voltage5V_v = _samples[i].am_data * (6.6f / 4096);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// these are not ADC related, but it is convenient to
|
||||||
|
// publish these to the same topic
|
||||||
|
system_power.usb_connected = stm32_gpioread(GPIO_OTGFS_VBUS);
|
||||||
|
|
||||||
|
// note that the valid pins are active low
|
||||||
|
system_power.brick_valid = !stm32_gpioread(GPIO_VDD_BRICK_VALID);
|
||||||
|
system_power.servo_valid = !stm32_gpioread(GPIO_VDD_SERVO_VALID);
|
||||||
|
|
||||||
|
// OC pins are active low
|
||||||
|
system_power.periph_5V_OC = !stm32_gpioread(GPIO_VDD_5V_PERIPH_OC);
|
||||||
|
system_power.hipower_5V_OC = !stm32_gpioread(GPIO_VDD_5V_HIPOWER_OC);
|
||||||
|
|
||||||
|
/* lazily publish */
|
||||||
|
if (_to_system_power > 0) {
|
||||||
|
orb_publish(ORB_ID(system_power), _to_system_power, &system_power);
|
||||||
|
} else {
|
||||||
|
_to_system_power = orb_advertise(ORB_ID(system_power), &system_power);
|
||||||
|
}
|
||||||
|
#endif // CONFIG_ARCH_BOARD_PX4FMU_V2
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t
|
uint16_t
|
||||||
|
|||||||
Reference in New Issue
Block a user