In the ‘DC/DC LED Developer's Kit’ setting a LED output to a certain value and go back to zero, the ControlLaw_2P2Z .macro outputs a high value (and also a high pulse to the LED) if the ADC result is ‘0’.
I solved the problem to check for Null, but if this is the best solution…?
;====================================
ControlLaw_2P2Z .macro n
;====================================
; Set up address pointers:
MOVW DP, #_CNTL_2P2Z_Ref:n:
MOVL XAR0, @_CNTL_2P2Z_Ref:n: ; Net pointer to Ref (XAR0)
MOVL XAR1, @_CNTL_2P2Z_Fdbk:n: ; Net pointer to Fdbk(XAR1)
MOVL XAR2, @_CNTL_2P2Z_Out:n: ; Net pointer to Out (XAR2)
MOVL XAR3, @_CNTL_2P2Z_Coef:n: ; Net pointer to Coefficients (XAR3)
; Calculate input (Ref - Fdbk):
MOV ACC, *XAR0<<11 ; ACC = Ref (Q15 to Q26)
SUB ACC, *XAR1<<11 ; ACC = Ref - Fdbk (Q15 to Q26)
MOVW DP, #CNTL_2P2Z_DBUFF:n:
MOVL @CNTL_2P2Z_DBUFF:n:+4, ACC ; e(n) = ACC = error (Q26)
; If Null then exit:
BF CL_2P2Z:n:a, NEQ ; Not '0'
MOV ACC, *XAR0
BF CL_2P2Z:n:exit, EQ ; All '0'
CL_2P2Z:n:a:
;
; Calculate 2p-2z filter: Note: IIR engine is Q independent
MOVL XT, @CNTL_2P2Z_DBUFF:n:+8 ; XT = e(n-2)
QMPYL P, XT, *XAR3++ ; P = e(n-2)*B2
MOVB ACC, #0 ; ACC = 0
MOVDL XT, @CNTL_2P2Z_DBUFF:n:+6 ; XT = e(n-1), e(n-2) = e(n-1)
QMPYAL P, XT, *XAR3++ ; P = e(n-1)*B1, ACC=e(n-2)*B2
MOVDL XT, @CNTL_2P2Z_DBUFF:n:+4 ; XT = e(n), e(n-1) = e(n)
QMPYAL P, XT, *XAR3++ ; P = e(n)*B0, ACC = e(n-2)*B2 + e(n-1)*B1
MOVL XT, @CNTL_2P2Z_DBUFF:n:+2 ; XT = u(n-2)
QMPYAL P, XT, *XAR3++ ; P = u(n-2)*A2, ACC = e(n-2)*B2 + e(n-1)*B1 + e(n)*B0
MOVDL XT, @CNTL_2P2Z_DBUFF:n:+0 ; XT = u(n-1), u(n-2) = u(n-1)
QMPYAL P, XT, *XAR3++ ; P = u(n-1)*A1, ACC = e(n-2)*B2 + e(n-1)*B1 + e(n)*B0 + u(n-2)*A2
ADDL ACC, @P ; ACC = e(n-2)*B2 + e(n-1)*B1 + e(n)*B0 + u(n-2)*A2 + u(n-1)*A1
; Scale u(n) Q20 to Q26, Saturate(1>u(n)>0), and save history
LSL ACC, #6 ; ACC = Q26, based on Q26 coef & e(n)
MINL ACC, *XAR3++ ; Saturate to < 0.999999.. in (Q26)
MAXL ACC, *XAR3 ; Saturate to > 0.000000.. in (Q26)
MOVL @CNTL_2P2Z_DBUFF:n:, ACC ; u(n-1) = u(n) = ACC (Q26)
; move to Uout as a Q15
LSL ACC, #5 ; Convert from Q26 to Q31
CL_2P2Z:n:exit:
MOV *XAR2, AH ; Output Duty (Q15) to terminal net
.endm
;====================================
Best regards, Leo Bosch.