# Real-Time Robotics Framework

### Sidebar

eeros_architecture:hal:scaling

# Scale and Range of Analog Signals

Within EEROS we work with signals having physically meaningful units. However, when such signals are read from real-world hardware we use analog-to-digital converters or encoder which are basically counters. When outputting such signals we use digital-to-analog converters. These counters or converters all deliver or need an integer value. Its maximum and minimum value depend on the resolution of the underlying hardware. The scale and range key allows to convert between the necessary integer value and the physically meaningful signals. You might have several stages in your hardware, see Setting Multiple Scales and Ranges.

## Configuring an Analog Output

To configure such a channel follow these steps:

1. Read the datasheet of your hardware and note the upper and lower limits of the analog output voltage.
2. Enter these limits in the configuration file under range with minOut and maxOut.
3. Get the upper and lower limits of the digital values of the converter from the datasheet.
4. Enter this limits in the configuration file under range with minIn and maxIn.
5. Write a small digital value to the analog output directly (not through eeros). That is, if your are using comedi for instance, you use a user interface and write a value of 1000 to one of its analog outputs.
6. Record this digital value in the configuration file under scale as minIn
7. Measure the resulting voltage with a multimeter and record it in the configuration file under scale as minOut.
8. Repeat this with a large digital value close to the upper limit. For this you have to know the range of your digital-to-analog converter.
9. Record this digital value in the configuration file under scale as maxIn
10. Measure the resulting voltage with a multimeter and record it in the configuration file under scale maxOut.

The resulting channel configuration for a 16bit DAC might look like:

  "channel0": {
"signalId": "dacOut0",
"scale": [ { "id" : "dac",
"minIn":    1000, "maxIn":  64000,
"minOut": -9.787, "maxOut": 9.923 } ],
"range": [ { "id" : "dac",
"minIn":       0, "maxIn":  65536,
"minOut":  -10.0, "maxOut":  10.0 } ],
"unit": "V"
}

If you know the scale and offset of your channel you could give these values directly as:

  "channel0": {
"signalId": "dacOut0",
"scale": [ { "id" : "dac",
"scale":  0.5,
"offset": 2.5 } ],
"range": [ { "id" : "dac",
"minIn":       0, "maxIn":  65536,
"minOut":  -10.0, "maxOut":  10.0 } ],
"unit": "V"
}

To configure such a channel follow these steps:

2. Enter these limits in the configuration file under range with minIn and maxIn.
3. Get the upper and lower limits of the digital values of the converter from the datasheet.
4. Enter this limits in the configuration file under range with minOut and maxOut.
5. Enter a small analog voltage value to the analog input and note it in the configuration file under scale as minIn
6. Record the resulting digital input value of the analog-to-digital converter in the configuration file under scale as minOut. If your are using comedi for instance, you use a user interface to read the digital value.
7. Repeat this with a large voltage close to the upper limit. For this you have to know the range of your analog-to-digital converter.
8. Record this value it in the configuration file under scale as maxIn
9. Record the resulting digital value in the configuration file as scale maxOut.

The resulting channel configuration for a 16bit ADC might look like:

  "channel0": {
"scale": [ { "id" : "adc",
"minIn":    -9.6, "maxIn":   8.85,
"minOut":    368, "maxOut": 61344 } ],
"range": [ { "id" : "adc",
"minIn":   -10.0, "maxIn":   10.0,
"minOut":      0, "maxOut": 65535 } ],
"unit": "V"
}

## Configuring an Encoder Input

To configure such a channel follow these steps:

1. Read the datasheet of your hardware and note the resolution of your encoder for a full turn.
2. Enter this limits in the configuration file under scale with maxOut while maxIn is a full turn in rad.
3. The range with have noLimit because it might turn forward or backward without limitation.

The resulting channel configuration for an encoder might look like:

  "channel0": {
"signalId": "enc0",
"scale": [ { "id" : "enc",
"minIn":   0, "maxIn": 6.28318530718,
"minOut":  0, "maxOut":         4096 } ],
"range": [ { "id" : "enc",
"noLimit": true } ],
}