/** * Get a scaled sample straight from the channel on this module. * * The value is scaled to units of Volts using the calibrated scaling data from GetLSBWeight() and GetOffset(). * * @param channel The channel to read. * @return A scaled sample straight from the channel on this module. */ float AnalogModule::GetVoltage(UINT32 channel) { INT16 value = GetValue(channel); UINT32 LSBWeight = GetLSBWeight(channel); INT32 offset = GetOffset(channel); float voltage = LSBWeight * 1.0e-9 * value - offset * 1.0e-9; return voltage; }
/** * Get a scaled sample straight from the channel on this module. * * The value is scaled to units of Volts using the calibrated scaling data from GetLSBWeight() and GetOffset(). * * @param channel The channel to read. * @return A scaled sample straight from the channel on this module. */ float AnalogModule::GetVoltage(uint32_t channel) { int16_t value = GetValue(channel); uint32_t LSBWeight = GetLSBWeight(channel); int32_t offset = GetOffset(channel); float voltage = LSBWeight * 1.0e-9 * value - offset * 1.0e-9; return voltage; }
/** * Get a scaled sample from the output of the oversample and average engine for the channel. * * The value is scaled to units of Volts using the calibrated scaling data from GetLSBWeight() and GetOffset(). * Using oversampling will cause this value to be higher resolution, but it will update more slowly. * Using averaging will cause this value to be more stable, but it will update more slowly. * * @param channel The channel to read. * @return A scaled sample from the output of the oversample and average engine for the channel. */ float AnalogModule::GetAverageVoltage(UINT32 channel) { INT32 value = GetAverageValue(channel); UINT32 LSBWeight = GetLSBWeight(channel); INT32 offset = GetOffset(channel); UINT32 oversampleBits = GetOversampleBits(channel); float voltage = ((LSBWeight * 1.0e-9 * value) / (float)(1 << oversampleBits)) - offset * 1.0e-9; return voltage; }
/** * Get a scaled sample from the output of the oversample and average engine for the channel. * * The value is scaled to units of Volts using the calibrated scaling data from GetLSBWeight() and GetOffset(). * Using oversampling will cause this value to be higher resolution, but it will update more slowly. * Using averaging will cause this value to be more stable, but it will update more slowly. * * @param channel The channel to read. * @return A scaled sample from the output of the oversample and average engine for the channel. */ float AnalogModule::GetAverageVoltage(uint32_t channel) { int32_t value = GetAverageValue(channel); uint32_t LSBWeight = GetLSBWeight(channel); int32_t offset = GetOffset(channel); uint32_t oversampleBits = GetOversampleBits(channel); float voltage = ((LSBWeight * 1.0e-9 * value) / (float)(1 << oversampleBits)) - offset * 1.0e-9; return voltage; }
/** * Convert a voltage to a raw value for a specified channel. * * This process depends on the calibration of each channel, so the channel * must be specified. * * @todo This assumes raw values. Oversampling not supported as is. * * @param channel The channel to convert for. * @param voltage The voltage to convert. * @return The raw value for the channel. */ INT32 AnalogModule::VoltsToValue(INT32 channel, float voltage) { if (voltage > 10.0) { voltage = 10.0; wpi_setWPIError(VoltageOutOfRange); } if (voltage < -10.0) { voltage = -10.0; wpi_setWPIError(VoltageOutOfRange); } UINT32 LSBWeight = GetLSBWeight(channel); INT32 offset = GetOffset(channel); INT32 value = (INT32) ((voltage + offset * 1.0e-9) / (LSBWeight * 1.0e-9)); return value; }
/** * Convert a voltage to a raw value for a specified channel. * * This process depends on the calibration of each channel, so the channel * must be specified. * * @todo This assumes raw values. Oversampling not supported as is. * * @param channel The channel to convert for. * @param voltage The voltage to convert. * @return The raw value for the channel. */ int32_t AnalogModule::VoltsToValue(int32_t channel, float voltage) { if (voltage > 10.0) { voltage = 10.0; wpi_setWPIError(VoltageOutOfRange); } if (voltage < -10.0) { voltage = -10.0; wpi_setWPIError(VoltageOutOfRange); } uint32_t LSBWeight = GetLSBWeight(channel); int32_t offset = GetOffset(channel); int32_t value = (int32_t) ((voltage + offset * 1.0e-9) / (LSBWeight * 1.0e-9)); return value; }
/** * Convert a voltage to a raw value for a specified channel. * * This process depends on the calibration of each channel, so the channel * must be specified. * * @todo This assumes raw values. Oversampling not supported as is. * * @param channel The channel to convert for. * @param voltage The voltage to convert. * @return The raw value for the channel. */ INT32 AnalogModule::VoltsToValue(INT32 channel, float voltage) { if (voltage > 10.0) { voltage = 10.0; wpi_fatal(VoltageOutOfRange); } if (voltage < -10.0) { voltage = -10.0; wpi_fatal(VoltageOutOfRange); } UINT32 LSBWeight = GetLSBWeight(channel); INT32 offset = GetOffset(channel); INT32 value = (INT32) ((voltage + offset * 1.0e-9) / (LSBWeight * 1.0e-9)); wpi_assertCleanStatus(status); return value; }