You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
314 lines
8.0 KiB
314 lines
8.0 KiB
;**** **** **** **** ****
|
|
;
|
|
; BLHeli program for controlling brushless motors in helicopters and multirotors
|
|
;
|
|
; Copyright 2011, 2012 Steffen Skaug
|
|
; This program is distributed under the terms of the GNU General Public License
|
|
;
|
|
; This file is part of BLHeli.
|
|
;
|
|
; BLHeli is free software: you can redistribute it and/or modify
|
|
; it under the terms of the GNU General Public License as published by
|
|
; the Free Software Foundation, either version 3 of the License, or
|
|
; (at your option) any later version.
|
|
;
|
|
; BLHeli is distributed in the hope that it will be useful,
|
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
; GNU General Public License for more details.
|
|
;
|
|
; You should have received a copy of the GNU General Public License
|
|
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
|
|
;
|
|
;**** **** **** **** ****
|
|
;
|
|
; Graupner Ultra 20A hardware definition file
|
|
;
|
|
;**** **** **** **** ****
|
|
|
|
|
|
|
|
;*********************
|
|
; Device SiLabs F390
|
|
;*********************
|
|
$include (c8051f390.inc)
|
|
|
|
;**** **** **** **** ****
|
|
; Uses internal calibrated oscillator set to 24/48Mhz
|
|
;**** **** **** **** ****
|
|
|
|
;**** **** **** **** ****
|
|
; Constant definitions
|
|
;**** **** **** **** ****
|
|
CSEG AT 1A40h
|
|
Eep_ESC_Layout: DB "#G_Ultra20A# " ; ESC layout tag
|
|
CSEG AT 1A50h
|
|
Eep_ESC_MCU: DB "#BLHELI#F390# " ; Project and MCU tag (16 Bytes)
|
|
|
|
MCU_48MHZ EQU 1 ; Set to 1 if MCU can run at 48MHz
|
|
ONE_S_CAPABLE EQU 0 ; Set to 1 if ESC can operate at 1S
|
|
PORT3_EXIST EQU 0 ; Set to 1 if MCU has port3
|
|
COMP1_USED EQU 0 ; Set to 1 if MCU has comparator 1 and it is being used
|
|
LOCK_BYTE_ADDRESS_16K EQU 3FFFh ; Address of lock byte if 16k flash size
|
|
LOCK_BYTE_ADDRESS_8K EQU 1FFFh ; Address of lock byte if 8k flash size
|
|
HIGH_BEC_VOLTAGE EQU 0 ; Set to 1 or more if high BEC voltage is supported
|
|
DAMPED_MODE_ENABLE EQU 1 ; Damped mode enabled
|
|
NFETON_DELAY EQU 16 ; Wait delay from pfets off to nfets on
|
|
PFETON_DELAY EQU 14 ; Wait delay from nfets off to pfets on
|
|
ADC_LIMIT_L EQU 0 ; No divider. Power supply measurement ADC value for which main motor power is limited (low byte)
|
|
ADC_LIMIT_H EQU 0 ; No divider. Power supply measurement ADC value for which main motor power is limited (2 MSBs)
|
|
TEMP_LIMIT EQU 114 ; Temperature measurement ADC value for which main motor power is limited (low byte, assuming high byte is 1)
|
|
TEMP_LIMIT_STEP EQU 4 ; Temperature measurement ADC value increment for which main motor power is further limited
|
|
|
|
;**** **** **** **** ****
|
|
; ESC specific defaults
|
|
;**** **** **** **** ****
|
|
DEFAULT_PGM_MAIN_SPOOLUP_TIME EQU 10 ; Main motor spoolup time
|
|
DEFAULT_PGM_MAIN_STARTUP_PWR EQU 10 ; 1=0.031 2=0.047 3=0.063 4=0.094 5=0.125 6=0.188 7=0.25 8=0.38 9=0.50 10=0.75 11=1.00 12=1.25 13=1.50
|
|
DEFAULT_PGM_TAIL_STARTUP_PWR EQU 10 ; 1=0.031 2=0.047 3=0.063 4=0.094 5=0.125 6=0.188 7=0.25 8=0.38 9=0.50 10=0.75 11=1.00 12=1.25 13=1.50
|
|
DEFAULT_PGM_MULTI_STARTUP_PWR EQU 10 ; 1=0.031 2=0.047 3=0.063 4=0.094 5=0.125 6=0.188 7=0.25 8=0.38 9=0.50 10=0.75 11=1.00 12=1.25 13=1.50
|
|
|
|
;**** **** **** **** ****
|
|
; Bootloader definitions
|
|
;**** **** **** **** ****
|
|
RTX_PORT EQU P0 ; Receive/Transmit port
|
|
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
|
|
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
|
|
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
|
|
RTX_PIN EQU 5 ; RTX pin
|
|
|
|
SIGNATURE_001 EQU 0f3h ; Device signature
|
|
SIGNATURE_002 EQU 090h
|
|
|
|
|
|
;*********************
|
|
; PORT 0 definitions *
|
|
;*********************
|
|
Mux_A2 EQU 7 ;i
|
|
Mux_A1 EQU 6 ;i
|
|
Rcp_In EQU 5 ;i
|
|
; EQU 4 ;i
|
|
Mux_C2 EQU 3 ;i
|
|
Mux_C1 EQU 2 ;i
|
|
Mux_B2 EQU 1 ;i
|
|
Mux_B1 EQU 0 ;i
|
|
|
|
P0_DIGITAL EQU NOT((1 SHL Mux_A1)+(1 SHL Mux_A2)+(1 SHL Mux_B1)+(1 SHL Mux_B2)+(1 SHL Mux_C1)+(1 SHL Mux_C2))
|
|
P0_INIT EQU 0FFh
|
|
P0_PUSHPULL EQU 0
|
|
P0_SKIP EQU NOT(1 SHL Rcp_In)
|
|
|
|
MACRO Get_Rcp_Capture_Values
|
|
mov Temp1, PCA0CPL0 ; Get PCA capture values
|
|
mov Temp2, PCA0CPH0
|
|
IF MCU_48MHZ == 1
|
|
mov A, Clock_Set_At_48MHz
|
|
jz Get_Rcp_End
|
|
clr C
|
|
mov A, Temp2
|
|
rrc A
|
|
mov Temp2, A
|
|
mov A, Temp1
|
|
rrc A
|
|
mov Temp1, A
|
|
Get_Rcp_End:
|
|
ENDIF
|
|
ENDM
|
|
MACRO Read_Rcp_Int
|
|
mov A, P0
|
|
jnb Flags3.PGM_RCP_PWM_POL, ($+4) ; Is pwm polarity negative?
|
|
cpl A ; Yes - invert
|
|
ENDM
|
|
MACRO Rcp_Int_Enable
|
|
orl PCA0CPM0, #01h ; Interrupt enabled
|
|
ENDM
|
|
MACRO Rcp_Int_Disable
|
|
anl PCA0CPM0, #0FEh ; Interrupt disabled
|
|
ENDM
|
|
MACRO Rcp_Int_First
|
|
anl PCA0CPM0, #0CFh
|
|
jb Flags3.PGM_RCP_PWM_POL, ($+6) ; Is pwm polarity positive?
|
|
orl PCA0CPM0, #20h ; Capture rising edge
|
|
jnb Flags3.PGM_RCP_PWM_POL, ($+6) ; Is pwm polarity negative?
|
|
orl PCA0CPM0, #10h ; Capture falling edge
|
|
ENDM
|
|
MACRO Rcp_Int_Second
|
|
anl PCA0CPM0, #0CFh
|
|
jb Flags3.PGM_RCP_PWM_POL, ($+6) ; Is pwm polarity positive?
|
|
orl PCA0CPM0, #10h ; Capture falling edge
|
|
jnb Flags3.PGM_RCP_PWM_POL, ($+6) ; Is pwm polarity negative?
|
|
orl PCA0CPM0, #20h ; Capture rising edge
|
|
ENDM
|
|
MACRO Rcp_Clear_Int_Flag
|
|
clr CCF0 ; Clear interrupt flag
|
|
ENDM
|
|
|
|
|
|
;*********************
|
|
; PORT 1 definitions *
|
|
;*********************
|
|
CpFET EQU 7 ;o
|
|
CnFET EQU 6 ;o (High side PWM)
|
|
BpFET EQU 5 ;o
|
|
BnFET EQU 4 ;o (High side PWM)
|
|
ApFET EQU 3 ;o
|
|
AnFET EQU 2 ;o (High side PWM)
|
|
Comp_Comm EQU 1 ;i
|
|
Adc_Ip EQU 0 ;i (Components not mounted)
|
|
|
|
P1_DIGITAL EQU NOT((1 SHL Adc_Ip)+(1 SHL Comp_Comm))
|
|
P1_INIT EQU (1 SHL Adc_Ip)+(1 SHL Comp_Comm)
|
|
P1_PUSHPULL EQU (1 SHL AnFET)+(1 SHL BnFET)+(1 SHL CnFET)+(1 SHL ApFET)+(1 SHL BpFET)+(1 SHL CpFET)
|
|
P1_SKIP EQU (1 SHL Adc_Ip)
|
|
|
|
MACRO AnFET_on
|
|
setb P1.AnFET
|
|
ENDM
|
|
MACRO AnFET_off
|
|
clr P1.AnFET
|
|
ENDM
|
|
MACRO BnFET_on
|
|
setb P1.BnFET
|
|
ENDM
|
|
MACRO BnFET_off
|
|
clr P1.BnFET
|
|
ENDM
|
|
MACRO CnFET_on
|
|
setb P1.CnFET
|
|
ENDM
|
|
MACRO CnFET_off
|
|
clr P1.CnFET
|
|
ENDM
|
|
MACRO All_nFETs_Off
|
|
clr P1.AnFET
|
|
clr P1.CnFET
|
|
clr P1.BnFET
|
|
ENDM
|
|
|
|
MACRO ApFET_on
|
|
setb P1.ApFET
|
|
ENDM
|
|
MACRO ApFET_off
|
|
clr P1.ApFET
|
|
ENDM
|
|
MACRO BpFET_on
|
|
setb P1.BpFET
|
|
ENDM
|
|
MACRO BpFET_off
|
|
clr P1.BpFET
|
|
ENDM
|
|
MACRO CpFET_on
|
|
setb P1.CpFET
|
|
ENDM
|
|
MACRO CpFET_off
|
|
clr P1.CpFET
|
|
ENDM
|
|
MACRO All_pFETs_On
|
|
setb P1.ApFET
|
|
setb P1.CpFET
|
|
setb P1.BpFET
|
|
ENDM
|
|
MACRO All_pFETs_Off
|
|
clr P1.ApFET
|
|
clr P1.CpFET
|
|
clr P1.BpFET
|
|
ENDM
|
|
|
|
MACRO Brake_FETs_On
|
|
ApFET_on
|
|
BpFET_on
|
|
CpFET_on
|
|
ENDM
|
|
MACRO Damping_FET_On
|
|
mov A, DampingFET
|
|
orl P1, A
|
|
ENDM
|
|
|
|
MACRO Set_Comp_Phase_A
|
|
mov CPT0MX, #43h ; Set comparator multiplexer to phase A
|
|
ENDM
|
|
MACRO Set_Comp_Phase_B
|
|
mov CPT0MX, #40h ; Set comparator multiplexer to phase B
|
|
ENDM
|
|
MACRO Set_Comp_Phase_C
|
|
mov CPT0MX, #41h ; Set comparator multiplexer to phase C
|
|
ENDM
|
|
MACRO Read_Comp_Out
|
|
mov A, CPT0CN ; Read comparator output
|
|
cpl A
|
|
ENDM
|
|
|
|
|
|
;*********************
|
|
; PORT 2 definitions *
|
|
;*********************
|
|
DebugPin EQU 0 ;o
|
|
|
|
P2_PUSHPULL EQU (1 SHL DebugPin)
|
|
|
|
|
|
;**********************
|
|
; MCU specific macros *
|
|
;**********************
|
|
MACRO Interrupt_Table_Definition
|
|
CSEG AT 0 ; Code segment start
|
|
jmp reset
|
|
CSEG AT 0Bh ; Timer0 interrupt
|
|
jmp t0_int
|
|
CSEG AT 2Bh ; Timer2 interrupt
|
|
jmp t2_int
|
|
CSEG AT 5Bh ; PCA interrupt
|
|
jmp pca_int
|
|
CSEG AT 73h ; Timer3 interrupt
|
|
jmp t3_int
|
|
ENDM
|
|
|
|
MACRO Initialize_Xbar
|
|
mov XBR1, #41h ; Xbar enabled, CEX0 routed to pin Rcp_In
|
|
All_nFETs_off ; For unlocking of HIP2103/4 driver circuits
|
|
call wait100ms
|
|
All_pFETs_on
|
|
call wait1ms
|
|
All_pFETs_off
|
|
ENDM
|
|
|
|
MACRO Initialize_Adc
|
|
mov REF0CN, #0Eh ; Set vdd (3.3V) as reference. Enable temp sensor and bias
|
|
IF MCU_48MHZ == 0
|
|
mov ADC0CF, #58h ; ADC clock 2MHz
|
|
ELSE
|
|
mov ADC0CF, #0C0h ; ADC clock 2MHz
|
|
ENDIF
|
|
mov AMX0P, #(8+Adc_Ip) ; Select positive input
|
|
mov AMX0N, #11h ; Select negative input as ground
|
|
mov ADC0CN, #80h ; ADC enabled
|
|
ENDM
|
|
MACRO Set_Adc_Ip_Volt
|
|
mov AMX0P, #(8+Adc_Ip) ; Select positive input
|
|
ENDM
|
|
MACRO Set_Adc_Ip_Temp
|
|
mov AMX0P, #10h ; Select temp sensor input
|
|
ENDM
|
|
MACRO Start_Adc
|
|
mov ADC0CN, #90h ; ADC start
|
|
ENDM
|
|
MACRO Read_Adc_Result
|
|
mov Temp1, ADC0L
|
|
mov Temp2, ADC0H
|
|
ENDM
|
|
MACRO Stop_Adc
|
|
ENDM
|
|
MACRO Set_RPM_Out
|
|
ENDM
|
|
MACRO Clear_RPM_Out
|
|
ENDM
|
|
MACRO Set_MCU_Clk_24MHz
|
|
mov CLKSEL, #0 ; Set clock to 24MHz
|
|
mov FLSCL, #80h ; Set flash timing for 24MHz
|
|
mov Clock_Set_At_48MHz, #0
|
|
ENDM
|
|
MACRO Set_MCU_Clk_48MHz
|
|
mov FLSCL, #90h ; Set flash timing for 48MHz
|
|
mov CLKSEL, #3 ; Set clock to 48MHz
|
|
mov Clock_Set_At_48MHz, #1
|
|
ENDM
|