REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
AD9834.cpp
Go to the documentation of this file.
1// Copyright (c) 2024 anabrid GmbH
2// Contact: https://www.anabrid.com/licensing/
3//
4// SPDX-License-Identifier: MIT OR GPL-2.0-or-later
5
6#include "AD9834.h"
7
8const SPISettings functions::AD9834::DEFAULT_SPI_SETTINGS{4'000'000, MSBFIRST, SPI_MODE2};
9
10functions::AD9834::AD9834(bus::addr_t address, uint8_t alt_function_idx)
11 : functions::DataFunction(address, alt_function_idx, DEFAULT_SPI_SETTINGS) {}
12
14 control_register |= CONTROL_B28;
15 control_register |= CONTROL_PINSW;
16 control_register |= CONTROL_SLEEP1;
17 control_register |= CONTROL_SLEEP12;
18 control_register |= CONTROL_DIV2;
19
21 get_raw_spi().transfer16(CONTROL_RESET);
22 get_raw_spi().transfer16(control_register);
24
25 // TODO: Check if pedantic mode can be implemented
26 return true;
27}
28
30 control_register |= CONTROL_SLEEP1;
31 control_register |= CONTROL_SLEEP12;
32
33 _write_control_register();
34}
35
37 control_register &= ~CONTROL_SLEEP1;
38 control_register &= ~CONTROL_SLEEP12;
39
40 _write_control_register();
41}
42
43void functions::AD9834::write_wave_form(WaveForm wave_form) {
44 switch (wave_form) {
45 case WaveForm::TRIANGLE:
46 control_register &= ~ENABLE_SQUARE_WAVE;
47 control_register |= ENABLE_TRIANGLE_WAVE;
48 break;
49 case WaveForm::SINE_AND_SQUARE:
50 control_register &= ~ENABLE_TRIANGLE_WAVE;
51 control_register |= ENABLE_SQUARE_WAVE;
52 break;
53 case WaveForm::SINE:
54 control_register &= ~ENABLE_TRIANGLE_WAVE;
55 control_register &= ~ENABLE_SQUARE_WAVE;
56 break;
57 }
58 _write_control_register();
59}
60
62 freq_register = static_cast<uint32_t>((freq * static_cast<float>(1 << 28)) / MASTER_CLK);
63
65 get_raw_spi().transfer16((freq_register & REG_FREQ_MASK) | REG_FREQ_0); // Frequency register 0 LSB
66 get_raw_spi().transfer16(((freq_register >> 14) & REG_FREQ_MASK) | REG_FREQ_0); // Frequency register 0 MSB
68}
69
71 phase_register = static_cast<uint16_t>(fmod(phase, 2.0f * PI) * 4096.0f / (2.0f * PI));
72
74 get_raw_spi().transfer16((phase_register & REG_PHASE_MASK) | REG_PHASE_0); // Phase register 0
76}
77
79 return static_cast<float>(freq_register * MASTER_CLK / static_cast<float>(1 << 28));
80}
81
83 return static_cast<float>(phase_register) / 4096.0f * 2.0f * PI;
84}
85
86void functions::AD9834::_write_control_register() const {
87 begin_communication();
88 get_raw_spi().transfer16(control_register);
89 end_communication();
90}
static constexpr uint16_t ENABLE_TRIANGLE_WAVE
Definition AD9834.h:40
static constexpr float MASTER_CLK
Definition AD9834.h:42
static constexpr uint16_t REG_PHASE_MASK
Definition AD9834.h:24
void write_phase(float phase)
Sets the phase of the outputs synchronised to the reset pin. Possible values are mapped to [0,...
Definition AD9834.cpp:70
static constexpr uint16_t CONTROL_SLEEP12
Definition AD9834.h:33
static constexpr uint16_t CONTROL_PINSW
Definition AD9834.h:30
void awake()
Resumes outputs to regular operation, according to the previously specified frequencies.
Definition AD9834.cpp:36
static constexpr uint16_t REG_FREQ_MASK
Definition AD9834.h:23
static constexpr uint16_t CONTROL_SLEEP1
Definition AD9834.h:32
void write_frequency(float freq)
Sets the frequency of the sine / triangle output in Hz.
Definition AD9834.cpp:61
float get_real_phase() const
Returns the actually set phase, containing rounding errors. Possible values are [0,...
Definition AD9834.cpp:82
AD9834(bus::addr_t address, uint8_t alt_function_idx)
Definition AD9834.cpp:10
void write_wave_form(WaveForm wave_form)
Sets the wave form of the function generator output.
Definition AD9834.cpp:43
void sleep()
Sets the sine / triangle output to zero. The square output will stay at high or low level.
Definition AD9834.cpp:29
bool init()
Initialises the chip and puts it into sleep mode.
Definition AD9834.cpp:13
static constexpr uint16_t CONTROL_DIV2
Definition AD9834.h:36
static constexpr uint16_t CONTROL_B28
Definition AD9834.h:26
static constexpr uint16_t REG_FREQ_0
Definition AD9834.h:18
DataFunction(bus::addr_t address, uint8_t alt_function_idx, const SPISettings &spiSettings)
Definition functions.cpp:24
static const SPISettings DEFAULT_SPI_SETTINGS
Definition AD9834.h:8
static constexpr uint16_t ENABLE_SQUARE_WAVE
Definition AD9834.h:39
float get_real_frequency() const
Returns the actually set frequency, containing rounding errors.
Definition AD9834.cpp:78
static constexpr uint16_t CONTROL_RESET
Definition AD9834.h:31
static constexpr uint16_t REG_PHASE_0
Definition AD9834.h:20
void end_communication() const
Definition functions.cpp:60
static SPIClass & get_raw_spi()
Definition functions.cpp:95
void begin_communication() const
Definition functions.cpp:31
const bus::addr_t address
Definition functions.h:23
uint32_t
Definition flasher.cpp:195
namespace for internal helpers
Definition icmd.h:6