Source code for denspp.offline.analog.amplifier.cur_amp

from dataclasses import dataclass
import numpy as np
from denspp.offline.analog.common_func import CommonAnalogFunctions
from denspp.offline.analog.dev_noise import ProcessNoise, SettingsNoise, RecommendedSettingsNoise


[docs] @dataclass class SettingsCUR: """Individual data class to configure the current amplifier Attributes: vdd: Positive supply voltage [V] vss: Negative supply voltage [V] fs_ana: Sampling frequency of input [Hz] transimpedance: Transimpedance value [V/A] offset_v: Offset voltage of current amplifier [V] offset_i: Offset current of current amplifier [A] noise_en: Enable noise on output [True / False] para_en: Enable parasitic [True / False] """ vdd: float vss: float fs_ana: float # Amplifier characteristics transimpedance: float offset_v: float offset_i: float # Settings for parasitic noise_en: bool para_en: bool
DefaultSettingsCUR = SettingsCUR( vdd=0.9, vss=-0.9, fs_ana=50e3, transimpedance=1e3, offset_v=1e-6, offset_i=1e-12, noise_en=False, para_en=False )
[docs] class CurrentAmplifier(CommonAnalogFunctions): _handler_noise: ProcessNoise _settings: SettingsCUR __print_device = "current amplifier" def __init__(self, settings_dev: SettingsCUR, settings_noise: SettingsNoise=RecommendedSettingsNoise) -> None: """Class for emulating an analogue current amplifier :param settings_dev: Dataclass for handling the current amplifier :param settings_noise: Dataclass for handling the noise and parasitic simulation """ super().__init__() self.define_voltage_range(volt_low=settings_dev.vss, volt_hgh=settings_dev.vdd) self._handler_noise = ProcessNoise(settings_noise, settings_dev.fs_ana) self._settings = settings_dev def __add_parasitic(self, size: int, resistance: float=1.0) -> np.ndarray: """""" u_para = np.zeros((size, )) u_para += self._settings.transimpedance * self._settings.offset_i u_para += self._settings.offset_v u_para += self.vcm # Adding noise if self._settings.noise_en: u_para += self._handler_noise.gen_noise_real_volt(size, resistance) return u_para
[docs] def transimpedance_amplifier(self, iin: np.ndarray, uref: np.ndarray | float) -> np.ndarray: """Performing the transimpedance amplifier (single, normal) with input signal Args: iin: Input current [A] uref: Negative input voltage [V] Returns: Corresponding numpy array with output voltage """ u_out = self._settings.transimpedance * iin + uref u_out += self.__add_parasitic(u_out.size) return self.clamp_voltage(u_out)
[docs] def instrumentation_amplifier(self, iin: np.ndarray, uoff: np.ndarray | float, v_gain: float=1.0) -> np.ndarray: """Using an instrumentation amplifier for current sensing Args: iin: Input current [A] uoff: Offset output voltage [V] v_gain: Gain of Amplifier [V/V] Returns: Corresponding numpy array with output voltage """ r_sense = self._settings.transimpedance / v_gain u_out = r_sense * iin + uoff u_out += self.__add_parasitic(u_out.size, r_sense) return u_out
[docs] def push_amplifier(self, iin: np.ndarray) -> np.ndarray: """Performing the CMOS push/source current amplifier Args: iin: Input current [A] Returns: Corresponding numpy array with output voltage """ u_out = np.zeros(iin.shape) x_neg = np.argwhere(iin < 0) u_out[x_neg,] = iin[x_neg,] * self._settings.transimpedance u_out += self.__add_parasitic(u_out.size, self._settings.transimpedance) return self.clamp_voltage(u_out)
[docs] def pull_amplifier(self, iin: np.ndarray) -> np.ndarray: """Performing the CMOS pull/sink current amplifier Args: iin: Input current [A] Returns: Corresponding numpy array with output voltage """ u_out = np.zeros(iin.shape) x_pos = np.argwhere(iin >= 0) u_out[x_pos, ] = iin[x_pos, ] * self._settings.transimpedance u_out += self.__add_parasitic(u_out.size, self._settings.transimpedance) return self.clamp_voltage(u_out)
[docs] def push_pull_amplifier(self, iin: np.ndarray) -> [np.ndarray, np.ndarray]: """Performing the CMOS push-pull current amplifier Args: iin: Input current [A] Returns: Corresponding numpy array with output voltage """ u_pos = self.pull_amplifier(iin) u_neg = self.push_amplifier(iin) return u_pos, u_neg
[docs] def push_pull_abs_amplifier(self, iin: np.ndarray) -> np.ndarray: """Performing the CMOS push-pull current absolute amplifier Args: iin: Input current [A] Returns: Corresponding numpy array with output voltage """ u_out = self.pull_amplifier(iin) u_out -= self.push_amplifier(iin) return u_out