1. Trang chủ
  2. » Giáo án - Bài giảng

AN0531 intelligent remote positioner (motor control)

16 265 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 206,82 KB

Nội dung

AN531 Intelligent Remote Positioner (Motor Control) Author: Steven Frank Vesta Technology Inc INTRODUCTION The excellent cost/performance ratio of the PIC16C5X makes it well suited as a low-cost proportional D.C actuator controller This application note depicts a design for a remote intelligent positioning system using a D.C motor (up to 1/3 hp) run from 12V to 24V The position accuracy is one in eight bits or 0.4% The PIC16C5X receives its command and control information via a Microwire serial bus However, any serial communication method is applicable IMPLEMENTATION The PIC16C5X based controller receives movement commands from a host, compares them to the actual position, calculates the desired motor drive level and then pulses a full H-bridge (Figure 2) In this way it serves as a remote intelligent positioner, driving the load until it has reached the commanded position It can be used to control any proportional D.C actuator (i.e., D.C motor or proportional valve) This system is ideally suited for remotely positioned valves and machinery It can be used with D.C motors to easily automate manual equipment Because of the 5-wire serial interface, the positioner can be installed near its power supply and load The remote intelligent positioner can then be linked to the central control processor by a small diameter easily routed cable Since the positioner is running its own closed-loop PID algorithm (Figure 3), the host central processor needs only to send position commands and is therefore free to service the user interface, main application software and command multiple remote positioners The limit switch inputs provide a safety net which keeps the system from destroying itself in the event that the feedback device is damaged The optional current sense input can be used to determine if the load has jammed and prevent overheating of the actuator and drive electronics The commanded positions are presented to the PIC16C5X via a microwire type protocol at bit-rates of up to 50 Kbs for a MHz part As currently implemented in this application note, the position request is the only communication There are several variable locations available which could be used to down-load the loop gain parameters, read positioner information, or set a current limit The host that is sending the position request must set the chip select low, and wait for the PIC16C5X to raise the "busy" (DO) line high At this point, eight data bits can be clocked into the PIC16C5X The requested position is sent most significant bit first and can be any 8-bit value Values through 255 represent valid positions with being reserved for drive disable The PIC16C5X acquires its data by way of a Microwire A/D converter This part was chosen for low cost while providing adequate performance In Figure the second channel of the A/D converter is shown connected to a peak current detector If the user desires, the PIC16C5X could monitor and protect the motor from overcurrent conditions by monitoring the second channel FIGURE 1: BLOCK DIAGRAM TEST SET-UP Microwire Input A/D Converter PIC16C5X +5 Load Pot Power FET Bridge Position M P P N N Peak Detector Peak current through motor Microwire is a registered trademark of National Semiconductor Corporation  1997 Microchip Technology Inc DS00531E-page AN531 The H-bridge power amplifier will deliver 10 or more amps at upto 24V when properly heat-sinked It is wired for a modified 4-quadrant mode of operation One leg of the bridge is used to control direction and the other leg pulses the low FET and the high FET alternately to generate the desired duty-cycle In this way the system will operate well to produce a desired "speed" without the use of a separate speed control loop This allows use of the PIC16C5X to control the PID algorithm for position directly while having reasonable speed control The capacitance at the gates of the FETs combined with the impedance of the drive circuits provides for turn-off of the upper FET before the lower FET turns on an important criteria The three terms (proportional, integral, differential) are summed algebraically and scaled to produce a percentage speed request between and 100% The sign of the sum is used to control the direction of the H-bridge The loop calculations run approximately 20 times per second on a MHz part This yields sufficient gain-bandwidth for most positioning applications If higher system performance is desired, the number of pulses can be reduced to 20 and a 16 MHz PIC16C5X can be used Your loop gains (KP, KI, KD) will have to be recalculated, but the system sample rate will be increased to 400 Hz This should be sufficient to control a system that has a response time of 20 milliseconds or more The PID algorithm itself is where most of the meat of this application note is located so let's look at it more closely The algorithm is formed by summing the contribution of three basic components The first calculation is the error upon which the other terms are based The key to using the PIC16C5X series parts for PID control and PWM generation is to separate the two into separate tasks There simply is not the hardware support or the processing speed to accurately both concurrently It is fortunate therefore that it is not necessary to both concurrently Most systems can be stabilized with a much lower information update rate than the PWM frequency This supports the approach of calculating the desired percentage, outputting the PWM for a period of time and then recalculating the new desired percentage Using this technique, the inexpensive PIC16C5X can implement PID control, PWM generation, and will still have processing time left over for monitor or communication functions The error is the requested position minus the actual position It is a signed number whose magnitude can be 255 In order not to lose resolution, the error is stored as an 8-bit magnitude with the sign stored separately in the FLAGS register under ER_SGN This allows us to resolve a full signed 8-bit error with 8-bit math The proportional term is merely the algebraic difference of the requested position minus the actual position It is scaled by a gain term (KP) called the "proportional gain" The sign (+,-) of this term is important for it tells the system which direction it must drive to correct the error The proportional term is limited to ±100 Increasing the proportional gain term will improve the dynamic and static accuracy of the system Increasing it too much will cause oscillations The next term that gets calculated is the integral term (KI) This term is traditionally formed by integrating the error over time In this application it is done by integrating the KI term over time When the error is zero, no integration is performed This is a more practical way to handle a potentially large number in 8-bit math By increasing the KI term the D.C or static gain of the system is improved Increasing the integral gain too much can lead to low frequency oscillations About the Author: Steven Frank has been designing analog and digital control systems for ten years His background is in medical and consumer electronics He has received numerous patents in control systems and instrumentation At Vesta Technology Inc., Mr Frank works with a number of engineers on custom embedded control systems designs Vesta Technology Inc is a provider of embedded control systems from an array of standard products and designs Vesta offers custom design services and handles projects from concept to manufacturing The differential term (KD) is a stabilizing term that helps keep the integral and proportional terms from overdriving the system through the desired position and thus creating oscillations As you use more proportional and integral gain you will need more differential gain as well The differential gain is calculated by looking at the rate of change of the positional error with respect to time It is actually formed as "delta error/delta time" with the delta time being a program cycle DS00531E-page  1997 Microchip Technology Inc AN531 FIGURE 2: PROGRAM FLOWCHART FIGURE 3: PID ALGORITHM FLOWCHART Start Start Limit Switches Set? Yes ERR = POSR - POSA ERR = POSR - POSA No New Position Requested? No KPERR ← Min of ←or Min of [KPKperr • ERR 100] [Kp • ERR or 100] Yes Get New Position = POSR SUM ← SUM + KPERR SUM ← SUM + Kperr ERR = Positive ERR = Positive Get Actual Position = POSA Yes ACCM = ACCM + KI ACCM = ACCM Direction = CW+ KI Direction = CW No Determine PID term = PENT and direction Fig SUM ← SUM + Min of SUM ← SUM + Min of [ACCM or 100] [ACCM or 100] Set CNT = 100 PCH ← PCNT; PCL ← 100 - PCNT de/dt = ERR - OLD_ERR de/dt = ERR - OLD_ERR KDERR = KD • de/dt Kderr = KD • de/dt Drive Motor Hi; PCH ← PCH - PCH = 0? ACCM = ACCM - KI ACCM = ACCM Direction = CCW- KI Direction = CCW No SUM ← SUM + Min of SUM ← SUM + Min of [KDERR or 100] [Kderr or 100] Yes Yes SUM Positive SUM Positive Drive Motor Lo; PCL ← PCL - PCH = 0? Set Bridge Set Bridge for CW for CW No No Yes Set Bridge SetCCW Bridge for for CW PCNT = Min of PCNTor= 100] Min of [SUM [SUM or 100] CNT ← CNT - No CNT = 0? End End Yes  1997 Microchip Technology Inc DS00531E-page AN531 FIGURE 4: SCHEMATIC Microwire Port +5 U1 RA2 RA3 RA1 RA0 T0CKI OSC1 MCLR OSC2 Vss VDD RB7 RB0 RB6 RB1 RB5 RB2 RB4 RB3 18 17 0.1 µF 10 µF 16 15 20 pF 20 pF U2 14 13 12 11 10 CS DI DO PIC16C56 +PWR 1N4001 Vcc CH1 CH0 CLK GND Position Feedback ADC0832 +5 +5 100 +PWR 1N4750 10 µF 35V P Vi U3 GND Vo 10k x 0.1 µF Input Switches LM7805 RTN +PWR 0.1 x P +PWR 1k 1k 1000 µF +PWR 35V MTP23PO6 P 10k 1k 1k +PWR +PWR 10k 1k Motor 1k 10k 1k 0.01 µF 1k P 1k 1k P 1k 0.01 µF 10k 1k MTP25NO5E P P P LM358 U4B 1N914 0.04 watt P 1N914 +5 0.01 µF U4A P LM358 Note 1: All pnp transistors are 2N3906 2: All npn transistors are 2N3904 3: All diodes 1N914 unless otherwise specified 4: All zeners are 1N4742 DS00531E-page 1k 47k µF  1997 Microchip Technology Inc AN531 Please check the Microchip BBS for the latest version of the source code Microchip’s Worldwide Web Address: www.microchip.com; Bulletin Board Support: MCHIPBBS using CompuServe® (CompuServe membership not required) APPENDIX A: MWPOS.ASM MPASM 01.40 Released LOC OBJECT CODE VALUE 00000000 00000019 00000003 00000001 00000000 00000003 00000004 00000005 00000006 00000007 00000008 00000009 0000000A 0000000B 0000000C 0000000D 0000000E 0000000F 00000010 00000011 00000012 00000013 00000013 00000014 00000014 00000015 00000015 00000016 00000016 00000017 00000018 00000000 00000001 00000000 00000002 00000001 00000000 MWPOS.ASM 1-16-1997 13:16:02 PAGE LINE SOURCE TEXT 00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 00025 00026 00027 00028 00029 00030 00031 00032 00033 00034 00035 00036 00037 00038 00039 00040 00041 00042 00043 00044 00045 00046 00047 00048 00049 00050 00051 00052 00053 00054 00055 00056 00057 00058 00059 00060 00061 00062 00063 00064 00065 00066 00067 00068 00069 00070 TITLE “ MicroWire Positioner “ ; ; ; mw8pos.asm LIST P=16C56 ; ;*************************************************************** ; ; Program: MWPOS.ASM ; Revision Date: 1/10/92 srf REV A ; 1-13-97 Compatibility with MPASMWIN 1.40 ; ;****************************************************************************** ; ;REGISTER EQUATES ; PNTR EQU 00H ; CONTENTS OF POINTER FLAGS EQU 19H ; USE THIS VARIABLE LOCATION AS FLAGS ; BIT IS SIGN OF ERROR IS NEGATIVE ; BIT IS SIGN OF ERROR ACCUMULATOR ; BIT IS SIGN OF THE DE/DT TERM ; BIT IS DIRECTION IS CW ; BIT IS SIGN OF THE OLD ERROR STATUS EQU 03H F EQU W EQU SWR EQU 03H ; STATUS WORD REGISTER ; = CARRY ; = DC ; = Z, SET IF RESULT IS ZERO FSR EQU 04H ; FILE SELECT REGISTER PORTA EQU 05H ; I/O REG (A0-A3), (A4-A7 DEF=0) PORTB EQU 06H ; I/O REGISTER(B0-B7) HI EQU 07H ; NUMBER OF HIGH MICROSECONDS LO EQU 08H ; NUMBER OF LOW MICROSECONDS PCNT EQU 09H ; PERCENT DUTYCYCLE REQUEST HI_T EQU 0AH ; COUNTER FOR USECONDS LEFT/PULSE HI LO_T EQU 0BH ; COUNTER FOR USECONDS LEFT/PULSE LO ERR1 EQU 0CH ; HOLDER FOR THE POSITIONAL ERROR ; THIS IS AN BIT MAGNITUDE WITH THE SIGN ; KEPT IN THE FLAG REGISTER (9BIT SIGNED) SUMLO EQU 0DH ; PROGRESSIVE SUM OF THE PID TERMS ACCUM EQU 0EH ; ERROR ACCUMULATOR ERR_O EQU 0FH ; ERROR HISTORY USED FOR de/dt ; THIS IS AN BIT MAGNITUDE WITH THE SIGN ; KEPT IN THE FLAG REGISTER (9BIT SIGNED) POSR EQU 10H ; POSITIONAL REQUEST POSA EQU 11H ; ACTUAL POSITION CYCLES EQU 12H ; COUNTER FOR CYCLES OUT mulcnd ACCaLO mulplr ACCbLO H_byte ACCaHI L_byte ACCbHI count SUMHI equ EQU equ EQU equ EQU equ EQU equ EQU 13H 13H 14H 14H 15H 15H 16H 16H 17H 18H ; ; ; ; ; ; ; ; ; ; bit multiplicand same location used for the add bit multiplier same location used for the add High byte of the 16 bit result same location used for the add Low byte of the 16 bit result same location used for the add loop counter HIGH BYTE OF THE LOOP SUM routine routine routine routine ; PORT ASSIGNMENTS AND CONSTANTS PWMCW PWMCCW CARRY Z Same ER_SGN  1997 Microchip Technology Inc EQU EQU EQU EQU equ EQU ; ; ; ; ; ; CLOCKWISE PWM OUTPUT BIT COUNTERCLOCKWISE PWM OUTPUT BIT CARRY BIT IN THE STATUS REGISTER THE ZERO BIT OF THE STATUS REGISTER SIGN BIT FOR THE ERROR IN FLAG REGISTER DS00531E-page AN531 00000001 00000002 00000004 00000030 00000002 00000020 00000003 00000007 00000006 00000005 00000002 00000001 00000000 00000003 0000 0B88 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 0075 0076 0C08 0037 0213 0403 0334 0603 01F5 0335 0336 02F7 0A07 0800 000F 0917 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 0213 01F4 0603 02B6 0215 01F6 0800 0273 02B3 0643 00F5 0275 0800 DS00531E-page 00071 00072 00073 00074 00075 00076 00077 00078 00079 00080 00081 00082 00083 00084 00085 00086 00087 00088 00089 00090 00091 00092 00093 00094 00095 00096 00097 00098 00099 00100 00101 00102 00103 00104 00105 00106 00107 00108 00109 00110 00111 00112 00113 00114 00115 00116 00117 00118 00119 00120 00121 00122 00123 00124 00125 00126 00127 00128 00129 00130 00131 00132 00133 00134 00135 00136 00137 00138 00139 00140 00141 00142 00143 00144 00145 00146 00147 00148 00149 00150 00151 00152 00153 AC_SGN DE_SGN OER_SGN KP KI KD DIR CSN BV CK MWDO MWDI MWCS MWCK EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU 30 20 ; ; ; ; ; ; ; ; ; ; ; ; ; ; SIGN BIT FOR THE ERROR ACCUMULATOR SIGN BIT FOR DE/DT SIGN BIT FOR THE OLD ERROR PROPORTIONAL GAIN INTEGRAL GAIN DIFFERENTIAL GAIN THE DIRECTION FLAG CHIP SELECT NOT ON A/D DATA LINE FOR THE A/D CLOCK LINE FOR THE A/D MICROWIRE DATA OUT FROM POSITIONER MICROWIRE DATA IN TO POSITIONER MICROWIRE CHIP SELECT TO POSITIONER MICROWIRE CLOCK IN TO POSITIONER ;***** MACROS ********************************************** ; CLKUP MACRO ; clock up macro for the microwire BSF PORTB,CK ; data acquisition from the a/d NOP ENDM CLKDN MACRO BCF NOP ENDM GET_BIT MACRO BCF BSF BTFSC BSF RLF BCF NOP ENDM GOTO PORTB,CK ; clock down macro for the microwire ; data acquisition from the a/d ; ** FOR RECEIVING A/D DATA ** SWR,CARRY PORTB,CK PORTB,BV SWR,CARRY POSA, F PORTB,CK ; ; ; ; ; ; SET CLOCK BIT HIGH LOOK AT DATA COMING IN SET THE CARRY FOR A ROTATE THE W REG LEFT SET THE CLOCK LOW DELAY CLRREG ;***** MATH ROUTINES **************************************** ; ; **** BIT MULTIPLY ******** ; ***************************** Begin Multiplier Routine mpy_S clrf H_byte clrf L_byte movlw movwf count movf mulcnd,W bcf STATUS,CARRY ; Clear the carry bit in the status Reg loop rrf mulplr, F btfsc STATUS,CARRY addwf H_byte,Same rrf H_byte,Same rrf L_byte,Same decfsz count, F goto loop retlw ; ****************************** ; DOUBLE PRECISION ADD AND SUBTRACT ( ACCb-ACCa->ACCb ) D_sub call neg_A ; At first negate ACCa, then add ;**************** ; Double Precision Addition ( ACCb+ACCa->ACCb ) D_add ; ; neg_A movf addwf btfsc incf movf addwf retlw ACCaLO,W ACCbLO, F STATUS,CARRY ACCbHI, F ACCaHI,W ACCbHI, F 00 comf incf btfsc decf comf retlw ACCaLO, F ACCaLO, F STATUS,Z ACCaHI, F ACCaHI, F 00 ; add lsb ; add in carry ; add msb ; negate ACCa  1997 Microchip Technology Inc AN531 001D 001D 001E 001F 0020 0021 0022 0403 0336 0403 0335 0603 05F6 0023 0024 0025 0026 0027 0028 0403 0336 0403 0335 0603 05F6 0029 002A 002B 002C 002D 002E 0403 0336 0403 0335 0603 05F6 002F 0030 0031 0032 0033 0034 0403 0336 0403 0335 0603 05F6 0035 0035 0036 0037 0038 0039 003A 003B 003C 003C 003D 003E 003F 0040 0041 0042 0042 0043 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F 0C01 0095 0703 0A3C 0C64 0036 0A42 0C64 0096 0703 0A42 0C64 0036 0800 0209 0027 0C64 0028 0209 00A8 0207 0643 02A7 0208 0643 02A8 0800 0050 0050 0000 00154 00155 00156 00157 00158 00159 00160 00161 00162 00163 00164 00165 00166 00167 00168 M M M M M M 00169 M M M M M M 00170 M M M M M M 00171 M M M M M M 00172 00173 00174 00175 00176 00177 00178 00179 00180 00181 00182 00183 00184 00185 00186 00187 00188 00189 00190 00191 00192 00193 00194 00195 00196 00197 00198 00199 00200 00201 00202 00203 00204 00205 00206 00207 00208 00209 00210 00211 00212 ; ******************************************** ; divide by 16 and limit to 100 Decimal SHIFT MACRO BCF RRF BCF RRF BTFSC BSF ENDM SWR,CARRY L_byte, F SWR,CARRY H_byte, F SWR,CARRY L_byte,7 DIV_LMT SHIFT BCF RRF BCF RRF BTFSC BSF SHIFT BCF RRF BCF RRF BTFSC BSF SHIFT BCF RRF BCF RRF BTFSC BSF SHIFT BCF RRF BCF RRF BTFSC BSF SWR,CARRY L_byte, F SWR,CARRY H_byte, F SWR,CARRY L_byte,7 SWR,CARRY L_byte, F SWR,CARRY H_byte, F SWR,CARRY L_byte,7 SWR,CARRY L_byte, F SWR,CARRY H_byte, F SWR,CARRY L_byte,7 SWR,CARRY L_byte, F SWR,CARRY H_byte, F SWR,CARRY L_byte,7 LMT100 MOVLW SUBWF BTFSS GOTO MOVLW MOVWF GOTO 1H H_byte,0 SWR,CARRY L8_E 64H L_byte LMT_EXIT ; ; ; ; ; ; SUBTRACT FROM THE HIGH BYTE TO SEE IF THERE IS ANYTHING THERE, IF NOT, THEN LEAVE THE LOW BYTE ALONE OTHERWISE GIVE THE LOW BYTE A FULL COUNT AND IT WILL HAVE BEEN LIMITED TO 100 MOVLW SUBWF BTFSS GOTO MOVLW MOVWF 64H L_byte,0 SWR,CARRY LMT_EXIT 64H L_byte ; LIMIT THE MAGNITUDE OF THE VALUE TO ; 100 DECIMAL L8_E LMT_EXIT RETLW 00 ; ;THE ROUTINE CALCTIMES DOES THE FOLLOWING: PCNT = DUTY CYCLE IN % ; 100 - PCNT > LO AND PCNT > HI ZERO VALUES IN EITHER LO OR HI ;ARE FORCED TO CALCTIMES MOVF PCNT,W ; PUT REQUESTED % INTO W REGISTER MOVWF HI ; COPY ON MICROSECONDS IN TO HI TIME MOVLW 64H MOVWF LO MOVF PCNT,0 SUBWF LO,1 ; LEAVE 100-HI TIME IN LO TIME MOVF HI,0 ; INSPECT THE HIGH TIME BTFSC SWR,2 ; IF ITS IS ZERO INCF HI,1 ; INCREMENT IT MOVF LO,0 ; INSPECT THE LO TIME BTFSC SWR,2 ; IF ITS ZERO INCF LO,1 ; INCREMENT IT RETLW 00 ;******************************************************************* BEGIN NOP ; STUBBED BEGINNING  1997 Microchip Technology Inc DS00531E-page AN531 0051 0051 0052 0053 0054 0055 0056 0057 0058 0058 0059 005A 005B 005C 005D 005D 005E 005F 0060 0061 0062 0062 0063 0064 0065 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006E 006F 0070 0004 0746 0A51 0766 0A51 0786 0A51 0C0B 0005 0445 0C20 0037 0705 0A62 02F7 0A5D 0A71 0545 0C08 0037 0765 0A65 0403 0625 0503 0370 02F7 0A6E 0A71 0665 0A6E 0A65 0071 0071 0445 0072 0072 0210 0073 0643 0074 0A50 DS00531E-page 00213 00214 00215 00216 00217 00218 00219 00220 00221 00222 00223 00224 00225 00226 00227 00228 00229 00230 00231 00232 00233 00234 00235 00236 00237 00238 00239 00240 00241 00242 00243 00244 00245 00246 00247 00248 00249 00250 00251 00252 00253 00254 00255 00256 00257 00258 00259 00260 00261 00262 00263 00264 00265 00266 00267 00268 00269 00270 00271 00272 00273 00274 00275 00276 00277 00278 00279 00280 00281 00282 00283 00284 00285 00286 00287 00288 00289 00290 00291 00292 00293 00294 00295 ;****CHECKING THE LIMIT SWITCHES AND CHECKING FOR MW*************** ; This will check the switch inputs for closure and will terminate ; pulsing if one is closed It doesn’t distinguish between the switches ; so they are not dedicated to cw end and ccw end SW_TRAP CLRWDT BTFSS GOTO BTFSS GOTO BTFSS GOTO PORTB,2 SW_TRAP PORTB,3 SW_TRAP PORTB,4 SW_TRAP ; ; ; ; ; THIS WILL TEST ALL SWITCH INPUTS IF SET THEN EXECUTION WILL BE LIMITED TO IT TO BE CLEARED THREE OF THE ANY ONE IS OF THE CODE LOOKING FOR ;****RECEIVING THE POSITIONAL REQUEST******************************* ; The host system that wishes to send positional requests to the positioner ; servo makes its desire known by setting the chip select to the positioner ; low It then monitors the busy (Data Out) line from the positioner When ; the positioner sets the busy line high, the host may begin sending its bit ; request The data bits should be valid on the rising edge of the clock ; After bits have been received by the positioner it will begin operation ; to send the system to the received position It can be interrupted at any ; point during the positioning process by the host sending a new command The ; opportunity to update the command is issued every 100 pwm pulses (every 50 ; milliseconds) ; If the host sends a zero positional command the positioner will stop the ; system and remain inactive ; If the host does not successfully complete a microwire transmission of ; data bits the watchdog timer will trip and reset the system to an inactive ; “stopped” state REC_MW MOVLW TRIS BCF MOVLW MOVWF 0BH PORTA PORTA,MWDO 20H count ; RESET THE PORT FOR THREE INPUTS ; AND ONE OUTPUT ; SET THE DATA OUT LOW FOR BUSY BTFSS GOTO DECFSZ GOTO GOTO PORTA,MWCS REC_CMD count,1 WATCH_CS REC_EXIT ; CHECK FOR INCOMING REQUESTS ; RECEIVE A NEW POSITION REQUEST BSF MOVLW MOVWF PORTA,MWDO 8H count ; SET THE DATA OUT HIGH FOR “OK TO SEND” ; SET TO RECEIVE BITS BTFSS GOTO BCF BTFSC BSF RLF DECFSZ GOTO GOTO PORTA,MWCK WAIT_UP SWR,CARRY PORTA,MWDI SWR,CARRY POSR,1 count,1 WAIT_DN REC_EXIT ; WAIT FOR A RISING EDGE BTFSC GOTO GOTO PORTA,MWCK WAIT_DN WAIT_UP ; CHECK THE INCOMING CLOCK ; IF IT IS STILL HIGH WAIT FOR IT TO GO LOW ; IF IT GOES LOW GO BACK TO RECEIVE NEXT BIT PORTA,MWDO ; SET THE BUSY FLAG WATCH_CS ; NO REQUEST WAS MADE IN THE TIME ALLOTED REC_CMD WAIT_UP ; ; ; ; ; ; ; RESET THE CARRY TO A DEFAULT ZERO READ THE DATA IN SET THE CARRY FOR A ONE ROTATE THE BIT INTO THE POSITION REQ DECREMENT THE BIT COUNTER WAIT FOR THE FALLING EDGE LAST BIT RECEIVED WAIT_DN REC_EXIT BCF ;********** CHECK FOR THE DISABLE REQUEST ************************* ; Position is considered a request to not drive the system In this way ; the positioner will come up from a reset in a safe state and will not ; try to move the system to some arbitrary location MOVE MOVF BTFSC GOTO POSR,W SWR,Z BEGIN ; CHECK THE REQUESTED POSTION ; IF IT IS ZERO THEN WAIT FOR A NON-ZERO ; REQUEST BY BRANCHING BACK TO THE BEGINNING ;****READING THE A/D VALUES***************************************** ; ; Read the positional a/d channel (1) and store the value in the actual  1997 Microchip Technology Inc AN531 0075 0075 0076 0077 0078 0079 007A 0071 04E6 0C1C 0006 05C6 0000 007B 05A6 007C 0000 007D 04A6 007E 0000 007F 05A6 0080 0000 0081 04A6 0082 0000 0083 05A6 0084 0000 0085 0086 0087 0088 04A6 0000 0C5C 0006 0089 05A6 008A 0000 008B 04A6 008C 0000 008D 008E 008F 0090 0091 0092 0093 0403 05A6 06C6 0503 0371 04A6 0000 0094 0095 0096 0097 0098 0099 009A 0403 05A6 06C6 0503 0371 04A6 0000 009B 009C 009D 009E 009F 00A0 00A1 0403 05A6 06C6 0503 0371 04A6 0000 00A2 00A3 00A4 00A5 00A6 00A7 00A8 0403 05A6 06C6 0503 0371 04A6 0000 00A9 00AA 00AB 00AC 00AD 00AE 00AF 0403 05A6 06C6 0503 0371 04A6 0000 00B0 00B1 00B2 00B3 00B4 00B5 0403 05A6 06C6 0503 0371 04A6 00296 ; position variable (POSA) 00297 ; This is written in line to minimize the use of variables 00298 00299 READ_POS 00300 CLRF POSA ; CLEAN THE POSITION ACTUAL HOLDER 00301 BCF PORTB,CSN ; SET THE CHIP SELECT LOW TO A/D 00302 MOVLW 1CH ; SET THE DATA LINE TO OUTPUT 00303 TRIS PORTB ; FOR SENDING SET-UP BITS 00304 BSF PORTB,BV ; SET FOR “START” BIT 00305 NOP 00306 CLKUP ; CLOCK IN THE START BIT M BSF PORTB,CK ; data acquisition from the a/d M NOP 00307 CLKDN ; “ M BCF PORTB,CK ; data acquisition from the a/d M NOP 00308 CLKUP ; CLOCK IN SINGLE-ENDED M BSF PORTB,CK ; data acquisition from the a/d M NOP 00309 CLKDN ; “ M BCF PORTB,CK ; data acquisition from the a/d M NOP 00310 CLKUP ; CLOCK IN CHANNEL M BSF PORTB,CK ; data acquisition from the a/d M NOP 00311 CLKDN ; TO THE MUX M BCF PORTB,CK ; data acquisition from the a/d M NOP 00312 MOVLW 5CH ; SET THE DATA LINE TO INPUT 00313 TRIS PORTB ; TO RECEIVE DATA BITS FROM A/D 00314 CLKUP ; CLOCK UP TO LET MUX SETTLE M BSF PORTB,CK ; data acquisition from the a/d M NOP 00315 CLKDN ; CLOCK DN TO LET MUX SETTLE M BCF PORTB,CK ; data acquisition from the a/d M NOP 00316 GET_BIT ; GET BIT M BCF SWR,CARRY M BSF PORTB,CK ; SET CLOCK BIT HIGH M BTFSC PORTB,BV ; LOOK AT DATA COMMING IN M BSF SWR,CARRY ; SET THE CARRY FOR A M RLF POSA, F ; ROTATE THE W REG LEFT M BCF PORTB,CK ; SET THE CLOCK LOW M NOP ; DELAY 00317 GET_BIT ; BIT M BCF SWR,CARRY M BSF PORTB,CK ; SET CLOCK BIT HIGH M BTFSC PORTB,BV ; LOOK AT DATA COMMING IN M BSF SWR,CARRY ; SET THE CARRY FOR A M RLF POSA, F ; ROTATE THE W REG LEFT M BCF PORTB,CK ; SET THE CLOCK LOW M NOP ; DELAY 00318 GET_BIT ; BIT M BCF SWR,CARRY M BSF PORTB,CK ; SET CLOCK BIT HIGH M BTFSC PORTB,BV ; LOOK AT DATA COMMING IN M BSF SWR,CARRY ; SET THE CARRY FOR A M RLF POSA, F ; ROTATE THE W REG LEFT M BCF PORTB,CK ; SET THE CLOCK LOW M NOP ; DELAY 00319 GET_BIT ; BIT M BCF SWR,CARRY M BSF PORTB,CK ; SET CLOCK BIT HIGH M BTFSC PORTB,BV ; LOOK AT DATA COMMING IN M BSF SWR,CARRY ; SET THE CARRY FOR A M RLF POSA, F ; ROTATE THE W REG LEFT M BCF PORTB,CK ; SET THE CLOCK LOW M NOP ; DELAY 00320 GET_BIT ; BIT M BCF SWR,CARRY M BSF PORTB,CK ; SET CLOCK BIT HIGH M BTFSC PORTB,BV ; LOOK AT DATA COMMING IN M BSF SWR,CARRY ; SET THE CARRY FOR A M RLF POSA, F ; ROTATE THE W REG LEFT M BCF PORTB,CK ; SET THE CLOCK LOW M NOP ; DELAY 00321 GET_BIT ; BIT M BCF SWR,CARRY M BSF PORTB,CK ; SET CLOCK BIT HIGH M BTFSC PORTB,BV ; LOOK AT DATA COMMING IN M BSF SWR,CARRY ; SET THE CARRY FOR A M RLF POSA, F ; ROTATE THE W REG LEFT M BCF PORTB,CK ; SET THE CLOCK LOW  1997 Microchip Technology Inc DS00531E-page AN531 00B6 0000 00B7 00B8 00B9 00BA 00BB 00BC 00BD 0403 05A6 06C6 0503 0371 04A6 0000 00BE 00BF 00C0 00C1 00C2 00C3 00C4 00C5 0403 05A6 06C6 0503 0371 04A6 0000 05E6 00C6 00C6 00C7 00C8 00C9 00CA 0211 0090 0603 0ACB 0ACE 00CB 00CB 002C 00CC 0419 00CD 0AD2 00CE 00CE 00CF 00D0 00D1 0210 0091 002C 0519 00D2 00D2 006D 00D3 0078 00D4 00D4 00D5 00D6 00D7 00D8 00D9 020C 0033 0C30 0034 0901 091D 00DA 00DA 00DB 00DC 00DD 0719 0ADE 0276 02B6 00DE 00DE 00DF 00E0 00E1 00E2 00E3 0216 01ED 0603 02B8 0C00 06ED DS00531E-page 10 M 00322 M M M M M M M 00323 M M M M M M M 00324 00325 00326 00327 00328 00329 00330 00331 00332 00333 00334 00335 00336 00337 00338 00339 00340 00341 00342 00343 00344 00345 00346 00347 00348 00349 00350 00351 00352 00353 00354 00355 00356 00357 00358 00359 00360 00361 00362 00363 00364 00365 00366 00367 00368 00369 00370 00371 00372 00373 00374 00375 00376 00377 00378 00379 00380 00381 00382 00383 00384 00385 00386 00387 00388 00389 NOP GET_BIT BCF BSF BTFSC BSF RLF BCF NOP GET_BIT BCF BSF BTFSC BSF RLF BCF NOP BSF ; DELAY ; BIT SWR,CARRY PORTB,CK PORTB,BV SWR,CARRY POSA, F PORTB,CK SWR,CARRY PORTB,CK PORTB,BV SWR,CARRY POSA, F PORTB,CK PORTB,CSN ; ; ; ; ; ; ; SET CLOCK BIT HIGH LOOK AT DATA COMMING IN SET THE CARRY FOR A ROTATE THE W REG LEFT SET THE CLOCK LOW DELAY BIT ; ; ; ; ; ; ; SET CLOCK BIT HIGH LOOK AT DATA COMMING IN SET THE CARRY FOR A ROTATE THE W REG LEFT SET THE CLOCK LOW DELAY DESELECT THE CHIP ;****************** CALCULATING THE PID TERMS *********************** ;****CALCULATE THE ERROR******* ; The error is very simply the signed difference between where the ; system is and where it is supposed to be at a particular instant ; in time It is formed by subtracting the actual position from the ; requested position (Position requested - Position actual) This ; difference is then used to determine the proportional,integral and ; differential term contributions to the output C_ERR MOVF SUBWF BTFSC GOTO GOTO POSA,0 POSR,0 SWR,CARRY PLS_ER MNS_ER ; ; ; ; ; LOAD THE ACTUAL POSITION INTO W SUBTRACT IT FROM THE REQUESTED POSITION CHECK THE CARRY BIT TO DETERMINE THE SIGN ITS POSITIVE(POSR>POSA) ITS NEGATIVE (POSA>POSR) MOVWF BCF GOTO ERR1 FLAGS,ER_SGN CE_EXIT ; SAVE THE DIFFERENCE IN “ERROR” ; SET THE SIGN FLAG TO INDICATE POSITIVE MOVF SUBWF MOVWF BSF POSR,0 POSA,0 ERR1 FLAGS,ER_SGN ; ; ; ; CLRF CLRF SUMLO SUMHI ; CLEAN OLD VALUES OUT TO PREPARE ; FOR THIS CYCLES SUMMATION PLS_ER MNS_ER RE-DO THE SUBTRACTION ACTUAL - REQUESTED STORE THE DIFFERENCE IN “ERROR” SET THE SIGN FLAG FOR NEGATIVE CE_EXIT ;****CALCULATE THE PROPORTIONAL TERM****** ; The proportional term is the error times the proportional gain term ; This term simply gives you more output drive the farther away you are ; from where you want to be (error)*Kp ; The proportional gain term is a signed term between -100 and 100 The ; more proportional gain you have the lower your system following error ; will be The higher your proportional gain, the more integral and ; differential term gains you will have to add to make the system stable ; The sum is being carried as a 16 bit signed value C_PROP MOVF MOVWF MOVLW MOVWF CALL CALL RESTORE_SGN BTFSS GOTO COMF INCF ERR1,0 mulcnd KP mulplr mpy_S DIV_LMT ; ; ; ; ; LOAD THE ERROR TERM INTO W MULTIPLY IT BY THE PROPORTIONAL GAIN KP AND THEN SCALE IT DOWN BY DIVIDING IT DOWN BY 16 IF IT IS STILL OVER 255 THEN LIMIT IT TO 255 FLAGS,ER_SGN ADDPROP L_byte,1 L_byte,1 ; IF THE ERROR SIGN IS NEGATIVE THEN ; PUT THE SIGN INTO THE LOW BYTE L_byte,W SUMLO,1 SWR,CARRY SUMHI,1 SUMLO,7 ; ; ; ; ; ; ADDPROP MOVF ADDWF BTFSC INCF MOVLW BTFSC SAVE THE PROPORTIONAL PART IN THE SUM IF THE ADDITION CARRIED OUT THEN INCREMENT THE HIGH BYTE THEN SIGN EXTEND TO THE UPPER  1997 Microchip Technology Inc AN531 00E4 0CFF 00E5 01F8 00E6 00E6 00E7 00E8 00E9 00EA 00EB 00EB 00EC 00ED 00EE 00EE 00EF 00F0 00F0 00F1 00F2 00F2 00F3 00F4 00F5 00F6 00F7 00F8 00F9 00F9 00FA 00FB 00FC 00FD 00FE 00FF 00FF 0100 0101 0102 0103 0104 0105 0106 020C 0643 0AFF 0619 0AEE 0C02 01EE 0AF0 0C02 00AE 06EE 0AF9 0C9C 01CE 0703 0AFF 0C64 002E 0AFF 0C9C 008E 0603 0AFF 0C9C 002E 020E 01ED 0603 02B8 0C00 06EE 0240 01F8 0107 0107 0107 020C 0108 0719 0109 0B0D 00390 00391 00392 00393 00394 00395 00396 00397 00398 00399 00400 00401 00402 00403 00404 00405 00406 00407 00408 00409 00410 00411 00412 00413 00414 00415 00416 00417 00418 00419 00420 00421 00422 00423 00424 00425 00426 00427 00428 00429 00430 00431 00432 00433 00434 00435 00436 00437 00438 00439 00440 00441 00442 00443 00444 00445 00446 00447 00448 00449 00450 00451 00452 00453 00454 00455 00456 00457 00458 00459 00460 00461 00462 00463 00464 00465 00466 00467 00468 00469 00470 00471 00472 MOVLW ADDWF 0FF SUMHI,1 ; BYTE ;****CALCULATE THE INTEGRAL TERM****** ; The integral term is an accumulation of the error thus far Its purpose ; is to allow even a small error to effect a large change It does this ; by adding a small number into an accumulator each cycle through the program ; Thusly even a small error that exists for a while will build up to a large ; enough number to effect an output sufficient to move the system The effect ; that this integral accumulator has is modulated by the integral gain term KI ; The integral of the error over time is multiplied by KI and the result is its ; contribution to the final summation for determining the output value This ; term helps to insure the long-term accuracy of the system is good A certain ; amount is necessary for this purpose but too much will cause oscillations ; The integral is bounded in magnitude for two purposes The first is so that ; it never rolls over and changes sign The second is that it may saturate on ; long moves forcing an excessively large overshoot to “de-integrate” the error ; accumulated during the first of the moves C_INT MOVF BTFSC GOTO BTFSC GOTO ERR1,W SWR,Z ADDINT FLAGS,ER_SGN MNS_1 ; ; ; ; ; MOVE THE ERROR INTO THE W REG AND CHECK TO SEE IF IT IS ZERO IF SO THEN DONT CHANGE THE ACCUMULATOR TEST THE FLAGS TO FIND THE POLARITY OF THE ERROR POSITIVE NEGATIVE MOVLW ADDWF GOTO KI ACCUM,1 LMTACM ; IF POSITIVE ADD ONE TO ; THE ERROR ACCUMULATOR ; THEN LIMIT IT TO +/-100 MOVLW SUBWF KI ACCUM,1 ; IF NEGATIVE THEN SUBTRACT ONE ; FROM THE ERROR ACCUMULATOR BTFSC GOTO ACCUM,7 M_LMT ; CHECK THE SIGN BIT OF THE ERROR ACCUMULATOR ; AND DO A POSITIVE OR NEGATIVE LIMIT MOVLW ADDWF BTFSS GOTO MOVLW MOVWF GOTO 9CH ACCUM,0 SWR,CARRY ADDINT 64H ACCUM ADDINT ; ; ; ; ; ; FOR THE POSITIVE LIMIT ADD 156 TO THE NUMBER AND SEE IF YOU GENERATE A CARRY BY CHECKING THE CARRY FLAG IF NOT THEN ITS O.K IF SO THEN FORCE THE ACCUMULATOR TO 100 DECIMAL MOVLW SUBWF BTFSC GOTO MOVLW MOVWF 9CH ACCUM,0 SWR,CARRY ADDINT 9CH ACCUM ; ; ; ; ; ; FOR THE NEGATIVE LIMIT SUBTRACT 156 FROM THE NUMBER AND SEE IF YOU GENERATE A NON-CARRY CONDITION INDICATING A ROLL-OVER IF NOT THEN LEAVE THE ACCUMULATOR ALONE IF SO THEN LIMIT IT TO -100 BY FORCING THAT VALUE IN THE ACCUMULATOR MOVF ADDWF BTFSC INCF MOVLW BTFSC COMF ADDWF ACCUM,W SUMLO,1 SWR,CARRY SUMHI,1 ACCUM,7 W,W SUMHI,1 ; ; ; ; ; ; ; ; ADD THE INTEGRAL ACCUMULATOR TO THE LOW BYTE OF THE SUM TEST FOR OVERFLOW, IF SO THEN INCREMENT THE HI BYTE LOAD INTO THE W REGISTER IF THE INTEGRAL ACCUMULATOR WAS NEGATIVE COMPLEMENT THE TO GET SIGN FOR HIGH BYTE ADD INTO THE HIGH BYTE OF THE SUM PLS_1 MNS_1 LMTACM P_LMT M_LMT ADDINT U_DEXIT ; EXIT POINT FOR THE UP/DOWN CONTROL OF ACCUM ;****CALCULATING THE DIFFERENTIAL TERM************************** ; The differential term examines the error and determines how much ; it has changed since the last cycle It does this by subtracting the ; old error from the new error Since the cycle time is relatively fixed ; we can use it as the “dt” of the desired “de/dt” This derivative of the ; error is then multiplied by the differential gain term KD and becomes the ; differential term contribution for the final summation ; First, create the “de” term by doing a signed subtaction of new error ; minus the old error (new_error - old_error) C_DIFF  1997 Microchip Technology Inc MOVF BTFSS GOTO ERR1,W FLAGS,ER_SGN LO_BYTE ; LOAD THE NEW ERROR INTO REGISTER DS00531E-page 11 AN531 010A 010B 010C 010D 010D 010E 010F 0110 0111 0112 0113 0114 0115 0116 0117 0117 0118 0119 011A 011B 011C 011D 011D 011E 011F 0120 0120 0121 0122 0123 0124 0125 0125 0126 0127 0128 0128 0129 012A 012B 012C 012D 012E 012E 012F 0130 0131 0132 0132 0133 0134 0135 026C 028C 026C 0034 0C00 0619 0CFF 0036 020F 0799 0B17 026F 028F 0033 0C00 0699 0CFF 0035 090F 06F6 0B20 0B25 0559 0274 0294 002F 0B28 0459 0214 002F 020F 0033 0C20 0034 0901 091D 0759 0B32 0276 02B6 0216 0643 0B45 002F 0136 0136 0137 0138 0139 013A 013B 013C 013D 013E 013F 0140 0141 0142 0143 0144 0C00 0659 0CFF 0036 020F 0034 020D 0033 0218 0035 0910 0214 002D 0216 0038 0145 0145 0146 0147 0148 0149 020C 002F 0499 0619 0599 DS00531E-page 12 00473 00474 00475 00476 00477 00478 00479 00480 00481 00482 00483 00484 00485 00486 00487 00488 00489 00490 00491 00492 00493 00494 00495 00496 00497 00498 00499 00500 00501 00502 00503 00504 00505 00506 00507 00508 00509 00510 00511 00512 00513 00514 00515 00516 00517 00518 00519 00520 00521 00522 00523 00524 00525 00526 00527 00528 00529 00530 00531 00532 00533 00534 00535 00536 00537 00538 00539 00540 00541 00542 00543 00544 00545 00546 00547 00548 00549 00550 00551 00552 00553 00554 00555 COMF INCF COMF ERR1,1 ERR1,W ERR1,1 ; CORRECT THE VALUE TO BE 16 BIT MOVWF MOVLW BTFSC MOVLW MOVWF MOVF BTFSS GOTO COMF INCF ACCbLO 00 FLAGS,ER_SGN 0FF ACCbHI ERR_O,W FLAGS,OER_SGN LO_BYTEO ERR_O,1 ERR_O,W ; FOR SUBTRACTION ACCaLO 00 FLAGS,OER_SGN 0FF ACCaHI D_sub ; FOR SUBTRACTION ACCbHI,7 NEG_ABS POS_ABS ; TEST THE SIGN OF THE RESULT FLAGS,DE_SGN ACCbLO,1 ACCbLO,W ERR_O MULT_KD ; ITS NEGATIVE SO SET THE FLAG AND ; COMPLEMENT THE VALUE FLAGS,DE_SGN ACCbLO,W ERR_O ; ITS POSITIVE SO SET RESET THE FLAG ; AND SAVE THE VALUE ; RESTORE IT FOR FUTURE USE TO BIT MAGNITUDE LO_BYTE ; SIGN EXTEND THE UPPER BYTE ; LOAD THE OLD ERROR INTO OTHER REGISTER ; CORRECT THE VALUE TO BE 16 BIT LO_BYTEO MOVWF MOVLW BTFSC MOVLW MOVWF CALL STRIP_SGN BTFSC GOTO GOTO NEG_ABS BSF COMF INCF MOVWF GOTO POS_ABS BCF MOVF MOVWF ; SIGN EXTEND THE UPPER BYTE ; PERFORM THE SUBTRACTION ; Then multiply by Kd MULT_KD MOVF MOVWF MOVLW MOVWF CALL CALL ERR_O,W mulcnd KD mulplr mpy_S DIV_LMT ; ; ; ; ; MOVE THE DE/DT TERM INTO THE MULCND REG MOVE THE DIFFERENTIAL GAIN TERM INTO MULPLR TO MULTIPLY THE DE/DT DO THE MULTIPLICATION SCALE AND LIMIT TO 100 RE_SGN BTFSS GOTO COMF INCF SAVE_DIFF MOVF BTFSC GOTO MOVWF FLAGS,DE_SGN SAVE_DIFF L_byte,1 L_byte,1 ; IF THE DE SIGN IS NEGATIVE THEN ; PUT THE SIGN INTO THE LOW BYTE L_byte,W SWR,Z ROLL_ER ERR_O ; ADD THE DIFF TERM INTO THE SUMM *************** ADDDIF MOVLW BTFSC MOVLW MOVWF MOVF MOVWF MOVF MOVWF MOVF MOVWF CALL MOVF MOVWF MOVF MOVWF 00 FLAGS,DE_SGN 0FF ACCbHI ERR_O,W ACCbLO SUMLO,W ACCaLO SUMHI,W ACCaHI D_add ACCbLO,W SUMLO ACCbHI,W SUMHI MOVF MOVWF BCF BTFSC BSF ERR1,W ERR_O FLAGS,OER_SGN FLAGS,ER_SGN FLAGS,OER_SGN ; PUT THE KD*(DE/DT) TERM INTO THE ; REGISTERS TO ADD AND ; SIGN EXTEND THE UPPER BYTE ; LOAD THE CURRENT SUM INTO THE ; REGISTERS TO ADD ; ADD IN THE DIFFERENTIAL TERM ; SAVE THE RESULTS BACK ; INTO SUMLO AND HI ROLL_ER ; ; ; ; ; TAKE THE CURRENT ERROR AND PUT IT IN THE ERROR HISTORY SAVE THE CURRENT ERROR SIGN IN THE OLD ERROR SIGN FOR NEXT TIME THROUGH  1997 Microchip Technology Inc AN531 014A 014A 0479 014B 06F8 014C 0579 014D 014D 014E 014F 0150 0151 0152 0152 0153 0154 0155 0156 0157 0158 0159 0159 015A 015B 015C 015D 015E 07F8 0B52 0278 026D 02AD 0C01 0098 0703 0B59 0C64 002D 0B5F 0C64 008D 0703 0B5F 0C64 002D 015F 015F 020D 0160 0029 0161 0161 0679 0162 0B76 0163 0B64 0164 0164 0165 0166 0167 0426 0C64 0032 0943 0168 0168 0169 016A 016B 016C 0207 002A 0208 002B 0004 016D 016D 0506 016E 02EA 016F 0B6D 0170 00556 00557 00558 00559 00560 00561 00562 00563 00564 00565 00566 00567 00568 00569 00570 00571 00572 00573 00574 00575 00576 00577 00578 00579 00580 00581 00582 00583 00584 00585 00586 00587 00588 00589 00590 00591 00592 00593 00594 00595 00596 00597 00598 00599 00600 00601 00602 00603 00604 00605 00606 00607 00608 00609 00610 00611 00612 00613 00614 00615 00616 00617 00618 00619 00620 00621 00622 00623 00624 00625 00626 00627 00628 00629 00630 00631 00632 00633 00634 00635 00636 00637 00638 ;****SET UP THE DIRECTION FOR THE BRIDGE********************* ; ; After the sum of all the components has been made, the sign of the ; sum will determine which way the bridge should be powered ; If the sum is negative the bridge needs to be set to drive ccw; if the ; sum is Positive then the bridge needs to be set to drive cw This ; is purely a convention and depends upon the polarity the motor and feedback ; element are hooked up in SET_DIR BCF BTFSC BSF FLAGS,DIR SUMHI,7 FLAGS,DIR ; SET FOR DEFAULT CLOCKWISE ; LOOK AT THE SIGN BIT, IF IT IS SET ; THEN SET FOR CCW BRIDGE DRIVE ;**** SCALE THE NUMBER TO BETWEEN AND 100% ********************** ; After the direction is set the request for duty cycle is limited to between ; and 100 percent inclusive This value is passed to the dutycycle setting ; routine by loading it in the variable “PCNT” L_SUMM BTFSS GOTO COMF COMF INCF SUMHI,7 POS_LM SUMHI,1 SUMLO,1 SUMLO,1 ; CHECK TO SEE IF IT IS NEGATIVE MOVLW SUBWF BTFSS GOTO MOVLW MOVWF GOTO 1H SUMHI,0 SWR,CARRY LB_L 64H SUMLO LP_EXIT ; ; ; ; ; ; ; MOVLW SUBWF BTFSS GOTO MOVLW MOVWF 64H SUMLO,0 SWR,CARRY LP_EXIT 64H SUMLO ; LIMIT THE MAGNITUDE OF THE VALUE TO ; 100 DECIMAL MOVF MOVWF SUMLO,W PCNT ; STORE THE LIMITED VALUE IN ; THE PERCENT DUTYCYCLE REQUEST POS_LM SUBTRACT FROM THE HIGH BYTE TO SEE IF THERE IS ANYTHING THERE, IF NOT, THEN LEAVE THE LOW BYTE ALONE OTHERWISE GIVE THE LOW BYTE A FULL COUNT AND IT WILL HAVE BEEN LIMITED TO 100 GOTO LIMIT PERCENT EXIT LB_L LP_EXIT ;********************************************************** ; PWM GENERATING ROUTINE ; ; The important thing here is not to have to too many decisions or ; calculations while you are generating the 100 or so pulses These will ; take time and limit the minimum or maximum duty cycle WHICH_DIR BTFSC GOTO GOTO FLAGS,DIR GOCCW GOCW ; CHECK THE DIRECTION FLAG ; DO CCW PULSES FOR ; DO CW PULSES FOR BCF MOVLW MOVWF CALL PORTB,PWMCCW 64H CYCLES CALCTIMES ; SET THE BRIDGE FOR CW MOVE ; ; SET UP CYCLES COUNTER FOR 100 PULSES ; CALCULATE THE HI AND LO TIMES MOVF MOVWF MOVF MOVWF CLRWDT HI,0 HI_T LO,0 LO_T ; ; ; ; ; BSF DECFSZ GOTO PORTB,PWMCW HI_T,1 CWHI ; SET THE CLOCKWISE PWMBIT HIGH ; DECREMENT THE HI USEC COUNTER ; DO ANOTHER LOOP GOCW RLDCW RELOAD THE HI TIMER WITH THE CALCULATED TIME RELOAD THE LO TIMER WITH THE CALCULATED TIME TAG THE WATCHDOG TIMER CWHI CWLO  1997 Microchip Technology Inc DS00531E-page 13 AN531 0170 0171 0172 0173 0174 0175 0176 0176 0177 0178 0179 017A 017A 017B 017C 017D 017E 017F 017F 0180 0181 0182 0182 0183 0184 0185 0186 0187 0406 02EB 0B70 02F2 0B68 0A50 00639 00640 00641 00642 00643 00644 00645 00646 00647 00648 00649 00650 00651 00652 00653 00654 00655 00656 00657 00658 00659 00660 00661 00662 00663 00664 00665 00666 00667 00668 00669 00670 00671 00672 00673 00674 00675 00676 00677 00678 00679 00680 00681 00682 00683 00684 00685 00686 00687 00688 00689 00690 00691 00692 00693 00694 00695 00696 00697 0406 0C64 0032 0943 0207 002A 0208 002B 0004 0526 02EA 0B7F 0426 02EB 0B82 02F2 0B7A 0A50 0188 0188 0189 018A 018B 018C 018D 018E 018F 0190 0190 0191 0192 0193 0C0B 0005 0C1C 0006 0040 0002 0C08 0024 0060 03E4 0B90 0A50 01FF 01FF 0B88 : : : : : : : : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX PORTB,PWMCW LO_T,1 CWLO CYCLES,1 RLDCW BEGIN ; ; ; ; ; ; SET THE CLOCKWISE PWM BIT LOW DECREMENT THE LO USEC COUNTER DO ANOTHER LOOP DECREMENT THE NUMBER OF CYCLES LEFT DO ANOTHER PULSE DO ANOTHER MAIN SYSTEM CYCLE BCF MOVLW MOVWF CALL PORTB,PWMCW 64H CYCLES CALCTIMES ; SET THE BRIDGE FOR CCW MOVE ; ; SET UP CYCLE COUNTER FOR 100 PULSES ; CALCULATE THE HI AND LO TIMES MOVF MOVWF MOVF MOVWF CLRWDT HI,0 HI_T LO,0 LO_T ; ; ; ; ; BSF DECFSZ GOTO PORTB,PWMCCW HI_T,1 CCWHI ; SET THE COUNTERCLOCKWISE PWM BIT HIGH ; DECREMENT THE HI USEC COUNTER ; DO ANOTHER LOOP BCF DECFSZ GOTO DECFSZ GOTO GOTO PORTB,PWMCCW LO_T,1 CCWLO CYCLES,1 RLDCCW BEGIN ; ; ; ; ; ; GOCCW RLDCCW RE LOAD THE HI TIMER WITH THE CALCULATED TIME RE LOAD THE LO TIMER WITH THE CALCULATED TIME TAG THE WATCHDOG CCWHI CCWLO SET THE COUNTERCLOCKWISE PWM BIT LOW DECREMENT THE LO USEC COUNTER DO ANOTHER LOOP DECREMENT THE NUMBER OF CYCLES LEFT DO ANOTHER PULSE DO ANOTHER MAIN SYSTEM CYCLE ;************* START VECTOR ******************** CLRREG ;INITIALIZE REGISTERS MOVLW TRIS MOVLW TRIS CLRW OPTION MOVLW MOVWF 0BH PORTA 1CH PORTB 08H FSR ; ; ; ; ; ; ; ; SET PORT A FOR INPUTS AND AN OUTPUT SET PORT B FOR INPUTS AND OUTPUTS THIS SETTING FOR SENDING TO A/D CLEAR THE W REGISTER STORE THE W REG IN THE OPTION REG STARTING REGISTER TO ZERO CLRF INCFSZ GOTO GOTO 00 FSR, F GCLR BEGIN ; ; SKIP AFTER ALL REGISTERS ; HAVE BEEN INITIALIZED ; START AT THE BEGINING OF THE PROGRAM ORG GOTO 01FF CLRREG ; ; START VECTOR GCLR END MEMORY USAGE MAP (‘X’ = Used, 0000 0040 0080 00C0 0100 0140 0180 01C0 BCF DECFSZ GOTO DECFSZ GOTO GOTO ‘-’ = Unused) XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXX - XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX - XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX X All other memory blocks unused Program Memory Words Used: Program Memory Words Free: Errors : Warnings : Messages : 0 reported, reported, DS00531E-page 14 405 619 suppressed suppressed  1997 Microchip Technology Inc Note the following details of the code protection feature on PICmicro® MCUs • • • • • • The PICmicro family meets the specifications contained in the Microchip Data Sheet Microchip believes that its family of PICmicro microcontrollers is one of the most secure products of its kind on the market today, when used in the intended manner and under normal conditions There are dishonest and possibly illegal methods used to breach the code protection feature All of these methods, to our knowledge, require using the PICmicro microcontroller in a manner outside the operating specifications contained in the data sheet The person doing so may be engaged in theft of intellectual property Microchip is willing to work with the customer who is concerned about the integrity of their code Neither Microchip nor any other semiconductor manufacturer can guarantee the security of their code Code protection does not mean that we are guaranteeing the product as “unbreakable” Code protection is constantly evolving We at Microchip are committed to continuously improving the code protection features of our product If you have any further questions about this matter, please contact the local sales office nearest to you Information contained in this publication regarding device applications and the like is intended through suggestion only and may be superseded by updates It is your responsibility to ensure that your application meets with your specifications No representation or warranty is given and no liability is assumed by Microchip Technology Incorporated with respect to the accuracy or use of such information, or infringement of patents or other intellectual property rights arising from such use or otherwise Use of Microchip’s products as critical components in life support systems is not authorized except with express written approval by Microchip No licenses are conveyed, implicitly or otherwise, under any intellectual property rights Trademarks The Microchip name and logo, the Microchip logo, FilterLab, KEELOQ, microID, MPLAB, PIC, PICmicro, PICMASTER, PICSTART, PRO MATE, SEEVAL and The Embedded Control Solutions Company are registered trademarks of Microchip Technology Incorporated in the U.S.A and other countries dsPIC, ECONOMONITOR, FanSense, FlexROM, fuzzyLAB, In-Circuit Serial Programming, ICSP, ICEPIC, microPort, Migratable Memory, MPASM, MPLIB, MPLINK, MPSIM, MXDEV, PICC, PICDEM, PICDEM.net, rfPIC, Select Mode and Total Endurance are trademarks of Microchip Technology Incorporated in the U.S.A Serialized Quick Turn Programming (SQTP) is a service mark of Microchip Technology Incorporated in the U.S.A All other trademarks mentioned herein are property of their respective companies © 2002, Microchip Technology Incorporated, Printed in the U.S.A., All Rights Reserved Printed on recycled paper Microchip received QS-9000 quality system certification for its worldwide headquarters, design and wafer fabrication facilities in Chandler and Tempe, Arizona in July 1999 The Company’s quality system processes and procedures are QS-9000 compliant for its PICmicro® 8-bit MCUs, KEELOQ® code hopping devices, Serial EEPROMs and microperipheral products In addition, Microchip’s quality system for the design and manufacture of development systems is ISO 9001 certified  2002 Microchip Technology Inc M WORLDWIDE SALES AND SERVICE AMERICAS ASIA/PACIFIC Japan Corporate Office Australia 2355 West Chandler Blvd Chandler, AZ 85224-6199 Tel: 480-792-7200 Fax: 480-792-7277 Technical Support: 480-792-7627 Web Address: http://www.microchip.com Microchip Technology Australia Pty Ltd Suite 22, 41 Rawson Street Epping 2121, NSW Australia Tel: 61-2-9868-6733 Fax: 61-2-9868-6755 Microchip Technology Japan K.K Benex S-1 6F 3-18-20, Shinyokohama Kohoku-Ku, Yokohama-shi Kanagawa, 222-0033, Japan Tel: 81-45-471- 6166 Fax: 81-45-471-6122 Rocky Mountain China - Beijing 2355 West Chandler Blvd Chandler, AZ 85224-6199 Tel: 480-792-7966 Fax: 480-792-7456 Microchip Technology Consulting (Shanghai) Co., Ltd., Beijing Liaison Office Unit 915 Bei Hai Wan Tai Bldg No Chaoyangmen Beidajie Beijing, 100027, No China Tel: 86-10-85282100 Fax: 86-10-85282104 Atlanta 500 Sugar Mill Road, Suite 200B Atlanta, GA 30350 Tel: 770-640-0034 Fax: 770-640-0307 Boston Lan Drive, Suite 120 Westford, MA 01886 Tel: 978-692-3848 Fax: 978-692-3821 Chicago 333 Pierce Road, Suite 180 Itasca, IL 60143 Tel: 630-285-0071 Fax: 630-285-0075 Dallas 4570 Westgrove Drive, Suite 160 Addison, TX 75001 Tel: 972-818-7423 Fax: 972-818-2924 Detroit Tri-Atria Office Building 32255 Northwestern Highway, Suite 190 Farmington Hills, MI 48334 Tel: 248-538-2250 Fax: 248-538-2260 Kokomo 2767 S Albright Road Kokomo, Indiana 46902 Tel: 765-864-8360 Fax: 765-864-8387 Los Angeles 18201 Von Karman, Suite 1090 Irvine, CA 92612 Tel: 949-263-1888 Fax: 949-263-1338 China - Chengdu Microchip Technology Consulting (Shanghai) Co., Ltd., Chengdu Liaison Office Rm 2401, 24th Floor, Ming Xing Financial Tower No 88 TIDU Street Chengdu 610016, China Tel: 86-28-6766200 Fax: 86-28-6766599 China - Fuzhou Microchip Technology Consulting (Shanghai) Co., Ltd., Fuzhou Liaison Office Unit 28F, World Trade Plaza No 71 Wusi Road Fuzhou 350001, China Tel: 86-591-7503506 Fax: 86-591-7503521 China - Shanghai Microchip Technology Consulting (Shanghai) Co., Ltd Room 701, Bldg B Far East International Plaza No 317 Xian Xia Road Shanghai, 200051 Tel: 86-21-6275-5700 Fax: 86-21-6275-5060 China - Shenzhen 150 Motor Parkway, Suite 202 Hauppauge, NY 11788 Tel: 631-273-5305 Fax: 631-273-5335 Microchip Technology Consulting (Shanghai) Co., Ltd., Shenzhen Liaison Office Rm 1315, 13/F, Shenzhen Kerry Centre, Renminnan Lu Shenzhen 518001, China Tel: 86-755-2350361 Fax: 86-755-2366086 San Jose Hong Kong Microchip Technology Inc 2107 North First Street, Suite 590 San Jose, CA 95131 Tel: 408-436-7950 Fax: 408-436-7955 Microchip Technology Hongkong Ltd Unit 901-6, Tower 2, Metroplaza 223 Hing Fong Road Kwai Fong, N.T., Hong Kong Tel: 852-2401-1200 Fax: 852-2401-3431 New York Toronto 6285 Northam Drive, Suite 108 Mississauga, Ontario L4V 1X5, Canada Tel: 905-673-0699 Fax: 905-673-6509 India Microchip Technology Inc India Liaison Office Divyasree Chambers Floor, Wing A (A3/A4) No 11, O’Shaugnessey Road Bangalore, 560 025, India Tel: 91-80-2290061 Fax: 91-80-2290062 Korea Microchip Technology Korea 168-1, Youngbo Bldg Floor Samsung-Dong, Kangnam-Ku Seoul, Korea 135-882 Tel: 82-2-554-7200 Fax: 82-2-558-5934 Singapore Microchip Technology Singapore Pte Ltd 200 Middle Road #07-02 Prime Centre Singapore, 188980 Tel: 65-6334-8870 Fax: 65-6334-8850 Taiwan Microchip Technology Taiwan 11F-3, No 207 Tung Hua North Road Taipei, 105, Taiwan Tel: 886-2-2717-7175 Fax: 886-2-2545-0139 EUROPE Denmark Microchip Technology Nordic ApS Regus Business Centre Lautrup hoj 1-3 Ballerup DK-2750 Denmark Tel: 45 4420 9895 Fax: 45 4420 9910 France Microchip Technology SARL Parc d’Activite du Moulin de Massy 43 Rue du Saule Trapu Batiment A - ler Etage 91300 Massy, France Tel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79 Germany Microchip Technology GmbH Gustav-Heinemann Ring 125 D-81739 Munich, Germany Tel: 49-89-627-144 Fax: 49-89-627-144-44 Italy Microchip Technology SRL Centro Direzionale Colleoni Palazzo Taurus V Le Colleoni 20041 Agrate Brianza Milan, Italy Tel: 39-039-65791-1 Fax: 39-039-6899883 United Kingdom Arizona Microchip Technology Ltd 505 Eskdale Road Winnersh Triangle Wokingham Berkshire, England RG41 5TU Tel: 44 118 921 5869 Fax: 44-118 921-5820 03/01/02  2002 Microchip Technology Inc ... CLOCK LINE FOR THE A/D MICROWIRE DATA OUT FROM POSITIONER MICROWIRE DATA IN TO POSITIONER MICROWIRE CHIP SELECT TO POSITIONER MICROWIRE CLOCK IN TO POSITIONER ;***** MACROS **********************************************... requests to the positioner ; servo makes its desire known by setting the chip select to the positioner ; low It then monitors the busy (Data Out) line from the positioner When ; the positioner sets... 00058 00059 00060 00061 00062 00063 00064 00065 00066 00067 00068 00069 00070 TITLE “ MicroWire Positioner “ ; ; ; mw8pos.asm LIST P=16C56 ; ;***************************************************************

Ngày đăng: 11/01/2016, 11:48

TỪ KHÓA LIÊN QUAN