REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
AD5452.cpp
Go to the documentation of this file.
1// Copyright (c) 2024 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
4
5#include "AD5452.h"
6
7const SPISettings functions::AD5452::DEFAULT_SPI_SETTINGS{4'000'000, MSBFIRST, SPI_MODE1};
8
9functions::AD5452::AD5452(bus::addr_t address) : DataFunction(address, DEFAULT_SPI_SETTINGS) {}
10
11functions::AD5452::AD5452(bus::addr_t base_addr, uint8_t func_addr_shift)
12 : AD5452(bus::increase_function_idx(base_addr, func_addr_shift)) {}
13
14uint16_t functions::AD5452::float_to_raw(float scale) {
15 if (scale <= MIN_FACTOR)
16 return RAW_MIN;
17 if (scale >= MAX_FACTOR)
18 return RAW_MAX;
19
20 return static_cast<uint16_t>(roundf(map(scale, MIN_FACTOR, MAX_FACTOR, RAW_MIN, RAW_MAX)));
21}
22
24 return map(static_cast<float>(raw), RAW_MIN, RAW_MAX, MIN_FACTOR, MAX_FACTOR);
25}
26
27void functions::AD5452::set_scale(uint16_t scale_raw) {
28 begin_communication();
29 // AD5452 expects at least 13ns delay between chip select and data
30 delayNanoseconds(15);
31 bus::spi.transfer16(scale_raw << 2);
32 end_communication();
33}
34
35void functions::AD5452::set_scale(float scale) { return set_scale(float_to_raw(scale)); }
The AD5452 is the 12-Bit Multiplying DAC, used in the C-Block (one AD5452 per lane).
Definition AD5452.h:16
void set_scale(float scale)
Value gets clamped to min and max values.
Definition AD5452.cpp:35
static uint16_t float_to_raw(float scale)
Definition AD5452.cpp:14
static const SPISettings DEFAULT_SPI_SETTINGS
Definition AD5452.h:7
static float raw_to_float(uint16_t raw)
Definition AD5452.cpp:23
AD5452(bus::addr_t address)
Definition AD5452.cpp:9
A DataFunction class wraps SPI communication over the digital bus.
Definition functions.h:47
Definition bus.h:21
SPIClass & spi
Definition bus.cpp:10