Pogledao sam file-ove i pokusao da se snadjem ali ne ide :( (los sam sa asemblerom). Video sam da ima PID regulacija, da postoji komunikacija sa PC-jem, da vreme uzimanja tacki iz tabele radi preko timer0, na kraju je data tabela sinusa za 45 stepeni definisana sa 19 tacaka, i nasao sam deo koda gde on podesava duty na osnovu podataka iz tabele, ali mi nije jasno kako dodeljuje vrednost? Evo deo koda pa da probamo rastumaciti:
Code:
;*******************************************************************************
;UPDATE_PWM_DUTYCYCLES
;
;This routine will update the PWM duty cycle on CCPx according to the
;offset to the table with 0-120-240 degrees.
;This routine scales the PWM value from the table based on the frequency to keep V/F
;constant.
;*******************************************************************************
UPDATE_PWM_DUTYCYCLES
movf TABLE_OFFSET1,W ;Load the table offset for Phase 1
movf PLUSW0,W ;Use offset to access value in sine table via indirect addressing
mulwf FREQUENCY, W ;Table_value X Frequency
movff PRODH,PDC0H_TEMP ;Copy high product into temporary variable for PDC0H
movff PRODL,PDC0L_TEMP ;Copy low product into temporary variable for PDC0L
; movlw 0x1E ;Add 78h (1Eh shifted left two bits), in order to prevent 0 duty cycle
; addwf PDC0L_TEMP, F
; btfsc STATUS, C
; incf PDC0H_TEMP, F
UPDATE_PWM2
movf TABLE_OFFSET2,W ;Load the table offset for Phase 2
movf PLUSW0,W ;Use offset to access value in sine table via indirect addressing
mulwf FREQUENCY, W ;Table_value X Frequency
movff PRODH,PDC1H_TEMP ;Copy high product into temporary variable for PDC1H
movff PRODL,PDC1L_TEMP ;Copy low product into temporary variable for PDC1L
; movlw 0x1E ;Add 78h (1Eh shifted left two bits), in order to prevent 0 duty cycle
; addwf PDC0L_TEMP, F
; btfsc STATUS, C
; incf PDC0H_TEMP, F
UPDATE_PWM3
movf TABLE_OFFSET3,W ;Load the table offset for Phase 3
movf PLUSW0,W ;Use offset to access value in sine table via indirect addressing
mulwf FREQUENCY, W ;Table_value X Frequency
movff PRODH,PDC2H_TEMP ;Copy high product into temporary variable for PDC2H
movff PRODL,PDC2L_TEMP ;Copy low product into temporary variable for PDC2L
; movlw 0x1E ;Add 78h (1Eh shifted left two bits), in order to prevent 0 duty cycle
; addwf PDC0L_TEMP, F
; btfsc STATUS, C
; incf PDC0H_TEMP, F
TRUNCATE_PWM123 ;Truncate results of multiply to 10 uppermost bits
bcf STATUS,C ;discarding lower two bits and right justifying
rlcf PDC0L_TEMP,F
rlcf PDC0H_TEMP,F
rlcf PDC0L_TEMP,F
rlcf PDC0H_TEMP,F
rlcf PDC0L_TEMP,W
andlw 0x3
movff PDC0H_TEMP,PDC0L_TEMP
movwf PDC0H_TEMP
bcf STATUS,C
rlcf PDC1L_TEMP,F
rlcf PDC1H_TEMP,F
rlcf PDC1L_TEMP,F
rlcf PDC1H_TEMP,F
rlcf PDC1L_TEMP,W
andlw 0x3
movff PDC1H_TEMP,PDC1L_TEMP
movwf PDC1H_TEMP
bcf STATUS,C
rlcf PDC2L_TEMP,F
rlcf PDC2H_TEMP,F
rlcf PDC2L_TEMP,F
rlcf PDC2H_TEMP,F
rlcf PDC2L_TEMP,W
andlw 0x3
movff PDC2H_TEMP,PDC2L_TEMP
movwf PDC2H_TEMP
;testofPWM
; infsnz temp, f
; incf temp1, f
; btfss temp1, 2 ;if this bit is set temp1=4
; goto donewiththis
; clrf temp
; clrf temp1
;donewiththis
; movff temp, PDC0L_TEMP
; movff temp1, PDC0H_TEMP
; movlw 0x01
; movwf PDC0L_TEMP
; movlw 0x00
; movwf PDC0H_TEMP
; movlw 0xe8
; movwf PDC1L_TEMP
; movlw 0x03
; movwf PDC1H_TEMP
call CHECK_LIMITS
bsf PWMCON1, UDIS ;Disable updates to duty cycle and period
movff PDC0L_TEMP,PDC0L ;Transfer temporary values into duty cycle registers
movff PDC0H_TEMP,PDC0H
movff PDC1L_TEMP,PDC1L
movff PDC1H_TEMP,PDC1H
movff PDC2L_TEMP,PDC2L
movff PDC2H_TEMP,PDC2H
; movlw 0xFA
; movwf PDC0L
; movlw 0x00
; movwf PDC0H
; movlw 0xF4
; movwf PDC1L
; movlw 0x01
; movwf PDC1H
; movlw 0xEE
; movwf PDC2L
; movlw 0x02
; movwf PDC2H
bcf PWMCON1, UDIS ;Enable updates to duty cycle and period to update simultaneously.
return
;*******************************************************************************
;UPDATE_TABLE_OFFSET
;
;This routine Updates the offset pointers to the table after every access
;*******************************************************************************
UPDATE_TABLE_OFFSET
btfss FLAGS,OFFSET1_FLAG ;If set incr. on table
bra DECREMENT_OFFSET1
movlw (SINE_TABLE_ENTRIES-1) ;Check for the last value on the table
cpfslt TABLE_OFFSET1
bra CLEAR_OFFSET1_FLAG
incf TABLE_OFFSET1,F ;Increment offset1
bra UPDATE_OFFSET2
CLEAR_OFFSET1_FLAG
bcf FLAGS,OFFSET1_FLAG
DECREMENT_OFFSET1
dcfsnz TABLE_OFFSET1,F ;Decrement offset1
bsf FLAGS,OFFSET1_FLAG
UPDATE_OFFSET2
btfss FLAGS,OFFSET2_FLAG ;If set incr. on table
bra DECREMENT_OFFSET2
movlw (SINE_TABLE_ENTRIES-1) ;Check for the last value on the table
cpfslt TABLE_OFFSET2
bra CLEAR_OFFSET2_FLAG
incf TABLE_OFFSET2,F ;Increment offset2
bra UPDATE_OFFSET3
CLEAR_OFFSET2_FLAG
bcf FLAGS,OFFSET2_FLAG
DECREMENT_OFFSET2
dcfsnz TABLE_OFFSET2,F ;Decrement offset2
bsf FLAGS,OFFSET2_FLAG
UPDATE_OFFSET3
btfss FLAGS,OFFSET3_FLAG ;If set incr. on table
bra DECREMENT_OFFSET3
movlw (SINE_TABLE_ENTRIES-1) ;Check for the last value on the table
cpfslt TABLE_OFFSET3
bra CLEAR_OFFSET3_FLAG
incf TABLE_OFFSET3,F ;Increment offset3
return
CLEAR_OFFSET3_FLAG
bcf FLAGS,OFFSET3_FLAG
DECREMENT_OFFSET3
dcfsnz TABLE_OFFSET3,F ;Decrement offset3
bsf FLAGS,OFFSET3_FLAG
return
U ovom delu:
Code:
movf TABLE_OFFSET1,W ;Load the table offset for Phase 1
movf PLUSW0,W ;Use offset to access value in sine table via indirect addressing
mulwf FREQUENCY, W ;Table_value X Frequency
movff PRODH,PDC0H_TEMP ;Copy high product into temporary variable for PDC0H
movff PRODL,PDC0L_TEMP ;Copy low product into temporary variable for PDC0L
on dodeljuje vrednost, ali mi nije jasno zasto vrednost iz tabele mnozi sa frekvencijom?
Kako dobija vrednost duty-ja kada je pooluperioda negativna? Ja sam, kao sto ste videli, radio tako sto sam invertovao signal koji predstavlja pozitivnu poluperiodu, znaci kada je poluperioda pozitivna dodelim vrednost iz tabele, a kada je negativna od max duty-ja oduzmem vrednost iz tabele i to dodelim.