Example: SPice10212 nonlinearity correction
This program demonstrates the polynomial method of linearizing the raw readings. Note that the actual coefficients used are specific to our test transformer. You must determine your own coefficients and use them in your program. Only one channel has been linearized. The program uses the MMi99/200 LCD for display.
;Correct.spt SPice20212 demo/calibration with nonlinearity correction ;using MMi200 with LCD ;The nonlinearity correction is applied only ;to the first channel, to allow comparisons to be made. ;RAM storage Temp EQU 20 ;Use for MS12 only ON 20 ;MS12 backlight ;Initialize the SPice connector for 3 analog inputs SetU 0,3 SetU 1,3 SetU 2,3 SPiceConfigU ;Main program loop: Loop: ;This section displays the raw analog readings on the ;top line of the display. Full scale is always 255 counts AnInE ;Use AnInC on MS12 OBLCD_SetCur 0,0 OBLCD_UDecDispXFW AnInF ;Use AnInD on MS12 OBLCD_SetCur 0,6 OBLCD_UDecDispXFW AnInG ;Use AnInE on MS12 OBLCD_SetCur 0,12 OBLCD_UDecDispXFW ;This section displays the readings as voltages. ;For phase A the conversion is done using a correction algorithm ;based on a polynomial function. ;For the other two phases the conversion is a simple scaling. ;The scale factor initially loaded into Q will determine the ;full scale range, i.e. the voltage corresponding to 255 ;raw counts. AnInE ;Use AnInC on MS12 GoSub Correct OBLCD_SetCur 1,0 OBLCD_UDecDispXFW ;The scale factor for the other two readings ;is Vfs/255, where Vfs is the required full scale voltage. fLoadQ 1.0 ;1.0 for FS=255V (240V+10%) ;0.5176 for FS=132V (120V+10%) AnInF ;Use AnInD on MS12 OBLCD_SetCur 1,6 Float fMul OBLCD_fDispW 3,0 AnInG ;Use AnInE on MS12 OBLCD_SetCur 1,12 Float fMul OBLCD_fDispW 3,0 GoTo Loop ;Correct for nonlinearity ;Implements the function ;y = 2.859320E-06 x^3 -1.011672E-03 x^2 +1.058639E+00x +3.916506E+00 ;These particular coefficients were determined with a specific transformer, ;with the system calibrated for 255V full scale. A different transformer ;and/or full scale range will require different coefficients. Correct: Float fStore Temp fLoadQ 2.859320E-06 ; X^3 coefficient fMul fLoadQ -1.011672E-03 ; X^2 coefficient fAdd fRecallQ Temp fMul fLoadQ +1.058639E+00 ; X^1 coefficient fAdd fRecallQ Temp fMul fLoadQ +3.916506E+00 ; constant offset fAdd fLoadQ 0.5 ;Rounding fAdd Fix Return