REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
signal_generator.cpp
Go to the documentation of this file.
1
3
5 : digital_analog_converter(bus::address_from_tuple(2, DAC_IDX)),
6 function_generator(bus::address_from_tuple(2, FUNCTION_GENERATOR_IDX)) {}
7
9 installed = digital_analog_converter.init() && function_generator.init();
10 return installed;
11}
12
13FLASHMEM void platform::TeensySignalGenerator::set_frequency(float frequency) { _frequency = frequency; }
14
15FLASHMEM void platform::TeensySignalGenerator::set_phase(float phase) { _phase = phase; }
16
17FLASHMEM void platform::TeensySignalGenerator::set_wave_form(WaveForm wave_form) { _wave_form = wave_form; }
18
19FLASHMEM bool platform::TeensySignalGenerator::set_amplitude(float amplitude) {
20 if (amplitude < 0.0f || amplitude > 1.0f)
21 return false;
22 _amplitude = amplitude;
23 return true;
24}
25
27 return set_square_voltage_low(low) && set_square_voltage_high(high);
28}
29
31 if (fabs(low) > 1.0f)
32 return false;
33 _square_low_voltage = low;
34 return true;
35}
36
38 if (fabs(high) > 1.0f)
39 return false;
40 _square_high_voltage = high;
41 return true;
42}
43
45 if (fabs(offset) > 1.0f)
46 return false;
47 _offset = offset;
48 return true;
49}
50
52 return function_generator.get_real_frequency();
53}
54
56 return function_generator.get_real_phase();
57}
58
59FLASHMEM float platform::TeensySignalGenerator::get_frequency() const { return _frequency; }
60
61FLASHMEM float platform::TeensySignalGenerator::get_phase() const { return _phase; }
62
63FLASHMEM WaveForm platform::TeensySignalGenerator::get_wave_form() const { return _wave_form; }
64
65FLASHMEM float platform::TeensySignalGenerator::get_amplitude() const { return _amplitude; }
66
67FLASHMEM float platform::TeensySignalGenerator::get_square_voltage_low() const { return _square_low_voltage; }
68
70 return _square_high_voltage;
71}
72
73FLASHMEM float platform::TeensySignalGenerator::get_offset() const { return _offset; }
74
75FLASHMEM bool platform::TeensySignalGenerator::get_sleep() const { return _sleep; }
76
77FLASHMEM float platform::TeensySignalGenerator::get_dac_out0() const { return _dac_out0; }
78
79FLASHMEM float platform::TeensySignalGenerator::get_dac_out1() const { return _dac_out1; }
80
81FLASHMEM void platform::TeensySignalGenerator::sleep() { _sleep = true; }
82
83FLASHMEM void platform::TeensySignalGenerator::awake() { _sleep = false; }
84
86 if (fabs(value) > 1.0f)
87 return false;
88 _dac_out0 = value;
89 return true;
90}
91
93 if (fabs(value) > 1.0f)
94 return false;
95 _dac_out1 = value;
96 return true;
97}
98
99// TODO: Implement smart write to hardware for signal generator
101 if (_sleep)
102 function_generator.sleep();
103 else
104 function_generator.awake();
105
106 function_generator.write_frequency(_frequency);
107 function_generator.write_phase(_phase);
108 function_generator.write_wave_form(_wave_form);
109
110 if (!digital_analog_converter.set_channel(DAC_AMPLITUDE_CH, (1.0f - _amplitude) * 2.5f))
111 return utils::status(-1, "FP DAC");
112 if (!digital_analog_converter.set_channel(DAC_SQUARE_LOW_CH,
113 _map_dac_levelshift(_square_low_voltage * 2.0f)))
114 return utils::status(-2, "FP DSLC");
115 if (!digital_analog_converter.set_channel(DAC_SQUARE_HIGH_CH,
116 _map_dac_levelshift(_square_high_voltage * 2.0f)))
117 return utils::status(-3, "FP DSHC");
118 if (!digital_analog_converter.set_channel(DAC_OFFSET_CH, _map_dac_levelshift(_offset * 2.0f)))
119 return utils::status(-4, "FP DOC");
120 if (!digital_analog_converter.set_channel(DAC_OUT0_CH, _map_dac_levelshift(_dac_out0 * 2.0f)))
121 return utils::status(-5, "FP DO0C");
122 if (!digital_analog_converter.set_channel(DAC_OUT1_CH, _map_dac_levelshift(_dac_out1 * 2.0f)))
123 return utils::status(-6, "FP DO1C");
124
125 delay(50);
126 return utils::status::success();
127}
float get_frequency() const override
float get_real_frequency() const override
Returns the actually set frequency of the function generator, containing rounding errors.
bool set_offset(float offset) override
Sets the constant offset of the sine or triangle output in machine units.
utils::status write_to_hardware() override
float get_dac_out1() const override
bool set_dac_out0(float value) override
Writes the DACout0 constant voltage output. Possible values are: [-2V, 2V].
float get_square_voltage_high() const override
float get_square_voltage_low() const override
void sleep() override
Sets the sine / triangle output of the function generator to zero.
bool set_square_voltage_high(float high) override
Sets the upper value of the square output in machine units.
bool set_square_voltage_levels(float low, float high) override
Sets the lower and upper value of the square output in machine units.
bool init() override
Initializes the signal generator and puts it to sleep.
void set_frequency(float frequency) override
Sets the frequency of the sine / triangle output in Hz.
void set_wave_form(WaveForm wave_form) override
Sets the wave form of the function generator output.
float get_offset() const override
float get_real_phase() const override
Returns the actually set phase of the function generator, containing rounding errors.
bool set_amplitude(float amplitude) override
Sets the amplitude of the sine or triangle wave in machine units.
void awake() override
Resumes outputs of the function generator to regular operation, according to the previously specified...
float get_amplitude() const override
WaveForm get_wave_form() const override
bool set_square_voltage_low(float low) override
Sets the lower value of the square output in machine units.
float get_dac_out0() const override
void set_phase(float phase) override
Sets the phase of the frequency outputs synchronised to the reset pin.
bool set_dac_out1(float value) override
Writes the DACout1 constant voltage output. Possible values are: [-2V, 2V].
Definition bus.h:21