The project is a fast lock in amplifier (LIA) which can update its output at rate of 1000 measurements/s. It performs digital dual mixing and filtering to obtain a DC value proportional to the AC input signal.

Dependencies:   N5110 mbed

Revision:
0:4e20939af8bb
Child:
1:bf693859586c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Mon Aug 21 11:22:14 2017 +0000
@@ -0,0 +1,282 @@
+/**
+@file main.h
+@brief Header file contains functions and variables
+@brief Fast Lock-In Amplifier - AC to DC converter
+@brief Revision 1.0
+@author Nikollao Sulollari
+@Date 16/08/2017
+*/
+
+#ifndef MAIN_H
+#define MAIN_H
+#include "mbed.h"
+
+#define DIRECTION_TOLERANCE 0.05
+
+/**
+@namespace aout
+@brief Analog output DC filtered value 
+*/
+AnalogOut aout(DAC0_OUT);
+
+/**
+@namespace gpo
+@brief Digital output set the D0 pin High/Low
+*/
+DigitalOut gpo(D0);
+
+/**
+@namespace ain
+@brief analog input which is the signal from the bolometer (THz detector)
+*/
+AnalogIn ain(A0);
+
+/**
+@namespace dref
+@brief event triggered interrupt used to calculate the reference frequency
+*/
+InterruptIn dref(D6);
+
+/**
+@namespace amp_ticker
+@brief time-triggered interrupt calculates the amplitude of the input signal
+*/
+Ticker offset_ticker;
+
+/**
+@namespace sample_ticker
+@brief time-triggered interrupt samples internal sine and cosine signals
+*/
+Ticker sample_ticker;
+
+/**
+@namespace output_ticker
+@brief time-triggered interrupt updates the output of Fast LIA 
+*/
+Ticker output_ticker;
+
+/**
+@namespace period_timer
+@brief timer is used to calculate the frequency of the input square wave
+*/
+Timer period_timer;
+
+
+/**
+@namespace period_timer
+@brief timer updates the output of the LIA depending on the time constant
+*/
+Timer output_timer;
+/**
+@namespace lcd
+@brief object of the N5110 class
+*/
+//N5110 lcd(PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3);
+
+
+/**
+@namespace pc
+@brief serial connection between mbed and pc
+*/
+Serial pc(USBTX,USBRX);
+
+/**
+@namespace DirectionName
+@brief define joystick's direction based on its x,y values
+*/
+enum DirectionName {
+    UP,
+    DOWN,
+    LEFT,
+    RIGHT,
+    CENTRE,
+};
+
+/**
+@namespace Joystick
+@brief create strcut Joystick
+*/
+typedef struct JoyStick Joystick;
+struct JoyStick {
+    double x;    /// current x value
+    double x0;   /// 'centred' x value
+    double y;    /// current y value
+    double y0;   /// 'centred' y value
+    int button; /// button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
+    DirectionName direction;  // current direction
+};
+/// create struct variable
+Joystick joystick;
+
+/**
+set-up serial port
+*/
+void init_serial();
+
+/**
+initialise lcd and serial
+*/
+void program_init();
+
+/**
+use MCU in High Power Mode and set Core, ADC, and BUS clocks at max
+*/
+void setupK64Fclocks();
+
+/**
+initialise DAC pin, otherwise AnalogOut (dac0_out) does not work
+*/
+void initDAC();
+
+/**
+ISR sets flag to find Amplitude of bolometer signal
+*/
+void findAmplitude();
+
+/**
+find the amplitude of the analog bolometer signal
+*/
+double max(int points);
+
+double mavg_filter(int filt_points);
+
+/**
+ISR sets flag to update LIA output
+*/
+void updateOutput();
+
+/**
+ISR sets flag to mix signals
+*/
+void mixSignals();
+
+/**
+performs digital mixing with refX and refY components 
+*/
+void digitalMix(double remove_offset);
+
+/**
+moving average filter with n points (n = 17)
+*/
+void filterSignal(int averages);
+
+/**
+ISR calculates the DigitalIn signal frequency
+*/
+void voltageRise();
+
+/**
+ISR calculates the offset of the bolometer signal
+*/
+void offset_isr();
+
+void output_isr();
+
+double calculate_constant(double freq_ref);
+
+/*!< used to assign the amplitude of the bolometer signal */
+volatile double amplitude = 0; 
+
+/*!< used to find the offset of the input signal */
+volatile double outDC = 0;
+
+/*!< stores the period of the input digital signal */
+volatile double ref_period = 0;
+
+/*!< stores the frequency of the input digital signal */
+volatile double ref_freq = 0;
+
+/*!< counter is used to find take between two rises of digital signal*/
+volatile int g_counter = 1; 
+
+/*!< flag is set from ISR to find offset of the bolometer signal */
+volatile int g_offset_flag = 0;
+
+/*!< sampling period to take n samples and find bolometer signal amplitude */
+volatile double amplitude_delay = 0;
+
+/*!< flag used to update output */
+volatile int g_output_flag = 0;
+
+/*!< flag used to sample internal sine/cosine signals */
+volatile int g_sample_flag = 0;
+
+/*!< array stores the square root of X^2 and Y^2 */
+volatile double R[16];
+
+/*!< store the bolometer signal and find max value */
+double bolometer_signal[8];
+
+/*!< store the bolometer signal and find max value */
+double bol_signal;
+//int size = 16;
+
+/*!< variable used if a sine/cosine of 8 discrete values is used */
+int samples8 = 8;
+
+/*!< variable used if a sine/cosine of 17 discrete values is used */
+int samples16 = 16;
+
+/*!< variable used if a sine/cosine of 32 discrete values is used */
+int samples32 = 32;
+
+/*!< sampling frequency of the internal sine/cosine waves */
+double sample_freq = 0;
+
+/*!< variable used to sample the internal sine/cosine waves */
+double sample_time = 0;
+
+/*!< number of samples for the amplitude of the bolometer signal */
+int amp_points = 32;
+
+/*!< sampling freq to find the amplitude of the bolomter signal */
+double delay_freq = 0;
+
+/*!< read the timer and if it is equal to the time constant update output */
+double time_out = 0;
+
+int filter_points = 500;
+
+double offset = 0;
+
+/*!< sine wave array with 32 values */
+static double sin_array32[32] = {0, 0.1951, 0.3827, 0.5556, 0.7071, 0.8315, 0.9239,
+                                 0.9808, 1, 0.9808, 0.9239, 0.8315, 0.7071, 0.5556,
+                                 0.3827, 0.1951, 0, -0.1951, -0.3827, -0.5556, -0.7071,
+                                 -0.8315, -0.9239, -0.9808, -1, -0.9808, -0.9239, -0.8315,
+                                 -0.7071, -0.5556, -0.3827, -0.1951
+                                };
+
+/*!< cosine wave array with 32 values */
+static double cos_array32[32] = {1, 0.9808, 0.9239, 0.8315, 0.7071, 0.5556,
+                                 0.3827, 0.1951, 0, -0.1951, -0.3827, -0.5556, -0.7071,
+                                 -0.8315, -0.9239, -0.9808, -1, -0.9808, -0.9239, -0.8315,
+                                 -0.7071, -0.5556, -0.3827, -0.1951, 0, 0.1951, 0.3827,
+                                 0.5556, 0.7071, 0.8315, 0.9239, 0.9808
+                                };
+
+/*!< sine wave array with 17 values */
+static double sin_array16[16] = {0, 0.3827, 0.7071, 0.9239, 1, 0.9239, 0.7071,
+                                 0.3827, 0, -0.3827, -0.7071, -0.9239, -1, -0.9239
+                                 ,-0.7071, -0.3827,
+                                };
+
+/*!< sine wave array with delay and 16 values, used for testing output */
+static double sin_array16delay[16] = {0.7071, 0.9239, 1, 0.9239, 0.7071,
+                               0.3827, 0, -0.3827, -0.7071, -0.9239, -1, -0.9239
+                               ,-0.7071, -0.3827, 0, 0.3827
+                              }; 
+
+/*!< cosine wave array with 17 values */
+static double cos_array16[16] = {1, 0.9239, 0.7071,
+                                 0.3827, 0, -0.3827, -0.7071, -0.9239, -1, -0.9239
+                                 ,-0.7071, -0.3827, 0, 0.3827, 0.7071, 0.9239, 
+                                };
+
+/*!< sine wave array with 8 values */
+static double sin_array8[8] = {0, 0.7071, 1, 0.7071, 0, -0.7071, -1, -0.7071};
+
+/*!< cosine wave array with 8 values */
+static double cos_array8[8] = {1, 0.7071, 0, -0.7071, -1, -0.7071, 0, 0.7071};
+
+#endif
\ No newline at end of file