diff --git a/+adi/+AD7124/Base.m b/+adi/+AD7124/Base.m new file mode 100644 index 0000000..05aef88 --- /dev/null +++ b/+adi/+AD7124/Base.m @@ -0,0 +1,119 @@ +classdef Base < adi.common.Rx & adi.common.RxTx & ... + matlabshared.libiio.base & adi.common.Attribute & ... + adi.common.RegisterReadWrite & adi.common.Channel + % AD7124 Precision ADC Class + % AD7124-4 is a 8 channel ADC + % AD7124-8 is a 16 channel ADC + + properties (Nontunable) + % SampleRate Sample Rate + % Baseband sampling rate in Hz, specified as a scalar + % in samples per second. + SampleRate = '19200' + + % SamplesPerFrame Samples Per Frame + % Number of samples per frame, specified as an even positive + % integer. + SamplesPerFrame = 400 + end + + % isOutput + properties (Hidden, Nontunable, Access = protected) + isOutput = false + end + + properties (Nontunable, Hidden, Constant) + Type = 'Rx' + end + + properties (Nontunable, Hidden) + Timeout = Inf + kernelBuffersCount = 1 + dataTypeStr = 'int32' + phyDevName + devName + end + + properties (Hidden, Constant) + ComplexData = false + end + + methods + %% Constructor + function obj = Base(phydev,dev,varargin) + coder.allowpcode('plain'); + % Initialize the Rx object + obj = obj@matlabshared.libiio.base(varargin{:}); + obj.enableExplicitPolling = false; + obj.EnabledChannels = 1; + obj.BufferTypeConversionEnable = true; + obj.phyDevName = phydev; + obj.devName = dev; + + % Check if uri has been specified, else throw an error + uriFound = 0; + for i = 1:length(varargin) + if isequal(varargin{i}, 'uri') + if i == length(varargin) + break + else + uriArgIndex = find(contains([varargin{:}], 'uri')); + obj.uri = varargin{uriArgIndex + 1}; + uriFound = 1; + end + end + end + if uriFound == 0 + error("Error. \nUri was not supplied. Supply it in the" + ... + " following manner \n %s", ... + "adi.ADXXXX.Rx('uri', )"); + end + end + + function flush(obj) + % Flush the buffer + flushBuffers(obj); + end + + function delete(obj) + delete@adi.common.RxTx(obj); + end + + function set.SampleRate(obj, value) + % Set device sampling rate + obj.SampleRate = value; + if obj.ConnectedToDevice + obj.setDeviceAttributeRAW('sampling_frequency', value); + end + end + end + + %% API Functions + methods (Hidden, Access = protected) + function setupInit(obj) + % Write all attributes to device once connected through set + % methods + % Do writes directly to hardware without using set methods. + % This is required since Simulink support doesn't support + % modification to nontunable variables at SetupImpl + obj.setDeviceAttributeRAW('sampling_frequency',num2str(obj.SampleRate)); + end + end + + %% External Dependency Methods + methods (Hidden, Static) + function tf = isSupportedContext(bldCfg) + tf = matlabshared.libiio.ExternalDependency.isSupportedContext(bldCfg); + end + + function updateBuildInfo(buildInfo, bldCfg) + % Call the matlabshared.libiio.method first + matlabshared.libiio.ExternalDependency.updateBuildInfo(buildInfo, bldCfg); + end + + function bName = getDescriptiveName(~) + bName = 'AD7124 ADC'; + end + end + +end \ No newline at end of file diff --git a/+adi/+AD7124_4/Rx.m b/+adi/+AD7124_4/Rx.m new file mode 100644 index 0000000..028d841 --- /dev/null +++ b/+adi/+AD7124_4/Rx.m @@ -0,0 +1,27 @@ +classdef Rx < adi.common.Rx & adi.common.RxTx ... + & adi.AD7124.Base + % AD7124-4 Precision ADC Class + % adi.AD7124-4.Rx Receives data from the AD7124 ADC + % The adi.AD7124-4.Rx System object is a signal source that can receive + % data from the AD7124-4. + % + % rx = adi.AD7124_4.Rx; + % rx = adi.AD7124_4.Rx('uri','192.168.2.1'); + % + % AD7124-4 Datasheet + + properties (Nontunable, Hidden) + channel_names = {'voltage0','voltage1','voltage2'... + 'voltage3','voltage4','voltage5','voltage6','voltage7'}; + end + + methods + %% Constructor + function obj = Rx(varargin) + obj = obj@adi.AD7124.Base('ad7124-4','ad7124-4',varargin{:}); + end + end + + end + + \ No newline at end of file diff --git a/+adi/+AD7124_8/Rx.m b/+adi/+AD7124_8/Rx.m new file mode 100644 index 0000000..53369ed --- /dev/null +++ b/+adi/+AD7124_8/Rx.m @@ -0,0 +1,27 @@ +classdef Rx < adi.common.Rx & adi.common.RxTx ... + & adi.AD7124.Base + % AD7124-8 Precision ADC Class + % adi.AD7124-8.Rx Receives data from the AD7124 ADC + % The adi.AD7124-8.Rx System object is a signal source that can receive + % data from the AD7124-8. + % + % rx = adi.AD7124_8.Rx; + % rx = adi.AD7124_8.Rx('uri','192.168.2.1'); + % + % AD7124-8 Datasheet + + + properties (Nontunable, Hidden) + channel_names = {'voltage0','voltage1','voltage2','voltage3',... + 'voltage4','voltage5','voltage6','voltage7','voltage8','voltage9',... + 'voltage10','voltage11','voltage12','voltage13','voltage14','voltage15'}; + end + + methods + %% Constructor + function obj = Rx(varargin) + obj = obj@adi.AD7124.Base('ad7124-8','ad7124-8',varargin{:}); + end + end + +end \ No newline at end of file diff --git a/+adi/Contents.m b/+adi/Contents.m index 044e80c..472120d 100644 --- a/+adi/Contents.m +++ b/+adi/Contents.m @@ -18,4 +18,6 @@ % AD5780 - DAC % AD5781 - DAC % AD5790 - DAC -% AD5791 - DAC \ No newline at end of file +% AD5791 - DAC +% AD7124_4 - ADC +% AD7124_8 - ADC \ No newline at end of file diff --git a/CI/gen_doc/docs/gen_sysobj_doc.m b/CI/gen_doc/docs/gen_sysobj_doc.m index 3031e69..5bbba50 100644 --- a/CI/gen_doc/docs/gen_sysobj_doc.m +++ b/CI/gen_doc/docs/gen_sysobj_doc.m @@ -21,6 +21,8 @@ , {'AD5781', {'Tx'}}... , {'AD5790', {'Tx'}}... , {'AD5791', {'Tx'}}... + , {'AD7124_4', {'Rx'}}... + , {'AD7124_8', {'Rx'}}... %{'QuadMxFE',{'Rx','Tx'}}... }; diff --git a/examples/ad7124_DataCapture.m b/examples/ad7124_DataCapture.m new file mode 100644 index 0000000..3b93c91 --- /dev/null +++ b/examples/ad7124_DataCapture.m @@ -0,0 +1,24 @@ +%% Script for capturing and displaying a continuous set of samples from a +%% connected AD7124-4 board + +% Instantiate the system object +rx = adi.AD7124_8.Rx('uri','ip:analog.local'); + +% Samples per frame cannot exceed 500 if all 16 channels need to be captured on ad7124-8 +rx.SamplesPerFrame = 500; +rx.EnabledChannels = [1 2 3 4 5 6 7 8]; +rx.SampleRate = 19200; + +% Capture data +data = rx(); + +enabledChannels = size(data,2); +figure(1); +for i = 1:enabledChannels + subplot(enabledChannels, 1, i); + plot(data(1:rx.SamplesPerFrame, i)); + title("Channel " + num2str(rx.EnabledChannels(i))); +end + +% Delete the system object +release(rx); \ No newline at end of file