REDAC HybridController
Firmware for LUCIDAC/REDAC Teensy
Loading...
Searching...
No Matches
signal_generator.cpp
Go to the documentation of this file.
1
3
7
11
13{
14 if (!digital_analog_converter.init())
15 return UnitResult::err("Errr front-plane digital analog converter init failed");
16 if (!function_generator.init())
17 return UnitResult::err("Errr front-plane digital functin generator failed");
18 return UnitResult::ok();
19}
20
21UnitResult platform::interfaces::FrontPlaneSignalGeneratorHAL_Common::set_parameter(WaveForm form, uint8_t index, Parameter param, float value)
22{
23 if(form == WaveForm::SINE)
24 {
25 if(index > 0) return UnitResult::err("Invalid sine index");
26 return set_sine_param(param, value);
27 }
28 else if(form == WaveForm::SQUARE)
29 {
30 if(index > 0) return UnitResult::err("Invalid square index");
31 return set_square_param(param, value);
32 }
33 else if(form == WaveForm::CONSTANT)
34 {
35 if(index > 1) return UnitResult::err("Invalid constant index");
36 return set_const_param(param, index, value);
37 }
38 return UnitResult::err("Unknown form");
39}
40
42{
43 if(param == Parameter::FREQUENCY)
44 return function_generator.get_real_frequency();
45
46 if(param == Parameter::PHASE)
47 return function_generator.get_real_phase();
48
49 return 0.0f;
50}
51
53{
54 if(enable) {
55 function_generator.awake();
56 }
57 else {
58 function_generator.sleep();
59 }
60
61 function_generator.write_wave_form(form);
62
63 return true;
64}
65
67{
68 if(param == Parameter::UPPER_BOUND)
69 return write_pin(PINS::DAC_SQUARE_HIGH_CH, value * 2.0f, true);
70
71 if(param == Parameter::LOWER_BOUND)
72 return write_pin(PINS::DAC_SQUARE_LOW_CH, value * 2.0f, true);
73
74 if(param == Parameter::FREQUENCY)
75 {
76 function_generator.write_frequency(value);
77 return UnitResult::ok();
78 }
79
80 if(param == Parameter::PHASE)
81 {
82 function_generator.write_phase(value);
83 return UnitResult::ok();
84 }
85
86 return UnitResult::err("Error front-plane: unknown param");
87}
88
90{
91 if(param == Parameter::VALUE && index == 0)
92 return write_pin(PINS::DAC_OUT0_CH, value * 2.0f, true);
93
94 if(param == Parameter::VALUE && index == 1)
95 return write_pin(PINS::DAC_OUT1_CH, value * 2.0f, true);
96
97 return UnitResult::ok();
98}
99
100UnitResult platform::interfaces::FrontPlaneSignalGeneratorHAL_Common::write_pin(PINS pin, float value, bool with_levelshift)
101{
102 const float hw_value = with_levelshift ? _map_dac_levelshift(value) : value;
103
104 if(!digital_analog_converter.set_channel(get_pin(pin), hw_value))
105 return UnitResult::err(pin_status_msg[pin]);
106
107 return UnitResult::ok();
108}
109
113
114platform::interfaces::FrontPlaneSignalGenerator::FrontPlaneSignalGenerator(platform::interfaces::SignalGeneratorHAL * hardware)
115: SignalGenerator(hardware) {}
116
118 installed = hardware->init();
119 if (installed)
120 return UnitResult::ok();
121 return UnitResult::err("Error front-panel failed.");
122}
123
124void platform::interfaces::FrontPlaneSignalGenerator::set_frequency(float frequency) { _frequency = frequency; }
125
127
128void platform::interfaces::FrontPlaneSignalGenerator::set_wave_form(WaveForm wave_form) { _wave_form = wave_form; }
129
131 if (amplitude < 0.0f || amplitude > 1.0f)
132 return false;
133 _amplitude = amplitude;
134 return true;
135}
136
140
142 if (fabs(low) > 1.0f)
143 return false;
144 _square_low_voltage = low;
145 return true;
146}
147
149 if (fabs(high) > 1.0f)
150 return false;
151 _square_high_voltage = high;
152 return true;
153}
154
156 if (fabs(offset) > 1.0f)
157 return false;
158 _offset = offset;
159 return true;
160}
161
163 return hardware->get_parameter(WaveForm::SINE_AND_SQUARE, Parameter::FREQUENCY);
164}
165
167 return hardware->get_parameter(WaveForm::SINE_AND_SQUARE, Parameter::PHASE);
168}
169
171
173
175
177
179
181 return _square_high_voltage;
182}
183
185
187
189
191
193
195
197 if (fabs(value) > 1.0f)
198 return false;
199 _dac_out0 = value;
200 return true;
201}
202
204 if (fabs(value) > 1.0f)
205 return false;
206 _dac_out1 = value;
207 return true;
208}
209
211 // LUCIDAC only supports enabling _all_ function generators at once, so it's pretty much
212 // irrelevant what signal we set here
213 hardware->toggle(!_sleep, _wave_form);
214
215 // set function generator parameters
216 TRY(hardware->set_parameter(WaveForm::SINE, 0, Parameter::FREQUENCY, _frequency));
217 TRY(hardware->set_parameter(WaveForm::SINE, 0, Parameter::PHASE, _phase));
218 // set DAC parameters
219 TRY(hardware->set_parameter(WaveForm::SINE, 0, Parameter::AMPLITUDE, _amplitude));
220 TRY(hardware->set_parameter(WaveForm::SINE, 0, Parameter::OFFSET, _offset));
221 TRY(hardware->set_parameter(WaveForm::SQUARE, 0, Parameter::UPPER_BOUND, _square_high_voltage));
222 TRY(hardware->set_parameter(WaveForm::SQUARE, 0, Parameter::LOWER_BOUND, _square_low_voltage));
223 TRY(hardware->set_parameter(WaveForm::CONSTANT, 0, Parameter::VALUE, _dac_out0));
224 TRY(hardware->set_parameter(WaveForm::CONSTANT, 1, Parameter::VALUE, _dac_out1));
225
226 delay(50);
227 return UnitResult::ok();
228}
UnitResult set_const_param(Parameter param, uint8_t index, float value)
UnitResult set_square_param(Parameter param, float value)
UnitResult write_pin(PINS pin, float value, bool with_levelshift=true)
static constexpr float _map_dac_levelshift(float x)
Remapping for the built in levelshift on some dac outputs.
virtual UnitResult set_parameter(WaveForm form, uint8_t index, Parameter param, float value)
virtual UnitResult set_sine_param(Parameter param, float value)=0
virtual float get_parameter(WaveForm form, Parameter param)
bool set_square_voltage_levels(float low, float high) override
Sets the lower and upper value of the square output in machine units.
void awake() override
Resumes outputs of the function generator to regular operation, according to the previously specified...
void set_wave_form(WaveForm wave_form) override
Sets the wave form of the function generator output.
void set_frequency(float frequency) override
Sets the frequency of the sine / triangle output in Hz.
bool set_square_voltage_high(float high) override
Sets the upper value of the square output in machine units.
bool set_dac_out0(float value) override
Writes the DACout0 constant voltage output. Possible values are: [-2V, 2V].
bool set_square_voltage_low(float low) override
Sets the lower value of the square output in machine units.
bool set_offset(float offset) override
Sets the constant offset of the sine or triangle output in machine units.
bool set_dac_out1(float value) override
Writes the DACout1 constant voltage output. Possible values are: [-2V, 2V].
bool set_amplitude(float amplitude) override
Sets the amplitude of the sine or triangle wave in machine units.
float get_real_frequency() const override
Returns the actually set frequency of the function generator, containing rounding errors.
void set_phase(float phase) override
Sets the phase of the frequency outputs synchronised to the reset pin.
FrontPlaneSignalGenerator(SignalGeneratorHAL *hardware)
FrontPlaneSignalGenerator.
float get_real_phase() const override
Returns the actually set phase of the function generator, containing rounding errors.
void sleep() override
Sets the sine / triangle output of the function generator to zero.
UnitResult init() override
Initializes the signal generator and puts it to sleep.
Definition bus.h:21
void index(awot::Request &req, awot::Response &res)
Definition server.cpp:120