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
16
17bool platform::interfaces::FrontPlaneSignalGeneratorHAL_Common::set_parameter(WaveForm form, uint8_t index, Parameter param, float value)
18{
19 if(form == WaveForm::SINE)
20 {
21 if(index > 0) return false;
22 return set_sine_param(param, value);
23 }
24 else if(form == WaveForm::SQUARE)
25 {
26 if(index > 0) return false;
27 return set_square_param(param, value);
28 }
29 else if(form == WaveForm::CONSTANT)
30 {
31 if(index > 1) return false;
32 return set_const_param(param, index, value);
33 }
34 return false;
35}
36
38{
39 if(param == Parameter::FREQUENCY)
40 return function_generator.get_real_frequency();
41
42 if(param == Parameter::PHASE)
43 return function_generator.get_real_phase();
44
45 return 0.0f;
46}
47
49{
50 if(enable) {
51 function_generator.awake();
52 }
53 else {
54 function_generator.sleep();
55 }
56
57 function_generator.write_wave_form(form);
58
59 return true;
60}
61
63{
64 if(param == Parameter::UPPER_BOUND)
65 return (last_status = write_pin(PINS::DAC_SQUARE_HIGH_CH, value * 2.0f, true)).is_ok();
66
67 if(param == Parameter::LOWER_BOUND)
68 return (last_status = write_pin(PINS::DAC_SQUARE_LOW_CH, value * 2.0f, true)).is_ok();
69
70 if(param == Parameter::FREQUENCY)
71 {
72 function_generator.write_frequency(value);
73 return true;
74 }
75
76 if(param == Parameter::PHASE)
77 {
78 function_generator.write_phase(value);
79 return true;
80 }
81
82 return false;
83}
84
86{
87 if(param == Parameter::VALUE && index == 0)
88 return (last_status = write_pin(PINS::DAC_OUT0_CH, value * 2.0f, true)).is_ok();
89
90 if(param == Parameter::VALUE && index == 1)
91 return (last_status = write_pin(PINS::DAC_OUT1_CH, value * 2.0f, true)).is_ok();
92
93 return false;
94}
95
96utils::status platform::interfaces::FrontPlaneSignalGeneratorHAL_Common::write_pin(PINS pin, float value, bool with_levelshift)
97{
98 const float hw_value = with_levelshift ? _map_dac_levelshift(value) : value;
99
100 if(!digital_analog_converter.set_channel(get_pin(pin), hw_value))
101 return utils::status(- pin - 1, pin_status_msg[pin]);
102
103 return utils::status::success();
104}
105
109
110platform::interfaces::FrontPlaneSignalGenerator::FrontPlaneSignalGenerator(platform::interfaces::SignalGeneratorHAL * hardware)
111: SignalGenerator(hardware) {}
112
114 installed = hardware->init();
115 return installed;
116}
117
118void platform::interfaces::FrontPlaneSignalGenerator::set_frequency(float frequency) { _frequency = frequency; }
119
121
122void platform::interfaces::FrontPlaneSignalGenerator::set_wave_form(WaveForm wave_form) { _wave_form = wave_form; }
123
125 if (amplitude < 0.0f || amplitude > 1.0f)
126 return false;
127 _amplitude = amplitude;
128 return true;
129}
130
134
136 if (fabs(low) > 1.0f)
137 return false;
138 _square_low_voltage = low;
139 return true;
140}
141
143 if (fabs(high) > 1.0f)
144 return false;
145 _square_high_voltage = high;
146 return true;
147}
148
150 if (fabs(offset) > 1.0f)
151 return false;
152 _offset = offset;
153 return true;
154}
155
157 return hardware->get_parameter(WaveForm::SINE_AND_SQUARE, Parameter::FREQUENCY);
158}
159
161 return hardware->get_parameter(WaveForm::SINE_AND_SQUARE, Parameter::PHASE);
162}
163
165
167
169
171
173
175 return _square_high_voltage;
176}
177
179
181
183
185
187
189
191 if (fabs(value) > 1.0f)
192 return false;
193 _dac_out0 = value;
194 return true;
195}
196
198 if (fabs(value) > 1.0f)
199 return false;
200 _dac_out1 = value;
201 return true;
202}
203
205 // LUCIDAC only supports enabling _all_ function generators at once, so it's pretty much
206 // irrelevant what signal we set here
207 hardware->toggle(!_sleep, _wave_form);
208
209 // set function generator parameters
210 if(!hardware->set_parameter(WaveForm::SINE, 0, Parameter::FREQUENCY, _frequency))
211 return hardware->status();
212
213 if(!hardware->set_parameter(WaveForm::SINE, 0, Parameter::PHASE, _phase))
214 return hardware->status();
215
216 // set DAC parameters
217 if(!hardware->set_parameter(WaveForm::SINE, 0, Parameter::AMPLITUDE, _amplitude))
218 return hardware->status();
219
220 if(!hardware->set_parameter(WaveForm::SINE, 0, Parameter::OFFSET, _offset))
221 return hardware->status();
222
223 if(!hardware->set_parameter(WaveForm::SQUARE, 0, Parameter::UPPER_BOUND, _square_high_voltage))
224 return hardware->status();
225
226 if(!hardware->set_parameter(WaveForm::SQUARE, 0, Parameter::LOWER_BOUND, _square_low_voltage))
227 return hardware->status();
228
229 if(!hardware->set_parameter(WaveForm::CONSTANT, 0, Parameter::VALUE, _dac_out0))
230 return hardware->status();
231
232 if(!hardware->set_parameter(WaveForm::CONSTANT, 1, Parameter::VALUE, _dac_out1))
233 return hardware->status();
234
235 delay(50);
236 return utils::status::success();
237}
virtual bool set_sine_param(Parameter param, float value)=0
virtual bool set_parameter(WaveForm form, uint8_t index, Parameter param, float value)
bool set_const_param(Parameter param, uint8_t index, float value)
utils::status 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 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 init() override
Initializes the signal generator and puts it to sleep.
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.
Definition bus.h:21
void index(awot::Request &req, awot::Response &res)
Definition server.cpp:120