Saturday, September 3, 2016

MPPT Circuit using PIC16F88 Code and HEX

MPPT Circuit using PIC16F88 Code and HEX


The earlier article comprehensively described the circuit details of an MPPT using PIC16F88 microcontroller, here we get the access to the source code for programming the PIC and the HEX file format for the same.




This data was donated by: Mr. hisham bahaa-aldeen (hisham2630@gmail.com)


Programming source code for the proposed 12V/24V solar MPPT circuit using PIC16F88


; 100W Solar Charger
; upgraded with a supplementary bulk charge restart feature after a 4hr break when sunlight returns to panel
; Option set when RB0 low
; Supplementary bulk restart anytime power demanded for float charging. Option set when RB1 low
; Added switch to float mode if bulk charging takes less than 60s. ie if the battery is fully charged

    list P=16F88
    #include p16f88.inc
    ERRORLEVEL -302
    ERRORLEVEL -306

;Program Configuration Register 1
        __CONFIG    _CONFIG1, _CP_ALL & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO

;Program Configuration Register 2
        __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF


; Bank 0 RAM
DIGITAL            equ    H20    ; storage
FIRST            equ    H21    ; first run  
CUT_M            equ    H22    ; cutout voltage high byte
CUT_L              equ    H23    ; cutout voltage low byte
FLOAT_H            equ    H24    ; float voltage high byte
FLOAT_L            equ    H25    ; float voltage low byte
COMP            equ    H26    ; compensation (temperature)
BATT_HI            equ    H27    ; battery volts high byte
BATT_LO            equ    H28    ; battery low byte
DELCNT            equ    H29    ; delay counter
FLASHER            equ    H2A    ; LED flasher timer
TEMPERATURE        equ    H2B    ; temperature reading deg C  
THERMISTOR        equ    H2C    ; thermistor flag for LED
CUT_COMP_M        equ    H2D    ; cutout temp. compensated voltage high byte
CUT_COMP_L         equ    H2E    ; cutout temp. compensated voltage low byte
FLOAT_COMP_M    equ    H2F    ; float temp. compensated voltage high byte
FLOAT_COMP_L    equ    H30    ; float temp. compensated voltage low byte
NEGATIVE        equ    H31    ; subtract negative flag
VALUE_1            equ    H32    ; delay counter
VALUE_2            equ    H33    ; delay counter
HOUR0            equ    H34    ; hour counter
HOUR1            equ    H35    ; 14 seconds counter for hour counter (256 x 14s=1hour)
SENSOR_COUNT    equ    H36    ; sensor counter for periodic checking
SENSOR_COUNT1    equ    H37    ; sensor counter for periodic checking  
CELL_LO            equ    H38    ; solar cell voltage ls byte
CELL_HI            equ    H39    ; solar cell voltage ms byte
CELL_I_LO        equ    H3A    ; solar cell current ls byte
CELL_I_HI        equ    H3B    ; solar cell current ms byte
CHARGE_STATE    equ    H3C    ; 0 charge, 1 float
CHARGE_FLAG        equ    H3D    ; flag for charge
CHRG_RATE        equ    H3E    ; charge change rate
CELL_V            equ    H3F    ; solar cell voltage 8-bit
CELL_I            equ    H40    ; solar cell current 8-bit
PERIOD            equ    H41    ; power calculation rate
CCPR1_STORE        equ    H42    ; CCPR1L storage value
POWERH            equ    H43    ; power ms byte
POWERL            equ    H44    ; power ls byte
VALUE1            equ    H45    ; temporary value
VALUE2            equ    H46    ; temporary value
VALUE3            equ    H47    ; temporary value
VALUE4            equ    H48    ; temporary value
EQ_FLAG            equ    H49    ; equalisation flag
EQ_LO            equ    H4A    ; ls byte EQ battery voltage
EQ_HI            equ    H4B    ; ms byte EQ battery voltage
EQ_LO_COMP        equ    H4C    ; ls byte temp. compensated EQ battery voltage
EQ_HI_COMP        equ    H4D    ; ms byte temp. compensated EQ battery voltage
EQ_LEVEL        equ    H4E    ; equalisation input (RB4) level store
BATT_IND        equ    H4F    ; battery indicator flag when error
BURST_FLG        equ    H50    ; burst flag
HOUR3            equ    H51    ; 4 hour counter
HOUR2            equ    H52    ; 56 seconds counter for hour counter (256 x 56s=1hour)
BULK_TIMER        equ    H53    ; bulk charge timer (60s)
BULK_TIMER_END    equ    H54    ; bulk timer ended flag  
  
; math routines
TEMP1            equ    H5C
TEMPB0            equ    H5D
TEMPB1            equ    H5E
TEMPB2            equ    H5F
TEMP            equ H60
REMB3            equ H61
REMB2            equ    H62
REMB1              equ H63
REMB0            equ    H64
AARGB5            equ    H65
AARGB4          equ H66
AARGB3            equ    H67
AARGB2          equ H68
AARGB1          equ H69
AARGB0          equ H6A    ; most significant byte of argument A
BARGB3          equ H6B
BARGB2          equ H6C
BARGB1          equ H6D
BARGB0          equ H6E    ; most significant byte of argument B
LOOPCOUNT       equ H6F      ; division counter
            
; All Banks RAM
; Interrupt store registers
W_TMP            equ    H70    ; storage of w before interrupt
STATUS_TMP        equ    H71    ; status storage before interrupt

; start at memory 0
    org    0
    goto    SETUP
    org    4
    goto    INTERRUPT

; position the lookup table at start to avoid a 256 bit boundary

TEMP_CONV ; convert A/D values to deg C based on thermistor R=Ae**(B/T) where (T is in K ie deg C plus 273)
; A =0.01058 and B is 4100
    addwf    PCL,f    ; add value to program counter
; 60 deg C max
    retlw    D60    ; 60deg C for A/D D49 (8-bit)
    retlw    D59    ; deg C for A/D D50(8-bit)
    retlw    D58    ; deg C for A/D D51(8-bit)
    retlw    D58    ; deg C for A/D D52(8-bit)
    retlw    D57    ; deg C for A/D D53(8-bit)
    retlw    D57    ; deg C for A/D D54(8-bit)
    retlw    D56    ; deg C for A/D D55(8-bit)
    retlw    D56    ; deg C for A/D D56(8-bit)
    retlw    D55    ; deg C for A/D D57(8-bit)
    retlw    D54    ; deg C for A/D D58(8-bit)
    retlw    D54    ; 54 deg C for A/D D59(8-bit)
  
    retlw    D53    ; deg C for A/D D60(8-bit)
    retlw    D53    ; deg C for A/D D61(8-bit)
    retlw    D52    ; deg C for A/D D62(8-bit)
    retlw    D52    ; deg C for A/D D63(8-bit)
    retlw    D51    ; deg C for A/D D64(8-bit)
    retlw    D50    ; deg C for A/D D65(8-bit)
    retlw    D50    ; deg C for A/D D66(8-bit)
    retlw    D50    ; deg C for A/D D67(8-bit)
    retlw    D49    ; deg C for A/D D68(8-bit)
    retlw    D49    ; deg C for A/D D69(8-bit)

    retlw    D48    ; 48 deg C for A/D D70(8-bit)
    retlw    D48    ; deg C for A/D D71(8-bit)
    retlw    D47    ; deg C for A/D D72(8-bit)
    retlw    D47    ; deg C for A/D D73(8-bit)
    retlw    D46    ; deg C for A/D D74(8-bit)
    retlw    D46    ; deg C for A/D D75(8-bit)
    retlw    D45    ; deg C for A/D D76(8-bit)
    retlw    D45    ; deg C for A/D D77(8-bit)
    retlw    D44    ; deg C for A/D D78(8-bit)
    retlw    D44    ; deg C for A/D D79(8-bit)

    retlw    D43    ; deg C for A/D D80(8-bit)
    retlw    D43    ; deg C for A/D D81(8-bit)
    retlw    D43    ; deg C for A/D D82(8-bit)
    retlw    D42    ; deg C for A/D D83(8-bit)
    retlw    D42    ; deg C for A/D D84(8-bit)
    retlw    D41    ; deg C for A/D D85(8-bit)
    retlw    D41    ; deg C for A/D D86(8-bit)
    retlw    D40    ; deg C for A/D D87(8-bit)
    retlw    D40    ; deg C for A/D D88(8-bit)
    retlw    D40    ; 40 deg C for A/D D89(8-bit)

    retlw    D39    ; deg C for A/D D90(8-bit)
    retlw    D39    ; deg C for A/D D91(8-bit)
    retlw    D38    ; deg C for A/D D92(8-bit)
    retlw    D38    ; deg C for A/D D93(8-bit)
    retlw    D38    ; deg C for A/D D94(8-bit)
    retlw    D37    ; deg C for A/D D95(8-bit)
    retlw    D37    ; deg C for A/D D96(8-bit)
    retlw    D36    ; deg C for A/D D97(8-bit)
    retlw    D36    ; deg C for A/D D98(8-bit)
    retlw    D36    ; deg C for A/D D99(8-bit)

    retlw    D35    ; deg C for A/D D100(8-bit)
    retlw    D35    ; deg C for A/D D101(8-bit)
    retlw    D34    ; deg C for A/D D102(8-bit)
    retlw    D34    ; deg C for A/D D103(8-bit)
    retlw    D34    ; deg C for A/D D104(8-bit)
    retlw    D33    ; deg C for A/D D105(8-bit)
    retlw    D33    ; deg C for A/D D106(8-bit)
    retlw    D33    ; deg C for A/D D107(8-bit)
    retlw    D32    ; deg C for A/D D108(8-bit)
    retlw    D32    ; 32 deg C for A/D D109(8-bit)

    retlw    D32    ; deg C for A/D D110(8-bit)
    retlw    D31    ; deg C for A/D D111(8-bit)
    retlw    D31    ; deg C for A/D D112(8-bit)
    retlw    D30    ; deg C for A/D D113(8-bit)
    retlw    D30    ; deg C for A/D D114(8-bit)
    retlw    D30    ; deg C for A/D D115(8-bit)
    retlw    D29    ; deg C for A/D D116(8-bit)
    retlw    D29    ; deg C for A/D D117(8-bit)
    retlw    D29    ; deg C for A/D D118(8-bit)
    retlw    D28    ; deg C for A/D D119(8-bit)

    retlw    D28    ; deg C for A/D D120(8-bit)
    retlw    D28    ; deg C for A/D D121(8-bit)
    retlw    D27    ; deg C for A/D D122(8-bit)
    retlw    D27    ; deg C for A/D D123(8-bit)
    retlw    D27    ; deg C for A/D D124(8-bit)
    retlw    D26    ; deg C for A/D D125(8-bit)
    retlw    D26    ; deg C for A/D D126(8-bit)
    retlw    D26    ; deg C for A/D D127(8-bit)
    retlw    D25    ; deg C for A/D D128(8-bit)
    retlw    D25    ; deg C for A/D D129(8-bit)

    retlw    D24    ; deg C for A/D D130(8-bit)
    retlw    D24    ; deg C for A/D D131(8-bit)
    retlw    D24    ; deg C for A/D D132(8-bit)
    retlw    D24    ; deg C for A/D D133(8-bit)
    retlw    D23    ; deg C for A/D D134(8-bit)
    retlw    D23    ; deg C for A/D D135(8-bit)
    retlw    D23    ; deg C for A/D D136(8-bit)
    retlw    D22    ; deg C for A/D D137(8-bit)
    retlw    D22    ; deg C for A/D D138(8-bit)
    retlw    D22    ; deg C for A/D D139(8-bit)

    retlw    D21    ; deg C for A/D D140(8-bit)
    retlw    D21    ; deg C for A/D D141(8-bit)
    retlw    D21    ; deg C for A/D D142(8-bit)
    retlw    D20    ; deg C for A/D D143(8-bit)
    retlw    D20    ; deg C for A/D D144(8-bit)
    retlw    D20    ; deg C for A/D D145(8-bit)
    retlw    D19    ; deg C for A/D D146(8-bit)
    retlw    D19    ; deg C for A/D D147(8-bit)
    retlw    D19    ; deg C for A/D D148(8-bit)
    retlw    D18    ; deg C for A/D D149(8-bit)

    retlw    D18    ; deg C for A/D D150(8-bit)
    retlw    D18    ; deg C for A/D D151(8-bit)
    retlw    D17    ; deg C for A/D D152(8-bit)
    retlw    D17    ; deg C for A/D D153(8-bit)
    retlw    D17    ; deg C for A/D D154(8-bit)
    retlw    D16    ; deg C for A/D D155(8-bit)
    retlw    D16    ; deg C for A/D D156(8-bit)
    retlw    D16    ; deg C for A/D D157(8-bit)
    retlw    D15    ; deg C for A/D D158(8-bit)
    retlw    D15    ; deg C for A/D D159(8-bit)

    retlw    D15    ; deg C for A/D D160(8-bit)
    retlw    D14    ; deg C for A/D D161(8-bit)
    retlw    D14    ; deg C for A/D D162(8-bit)
    retlw    D14    ; deg C for A/D D163(8-bit)
    retlw    D13    ; deg C for A/D D164(8-bit)
    retlw    D13    ; deg C for A/D D165(8-bit)
    retlw    D13    ; deg C for A/D D166(8-bit)
    retlw    D12    ; deg C for A/D D167(8-bit)
    retlw    D12    ; deg C for A/D D168(8-bit)
    retlw    D12    ; deg C for A/D D169(8-bit)

    retlw    D11    ; deg C for A/D D170(8-bit)
    retlw    D11    ; deg C for A/D D171(8-bit)
    retlw    D11    ; deg C for A/D D172(8-bit)
    retlw    D10    ; deg C fo

Available link for download