; commande de train rentrant pour le P 51 D version 3 bis ; Alex Kuhn le 6/10/2010 ; révision du 6/10/2010 : rajout d'un OFFSET différent pour chaque fin de course au lieu ; d'un OFFSET unique pour chaque fin de course du servo cmd de roulette de queue ; révision du 30/09/2010 : rajout fonction recul sur fin de mvt rentrée roulette de queue ; révision du 24 / 08 / 2009 : rajout init STR=1 ; révision du 02/ 09 / 2009 : inversion E long / E court et ; rajout flag pour détection pression NOK non resetable autrement ; que par remise sous tension ; réduction du délai à la mise sous tension list p=12f508 #include ;****************************************************** ; variables Duree_E equ 0x07 Duree_S equ 0x08 Duree_S_temp equ 0x09 SL equ 0x0A SC equ 0x0B OFFSET equ 0x0C Ecourt equ 0x0D Flag equ 0x0E Flag2 equ 0x0F RECUL equ 0x10 OFFSET1 equ 0x11 ;****************************************************** ;Le circuit réalise les fonctions suivantes: ; a) mesure de la durée des impulsions E en provenance du recepteur ; b) génération d'impulsions idem à E sur la sortie STR ( servo de cmd ; de la valve pneumatique du train rentrant principal ) ; c) génération d'impulsions sur la sortie S ( servo de cmd de la roulette ; de queue )avec ralentisseur de mouvement ; d) extension à 180° de la course du servo S de cmd de la roulette de queue ; e) surveillance de l'entrée P ( capteur de pression ). Lorsque la ; pression tombe sous un seuil , le circuit déclenche automatiquement la ; sortie du train ( train principal et roulette de queue ) = fail safe ; Ceci permet , en cas de fuite par exemple , de sortir le train tant qu'il ; reste assez de pression .Une nouvelle mise sous tension est nécessaire pour retrouver ; un fonctionnement normal après un tel déclenchement . ; f) surveillance de la position de l'inter cmd train de l'émetteur lors ; de la mise sous tension du recepteur : pas d'impulsions sur S ou STR tant que ; l'inter n'est pas en position " train sorti " ( càd Duree_E inf à 1.5 ms ). C'est ; pour éviter une rentrée du train intempestive à la mise sous tension ; ; ; entrée P capteur de pression sur GP0 ( GP0=0 si pression OK ; GP0=1 si NOK ) ; entrée E impulsion en provenance du recepteur sur GP1 ; sortie S impulsion à appliquer sur le servo roulette de queue sur GP4 ; sortie STR impulsion à appliquer sur le servo de cmd valve pneumatique sur GP5 ; la sortie S "recopie" l'entre E avec une vitesse définie . Si,par exemple ; E passe de 0.8 ms à 2.2 ms brusquement ( = basculement de l'inter de l'émetteur), ; S va passer de 0.8 ms à 2.2 ms progressivement en environ 3s ; Le servo se déplace donc lentement pour un mouvement réaliste de rentrée et ; de sortie de la roulette de queue. ; Pour obtenir une course totale du servo de roulette de queue de 180° , ; un Offset est ajouté ou retranché à S ; pour éviter que le servo de roulette de queue ne grogne en position roulette rentrée, ; un léger mvt de recul est appliqué au servo roulette de queue à la fin de la course de ; rentrée de la roulette ; l'amplitude de ce mvt de recul est fixé par la variable RECUL ; ; lorsque Duree_E est sup à 1.5 ms , alors appliquer S = E + Offset1 ; lorsque Duree_E est inf à 1.5 ms , alors appliquer S = E - Offset ; l' Offset est fixé à 0.3 ms ( coté roulette de queue en position sortie ) ; l'Offset1 est fixé à 0.5 ms ( coté roulette de queue en position rentrée ) ; ; Le montage des servos dans le P51 D est tel que les impulsions E courtes ( inf à 1.5 ms ) ; correspondent au train sorti . ; Les impulsions E longues ( sup à 1.5 ms ) correspondent au train rentré ; ; ; Les fonctions habituelles d'une radio programmable ( course , sub-trim , etc... ) ; sont utilisables . ; ; ; ;******************************************************* org 0x000 ; Reset Vector movlw B'11010010' option movlw B'00001111' tris GPIO ; movlw B'00011110' movwf OFFSET ;initialiser Offset = 0.3 ms movlw B'00110010' movwf OFFSET1 ; initialiser Offset1 = 0.5 ms movlw B'00001010' movwf RECUL ; initialiser RECUL = 0.1 ms bsf GPIO,4 ; initialier S=1 bsf GPIO,5 ; initialiser STR=1 clrf Duree_E ; mettre Duree_E à zéro clrf Duree_S ; mettre Duree_S à zéro clrf Flag ; mettre Flag à zéro clrf Flag2 ; mettre Flag2 à zéro movlw B'00000101' movwf Duree_S_temp Delai ;attendre que la sortie du recepteur soit stable decfsz Duree_E,1 goto Delai decfsz Duree_S,1 goto Delai decfsz Duree_S_temp,1 goto Delai ; délai total d' environ 2 s LabA1 clrf Duree_E ; mettre Duree_E à zéro LabA btfsc GPIO,1 ;attendre que E passe à 0 goto LabA LabB btfss GPIO,1 ;attendre que E passe à 1 goto LabB ;************************************************************* ; mesurer la largeur de E LabC btfss GPIO,1 ; tant que E=1 , incrémenter Duree_E goto LabD incf Duree_E,1 nop nop nop nop nop ; ajuster la durée totale de la boucle à 10 us goto LabC ;************************************************************** ; vérifier que la largeur de E est inf à 1.5 ms ( position train sorti ; de l'inter de l'émetteur ) LabD movlw B'10010110' ; mettre 1.5 ms dans W ( durée neutre ) subwf Duree_E,0 ; soustraire 1.5 ms de Duree_E , résultat dans W btfss STATUS,0 ; tester la retenue C goto LabE ; si C=0 goto LabA1 ; C=1 , donc Duree_E est plus grand que 1.5 ms ; attendre que l'inter de l'émetteur soit ; sur position train sorti LabE movf OFFSET,0 ; C=0 , donc Duree_E est inf à 1.5 ms subwf Duree_E,0 ; soustraire OFFSET movwf Duree_S ; Duree_S contient Duree_E - OFFSET movf Duree_E,0 movwf Ecourt ; initialiser Ecourt avec Duree_E . En cas de chute ; de pression le contenu de Ecourt sera substitué à Duree_E ;*************************************************************** ; mettre S=1 pendant la Duree_S boucle bsf GPIO,4 ; mettre S=1 pendant Duree_S movf Duree_S,0 movwf Duree_S_temp ; initialiser Duree_S_temp avec Duree_S LabJ decfsz Duree_S_temp,1 goto LabH goto LabI LabH nop nop nop nop nop ; ajuster la durée de la boucle à 10 us goto LabJ LabI bcf GPIO,4 ; remettre S=0 ;***************************************************************** ; mettre STR = 1 pendant Duree_E bsf GPIO,5 movf Duree_E,0 ; mettre Duree_E dans W movwf Duree_S_temp ; initialiser Duree_S_temp avec Duree_E LabJ2 decfsz Duree_S_temp,1 goto LabJ1 goto LabJ3 LabJ1 nop nop nop nop nop goto LabJ2 LabJ3 bcf GPIO,5 ; remettre STR = 0 ; **************************************************************** ;***************************************************************** ; mesurer la largeur de E LabK btfss GPIO,1 ; attendre que E passe à 1 goto LabK clrf Duree_E ; mettre Duree_E = 0 LabL btfss GPIO,1 ; tant que E=1 , incrémenter Duree_E goto LabM incf Duree_E,1 nop nop nop nop nop ; ajuster la durée de la boucle à 10 us goto LabL ;en sortie de boucle, Duree_E contient la largeur de E ;******************************************************************* ;tester l'entrée pression GP0 LabM btfsc Flag,0 ; tester Flag goto LabM2 ; Flag= 1 , ne plus retester la pression btfss GPIO,0 ; Flag= 0 , tester pression goto LabM1 ; pression OK , faire normalement LabM2 movf Ecourt,0 ; pression NOK , forcer Duree_E avec Ecourt movwf Duree_E ; Duree_E = Ecourt va faire sortir le train ( fail safe) bsf Flag,0 ; armer le Flag à la première détection de pression NOK ;******************************************************************* ; en fonction de la largeur de E , augmenter ou réduire Duree_S LabM1 movlw B'10010110' ; mettre 1.5 ms dans W subwf Duree_E,0 ; soustraire 1.5 ms de Duree_E , résultat dans W btfss STATUS,0 ; tester la retenue C goto LabN ; si C=0 ;******************************************************************* ; augmenter progressivement Duree_S jusqu'à SL LabP movf Duree_E,0 ; mettre Duree_E dans W addwf OFFSET1,0 ; ajouter OFFSET1 movwf SL ; mettre résultat dans SL btfsc Flag2,0 ; tester Flag2 goto LabY movf Duree_S,0 ;mettre Duree_S dans W subwf SL,0 ; soustraire Duree_S de SL résultat dans W btfss STATUS,0 ; tester la retenue C goto LabX ; C=1 SL sup à Duree_S incf Duree_S,1 ; C=0 SL inf à Duree_S goto boucle LabX bsf Flag2,0 ; armer le flag pour indiquer que la fin de course est atteinte LabY movf RECUL,0 ; mettre RECUL dans W subwf SL,0 ; soustraire RECUL de SL , résultat dans W movwf Duree_S ; initialiser Duree_S avec SL - RECUL goto boucle ;******************************************************************* ;réduire progressivement Duree_S jusqu'à SC LabN clrf Flag2 ; remettre Flag2 à zéro movf OFFSET,0 ; mettre OFFSET dans W subwf Duree_E,0 ; soustraire OFFSET de Duree_E movwf SC ; mettre résultat dans SC movf Duree_S,0 ; mettre Duree_S dans W subwf SC,0 ; soustraire SC de Duree_S btfsc STATUS,0 ; tester la retenue C goto boucle decf Duree_S,1 goto boucle END ; directive fin de prg