Path: blob/master/libraries/AP_DAC/AP_DAC_MCP40D1x.cpp
4182 views
/*1DAC backend for MCP40D1x I2C DACs2*/3#include "AP_DAC_config.h"45#if AP_DAC_MCP40D1X_ENABLED67#include "AP_DAC.h"8#include "AP_DAC_MCP40D1x.h"910#include <AP_HAL/utility/sparse-endian.h>11#include <GCS_MAVLink/GCS.h>12#include <AP_HAL/I2CDevice.h>1314// common registers1516#define MCP40D1x_ADDR 0x2E17#define REG_MCP40D1x_NOP 0x0018#define REG_MCP40D1x_WIPER_DEFAULT 0x3F1920#ifndef AP_DAC_MCP40D1X_CONVERSION_EQ21#define AP_DAC_MCP40D1X_CONVERSION_EQ(vo,vr) (vo * 127 / vr)22#endif2324extern const AP_HAL::HAL &hal;2526void AP_DAC_MCP40D1x::init(void)27{28if (params.bus_address <= 0) {29GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "MCP40D1x must be >0");30return;31}32if (!dev) {33dev = hal.i2c_mgr->get_device_ptr(params.bus, params.bus_address, 100000, true, 20);34}3536if (!dev) {37GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "MCP40D1x device is null at %u:%", unsigned(params.bus), unsigned(params.bus_address));38return;39}4041WITH_SEMAPHORE(dev->get_semaphore());4243dev->set_speed(AP_HAL::Device::SPEED_HIGH);4445uint8_t wiper_default = 0;46if (!dev->read_registers(REG_MCP40D1x_NOP, &wiper_default, 1)) {47GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "MCP40D1x not found at %u:%x", unsigned(params.bus), unsigned(params.bus_address));48delete dev;49return;50}51initialized = true;52}5354void AP_DAC_MCP40D1x::update(void)55{56set_voltage(0, params.voltage);57}5859// set voltage for a channel60bool AP_DAC_MCP40D1x::set_voltage(uint8_t chan, float v)61{62if (!initialized) {63GCS_SEND_TEXT(MAV_SEVERITY_INFO, "MCP40D1x not initialized");64return false;65}6667// convert voltage to 7-bit value68uint8_t wiper = uint8_t(roundf(AP_DAC_MCP40D1X_CONVERSION_EQ(v, params.voltage_reference)));69if (wiper > 127) {70wiper = 127;71}7273// Currently only suitable for AP_Periph as called from the main thread74WITH_SEMAPHORE(dev->get_semaphore());7576// write to data register first77if (!dev->write_register(REG_MCP40D1x_NOP, wiper, true)) {78GCS_SEND_TEXT(MAV_SEVERITY_INFO, "MCP40D1x wiper write fail: %x", unsigned(wiper));79return false;80}8182return true;83}8485#endif // AP_DAC_MCP40D1X_ENABLED868788