'************************************************************************* '* <3-Phase motor controller> * '* by * '* Dr.Godfried-Willem RAES * '* Stamp2 Hardware version 1.0 * '* Filename : <3Phase.bs2> * '* Code version 1.2 * '************************************************************************* ' 15.06.1998: designed for Laukhuff compressor motor speed control. ' speed should vary -20% to + 30%. ' With no data applied, the generated three phase voltage ' should be 50Hz. ' 16.07.2001: reconsidered. ' 18.07.2001: Now runs under NT with new Parallax editor ' 22.07.2001: improved version. ' 26.02.2002: PC board designed. ' code rewritten, with startup and reset codes ' 05.03.2002: checked on actual BS2 ' 01.08.2002: Eeprom full. ( 7 bytes remaining now...) ' DECLARATIONS: Centrobyte VAR byte ' incoming byte, from pavo-midi op pp board Period VAR word ' INITIALISATION: ' parallel input bits 0 to 7 ' these bits are mapped on midi notes 0-7 ' make this byte an input: DIRL = 0 ' pin 8 used for relais control for high voltage supply ' pins 9,10,11 not used. (configured as output, for frequency monitoring) DIRC = $F 'DIR13 = 1 :' phase U output 'DIR14 = 1 :' phase V output 'DIR15 = 1 :' phase W output 'DIR12 = 1 :' not used bit ' these pins steer optocouplers connected to the gates of 3 high voltage power mosfets. DIRD = $F LOW 8 LOW 12 LOW 13 LOW 14 LOW 15 ' Initialisation of variables: Init: Goto ReadInput 'Centrobyte = INL :' low byte is incoming info 0-255, read only after reset 'IF Centrobyte = 1 THEN SwitchOn 'IF CentroByte = 0 THEN SwitchOff 'Period = 256 - Centrobyte 'IF Period > 25 THEN SetNormal 'IF Period < 26 THEN SetMax 'SetMax:' Period = 400 ' GOTO Ready 'SetNormal: ' Period = Period << 4 ' 16-2040 2microsecond units = 32microseconds -> 4ms ' ' note that << 4 is equivalent to *16 ' Period = 4096 levert uitgangsfrekwentie van 19.4 Hz ' Period = 2000 38 Hz ' Period = 1500 48.82 Hz ' Period = 1440 (centro= 90) 50.59 Hz ' Period = 1400 51.85 Hz ' Period = 200 levert uitgangsfrekwentie van 202 Hz (zou moeten 400 zijn) ' Period = 1 levert uitgangsfrekwentie van 392 Hz ' Period = 0 levert uitgangsfrekwentie van 393.7 Hz ' GOTO Ready 'Ready: 'DEBUG DEC Period HIGH 13 ' START OF RUN-CODE:***************************************************** ' following loop is o.k. for 50Hz motors driven with any frequency from 50Hz upwards.... ' for slower frequencies, we need to reduce the current! Normal50: ' cycle 1: Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 2 ' 360 graden 0010 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 ' 360 graden 0010 'cycle 3 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 4 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 5 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 6 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 7 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 8 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 9 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 10 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 ' read input 5 times a second: GOTO ReadInput Faster: ' cycle 1: Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 2 ' 360 graden 0010 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 ' 360 graden 0010 'cycle 3 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 4 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 5 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 6 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 7 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 8 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 9 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 10 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 11 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 12 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 13 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 14 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 15 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 16 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 17 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 18 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 19 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 20 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 21 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 ' read input 5 times a second: ( depends on Period) GOTO ReadInput Slower50: ' cycle 1: Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 2 ' 360 graden 0010 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 ' 360 graden 0010 'cycle 3 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 4 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 5 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 6 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 7 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 8 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 9 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 'cycle 10 Pulsout 9, Period HIGH 15 ' 60 graden 1010 Pulsout 10, Period LOW 13 ' 120 graden 1000 Pulsout 11, Period HIGH 14 ' 180 graden 1100 Pulsout 9, Period LOW 15 ' 240 graden 0100 Pulsout 10, Period HIGH 13 ' 300 graden 0110 Pulsout 11, Period LOW 14 ' read input 4 times a second: GOTO ReadInput Slower60: ' this loop reduces the average voltage over the windings to 60% of nominal ' it should be used for frequencies between 25Hz and 40Hz ' cycle 1: Pulsout 9, Period + Period LOW 13 HIGH 15 Pulsout 10, Period + Period LOW 15 HIGH 14 Pulsout 11, Period + Period LOW 14 HIGH 13 ' cycle 2: Pulsout 9, Period + Period LOW 13 HIGH 15 Pulsout 10, Period + Period LOW 15 HIGH 14 Pulsout 11, Period + Period LOW 14 HIGH 13 ' cycle 3: Pulsout 9, Period + Period LOW 13 HIGH 15 Pulsout 10, Period + Period LOW 15 HIGH 14 Pulsout 11, Period + Period LOW 14 HIGH 13 ' cycle 4: Pulsout 9, Period + Period LOW 13 HIGH 15 Pulsout 10, Period + Period LOW 15 HIGH 14 Pulsout 11, Period + Period LOW 14 HIGH 13 ' cycle 5: Pulsout 9, Period + Period LOW 13 HIGH 15 Pulsout 10, Period + Period LOW 15 HIGH 14 Pulsout 11, Period + Period LOW 14 HIGH 13 ' cycle 6: Pulsout 9, Period + Period LOW 13 HIGH 15 Pulsout 10, Period + Period LOW 15 HIGH 14 Pulsout 11, Period + Period LOW 14 HIGH 13 goto ReadInput Slower30 ' this loop reduces the average voltage over the windings to 30% of nominal ' it should be used for all frequencies below 25Hz. ' cycle 1: Pulsout 9, Period HIGH 15 Pulsout 10, Period LOW 15 Pulsout 11, Period HIGH 14 Pulsout 9, Period LOW 14 Pulsout 10, Period HIGH 13 Pulsout 11, Period LOW 13 ' cycle 2: Pulsout 9, Period HIGH 15 Pulsout 10, Period LOW 15 Pulsout 11, Period HIGH 14 Pulsout 9, Period LOW 14 Pulsout 10, Period HIGH 13 Pulsout 11, Period LOW 13 ' cycle 3: Pulsout 9, Period HIGH 15 Pulsout 10, Period LOW 15 Pulsout 11, Period HIGH 14 Pulsout 9, Period LOW 14 Pulsout 10, Period HIGH 13 Pulsout 11, Period LOW 13 ' cycle 4: Pulsout 9, Period HIGH 15 Pulsout 10, Period LOW 15 Pulsout 11, Period HIGH 14 Pulsout 9, Period LOW 14 Pulsout 10, Period HIGH 13 Pulsout 11, Period LOW 13 ' cycle 5: Pulsout 9, Period HIGH 15 Pulsout 10, Period LOW 15 Pulsout 11, Period HIGH 14 Pulsout 9, Period LOW 14 Pulsout 10, Period HIGH 13 Pulsout 11, Period LOW 13 ' cycle 6: Pulsout 9, Period HIGH 15 Pulsout 10, Period LOW 15 Pulsout 11, Period HIGH 14 Pulsout 9, Period LOW 14 Pulsout 10, Period HIGH 13 Pulsout 11, Period LOW 13 goto ReadInput ReadInput: Centrobyte = INL :' low byte is incoming info 0-255 IF Centrobyte > 127 THEN Set80Hz ' midi note 7 IF Centrobyte > 63 THEN Set70Hz ' midi note 6 IF CentroByte > 31 THEN Set60Hz ' midi note 5 IF CentroByte > 15 THEN Set50Hz ' midi note 4 IF Centrobyte > 7 THEN Set40Hz ' midi note 3 IF Centrobyte > 3 THEN Set30Hz ' midi note 2 IF CentroByte > 1 THEN Set20Hz ' midi note 1 IF Centrobyte = 1 THEN SwitchOn ' midi note 0 IF Centrobyte = 0 THEN SwitchOff goto ReadInput Set20Hz: Period = 4096 GOTO Slower30 Set30Hz: Period = 2600 GOTO Slower60 Set40Hz: Period = 2048 GOTO Slower50 Set50Hz: Period = 1440 GOTO Normal50 Set60Hz: Period = 1152 ' to be checked! GOTO Faster Set70Hz: Period = 864 GOTO Faster Set80Hz: Period = 576 GOTO Faster SwitchOn: HIGH 8 LOW 15 LOW 14 LOW 13 Goto ReadInput SwitchOff: LOW 8 LOW 15 LOW 14 LOW 13 Goto ReadInput END