Using Fixed point maths in microcontrollers
Fixed
point mathematics lets you calculate results that need to have a
fractional
multiplier and it lets you calculate results that would normally need
floating point variables. This saves a huge amount of memory.
For example if you want to calculate an ADC result that uses a 19.6mV
step size then you need to multiply the ADC result by 0.0196.
Normal maths using a floating point variable would result in
the following:
ADC
reading 
Floating
point calculation 
Floating
point result 
0 
0
* 0.0196 
0.0 
127 
127
* 0.0196 
2.489 
255 
255
* 0.0196 
4.998 
With Fixed point mathematics you can do this quickly and
efficiently using only
integer
type variables.
Note:
Floating point
variables use up huge amounts of resources in a microcontroller as
microcontrollers are only really good at integer type variables.
To do floating point complex library functions are called up.
This is similar to the old 386 processor (it too was no good
at floating point
operations being far too slow) so a separate floating point processor
was used.
An
example problem
Here
is the problem to solve:
Using the minimum memory resources use an 8 bit ADC with 5V reference
to transmit using a PIC micro serial data to a PC via the serial port
the ADC reading every second.
The most important decision is not to use floating point  this saves
lots of memory resource  all the rest; sending data to the serial port
and timing will not take up much memory (the soft serial port (TX) that
you
can find here
takes about 90 memory words).
So how to do it : First of all the step size of each ADC bit is:
5V/255
= 0.0196 (19.6mV)
Next
work out the type of the variable that is big
enough to hold the maximum expected value but is also the minimum size
variable you can get away with. Factors such as the number of ADC bits
and required calculation accuracy affect the variable size.
To convert, using fixed point, multiply the ADC reading by an integer
scale factor but make sure the maximum value fits within the variable
e.g If you choose a scale factor of 196 check the maximum value:
Maximum value : 255 * 196 = 49980
Here you can use a 16 bit variable (or unsigned int) as the
maximum value is smaller than the maximum value that the 16 bit
variable can hold.
Max value that unsigned int can store is 2^{16}1
= 65535.
Since 49980 < 65535 the scheme is ok.
This has calculated the result using fixed point shown in the table
below:
ADC
reading 
Fixed
point calculation 
Fixed
point result 
0 
0
* 196 
0.0 
127 
127
* 196 
24892 
255 
255
* 196 
49980 
The decimal point is fixed four to the left 
i.e. fixed point.
This has use the internal compiler routine '16 bit multiply' which is
much simpler than a floating point multiply so you save loads of memory
resource.
Claim Your: Useful
"Arduino Software Guide"
Right Now...


Privacy Policy
 Contact
 About Me
Site Map
 Terms of Use
New! Comments
Have your say about what you just read! Leave me a comment in the box below.