From a02eb49fa19be57ff6b8e989a477d4f8a8450dab Mon Sep 17 00:00:00 2001 From: Markus Rosenstihl Date: Wed, 25 Nov 2015 16:39:34 +0000 Subject: [PATCH] added preliminary AD5791 driver --- drivers/Makefile | 2 +- machines/Makefile | 20 +++++ machines/fc2_backend_AD5791.cpp | 150 ++++++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 machines/fc2_backend_AD5791.cpp diff --git a/drivers/Makefile b/drivers/Makefile index 9da712b..058ecce 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -10,7 +10,7 @@ CXXFLAGS=-O0 -g -Wall -Wshadow -pedantic CXXCPPFLAGS=-I. -I.. #ToDo PBP-HS3-test.exe -SUBDIRS:=SpinCore-PulseBlaster SpinCore-PulseBlaster24Bit SpinCore-PulseBlasterDDSIII PTS-Synthesizer Eurotherm-2000Series dummy Spectrum-MI40xxSeries Spectrum-M2i40xxSeries Tecmag-DAC20 +SUBDIRS:=SpinCore-PulseBlaster SpinCore-PulseBlaster24Bit SpinCore-PulseBlasterDDSIII PTS-Synthesizer Eurotherm-2000Series dummy Spectrum-MI40xxSeries Spectrum-M2i40xxSeries Tecmag-DAC20 DAC-AD5791 ifeq ($(shell /bin/uname -o),Cygwin) SUBDIRS+=TiePie-HS3 Datel-PCI416 endif diff --git a/machines/Makefile b/machines/Makefile index 728fe62..0870ba3 100644 --- a/machines/Makefile +++ b/machines/Makefile @@ -21,6 +21,7 @@ MACHINES = \ magnexgrad_backend_dds \ PFGcore$(EXEEXT) \ fc2_backend$(EXEEXT) \ + fc2_backend_AD5791$(EXEEXT) \ fc1neu_backend$(EXEEXT) \ bg_backend \ Mobilecore$(EXEEXT) \ @@ -32,6 +33,7 @@ DRV_SPC_MI40xx = ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.a DRV_SPC_M2i40xx = ../drivers/Spectrum-M2i40xxSeries/Spectrum-M2i40xxSeries.a DRV_PTS = ../drivers/PTS-Synthesizer/PTS.o DRV_DAC20 = ../drivers/Tecmag-DAC20/DAC20.o +DRV_AD5791 = ../drivers/DAC-AD5791/AD5791.o DRV_PB_24BIT = ../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.o DRV_PB_DDSIII = ../drivers/SpinCore-PulseBlasterDDSIII/SpinCore-PulseBlasterDDSIII.o DRV_PB = ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.o @@ -90,6 +92,9 @@ $(DRV_PTS): $(DRV_DAC20): $(MAKE) -C ../drivers/Tecmag-DAC20 DAC20.o +$(DRV_AD5791): + $(MAKE) -C ../drivers/DAC-AD5791 AD5791.o + $(DRV_SPC_MI40xx): $(MAKE) -C ../drivers/Spectrum-MI40xxSeries Spectrum-MI40xxSeries.o @@ -247,6 +252,21 @@ fc2_backend.o: fc2_backend.cpp \ ../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h ../drivers/Tecmag-DAC20/DAC20.h\ ../core/stopwatch.h ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h +# fc2 with AD5791 + +fc2_backend_AD5791$(EXEEXT): fc2_backend_AD5791.o \ + hardware.o \ + $(DRV_SPC_MI40xx) \ + $(DRV_PTS) \ + $(DRV_AD5791) \ + $(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \ + ../core/core.a + @$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread + +fc2_backend_AD5791.o: fc2_backend_AD5791.cpp \ +../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h ../drivers/DAC-AD5791/AD5791.h\ +../core/stopwatch.h ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h + berta: berta.o \ hardware.o \ $(DRV_SPC_MI40xx) \ diff --git a/machines/fc2_backend_AD5791.cpp b/machines/fc2_backend_AD5791.cpp new file mode 100644 index 0000000..7add8bf --- /dev/null +++ b/machines/fc2_backend_AD5791.cpp @@ -0,0 +1,150 @@ +/* ************************************************************************** + + Author: Achim Gaedke + Created: June 2004 + + ****************************************************************************/ +#include "machines/hardware.h" +#include "core/core.h" +#include "drivers/DAC-AD5791/AD5791.h" +#include "drivers/PTS-Synthesizer/PTS.h" +#include "drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h" +#include "drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h" + +/** + \defgroup fc2machine FC2 NMR Spectrometer + \ingroup machines + Uses Spincore Pulseblaster 24 Bit and Spectrum MI4021, and some DACs + + \par Starting the hardware + This procedure should assure the correct initialisation of the hardware: + \li Switch off main switches of SpinCore Pulseblaster and Computer (the main switch of the computer is at the rear) + \li Switch on Computer and start Windows or linux + + @{ + */ + +/** + line 0 for gate + line 1 for pulse + line 22 for trigger + line 3 free + */ +class FC2_hardware: public hardware +{ + + SpinCorePulseBlaster24Bit* my_pulseblaster; + SpectrumMI40xxSeries* my_adc; + +public: + FC2_hardware() + { + ttlout trigger; + trigger.id = 0; + trigger.ttls = 0x400000; /* line 22 */ // + my_adc = new SpectrumMI40xxSeries(trigger); + my_pulseblaster = new SpinCorePulseBlaster24Bit(0, 1e8, 0x800000); + PTS* my_pts = new PTS_latched(0); // ID of PTS_analogout 0 + the_fg = my_pts; + the_pg = my_pulseblaster; + the_adc = my_adc; +/* AD5791* dac; + dac = new AD5791(1); + dac->set_latch_bit(17); + list_dacs.push_back(dac); + dac = new AD5791(2); + dac->set_latch_bit(19); + list_dacs.push_back(dac); +*/ + } + + result* experiment(const state& exp) + { + result* r = NULL; + for (size_t tries = 0; r == NULL && core::term_signal == 0 && tries < 102; ++tries) + { + state* work_copy = exp.copy_flat(); + if (work_copy == NULL) + return new error_result(1, "could create work copy of experiment sequence"); + try + { + if (the_fg != NULL) + the_fg->set_frequency(*work_copy); + if (the_adc != NULL) + the_adc->set_daq(*work_copy); + experiment_prepare_dacs(work_copy); + // the pulse generator is necessary + my_pulseblaster->run_pulse_program_w_sync(*work_copy, my_adc->get_sample_clock_frequency()); + // wait for pulse generator + the_pg->wait_till_end(); + // after that, the result must be available + if (the_adc != NULL) + r = the_adc->get_samples(); + else + r = new adc_result(1, 0, NULL); + } + catch (const RecoverableException &e) + { + r = new error_result(1, e.what()); + } + delete work_copy; + if (core::quit_signal != 0) + break; + } + return r; + } + + virtual ~FC2_hardware() + { + if (the_adc != NULL) + delete the_adc; + if (the_pg != NULL) + delete the_pg; + if (the_fg != NULL) + delete the_fg; + } +}; + +/** + \brief brings standard core together with the Mobile NMR hardware + */ +class FC2_core: public core +{ + std::string the_name; +public: + FC2_core(const core_config& conf) : + core(conf), + the_name("FC2 core") + { + the_hardware = new FC2_hardware(); + } + + virtual const std::string& core_name() const + { + return the_name; + } +}; + +/** + @} + */ + +int main(int argc, const char** argv) +{ + int return_result = 0; + try + { + core_config my_conf(argv, argc); + // setup input and output + FC2_core my_core(my_conf); + // start core application + my_core.run(); + } + catch (const DamarisException& e) + { + fprintf(stderr, "%s\n", e.what()); + return_result = 1; + } + + return return_result; +}