Ik ben bezig met picbasic te leren. Nu heb ik het voor mekaar om een servo signaal in te lezen en op lcd te zetten en door te zetten naar een uitgang.
Echter wil ik nu een failsave inbouwen.
Maar kennelijk doe ik wat fout?
Ik krijg 2 verschillende effecten:
Met onderstaande code werkt niets en staat de servo stil
While 1=1
If Servo1 < 10 Then
Servo PORTA.0, 1500
Else
Servo1 = PulsIn PORTB.0 , 1
Print At 1,1,Dec Servo1," "
Servo PORTA.0, Servo1 * 10
DelayMS 20
EndIf
Wend
End
Met deze code werkt alles goed behalve de failsave. De servo blijft in failsave mode weglopen naar links. Waarom is mij een raadsel.
Device 16F648A ;16F648A PIC
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
TRISA = %00000000
TRISB = %00000001 ; ontvanger op poort B.0
PORTA = %00000000
PORTB = %00000000
Dim Servo1 As Word ; variabele var1
Clear
DelayMS 500 ;LCD stabilisering
test: ; begin test
Cls
While 1=1
If Servo1 < 10 Then
Servo PORTA.0, 1500
EndIf
Servo1 = PulsIn PORTB.0 , 1
Print At 1,1,Dec Servo1," "
Servo PORTA.0, Servo1 * 10
DelayMS 20
Wend
End
Heb hier nog een voorbeeld 3. Deze werkt al beter dan bovenstaande 2 opties. Echter komt deze niet in de basispositie terecht. Hij staat weer meer naar links. Maar blijft wel op deze positie staan. Als ik hem handmatig???? verdraai dan zoekt die weer die positie op. De kracht is nagenoeg weg in deze software maar dat is niet erg.
Device 16F648A ;16F648A PIC
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
TRISA = %00000000
TRISB = %00000001 ; ontvanger op poort B.0
PORTA = %00000000
PORTB = %00000000
Dim Servo1 As Word ; variabele var1
Clear
DelayMS 500 ;LCD stabilisering
test: ; begin test
Cls
While 1=1
Servo1 = PulsIn PORTB.0 , 1
Print At 1,1,Dec Servo1," "
If Servo1 < 10 Then
Servo PORTA.0, 1500
DelayMS 50
Else
Servo PORTA.0, Servo1 * 10
DelayMS 20
EndIf
Wend
End
Iemand enig idee wat ik fout doe? Ben vandaag pas begonnen met basic.
Probleem 2:
Ik heb een extern kristal aangesloten om een hogere precisie te behalen. Echter ondanks dat ik het volgende gedefineerd heb
Device 16F648A ;16F648A PIC
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd
ALL_DIGITAL TRUE ;Alle ingangen digitaal
XTAL 20 ;Kristal van 20MHz
Doet de software 5x zo snel?????
In plaats van 150 meet ik nu 750 op het display.
EDIT: met de multiplier te verlagen van x10 naar x2 ondervang ik dit probleem.. En los ik het middenstand probleem van de servo op. Alleen loop ik nog tegen het probleem aan dat het display 750 meet in plaats van de 500.
'****************************************************************
'* Name : Test.bas *
'* Author : Wetronic NL *
'* Notice : Copyright (c) 2009 www.wetronic.nl *
'* : All Rights Reserved *
'* Date : 30-4-2009 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device 16F648A ;16F648A PIC
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd
ALL_DIGITAL TRUE ;Alle ingangen digitaal
XTAL 20
TRISA = %00000000
TRISB = %00000001 ; ontvanger op poort B.0
PORTA = %00000000
PORTB = %00000000
Dim ServoX1 As Word ; variabele var1
Dim ServoX2 As Word
Dim ServoX3 As Word
Dim ServoX4 As Word
Dim Servo1 As Word
Dim Servo2 As Word
Dim Servo3 As Word
Dim Servo4 As Word
Clear
DelayMS 500 ;LCD stabilisering
DelayMS 500
DelayMS 500
DelayMS 500
DelayMS 500
DelayMS 500
;Cls
While 1=1
ServoX1 = PulsIn PORTB.0 , 1
Servo1 = ServoX1 / 5
ServoX2 = PulsIn PORTB.0 , 1
Servo2 = ServoX2 / 5
ServoX3 = PulsIn PORTB.0 , 1
Servo3 = ServoX3 / 5
; Print At 1,1,Dec Servo1," "
If Servo1 < 10 Then
Servo PORTA.0, 1500
Servo PORTA.1, 1500
Servo PORTA.2, 1500
Else
Servo PORTA.0, Servo1 * 10
Servo PORTA.1, Servo2 * 10
Servo PORTA.2, Servo3 * 10
EndIf
Wend
End
Inmiddels werkend zoals ik wil.
Echter is dit een te zware belasting op de processor.... Hierdoor lopen de servos niet soepel...
is er efficientere servo PWM software?
EDIT:
'****************************************************************
'* Name : Test.bas *
'* Author : Wetronic NL *
'* Notice : Copyright (c) 2009 www.wetronic.nl *
'* : All Rights Reserved *
'* Date : 30-4-2009 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device 16F648A ;16F648A PIC
Config WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd
ALL_DIGITAL TRUE ;Alle ingangen digitaal
XTAL 20
TRISA = %00000000
TRISB = %00000000 ; ontvanger op poort B.0
PORTA = %00000000
PORTB = %00000000
Dim x As Byte
Dim pbm1 As Byte
Dim pbm2 As Byte
Dim pbm3 As Byte
Dim pbm4 As Byte
Dim PWM_cycles As Byte
'Benoeming uitgangen
Symbol pen_a = PORTA.0
Symbol pen_b = PORTA.1
Symbol pen_c = PORTA.2
Symbol pen_d = PORTA.3
pbm1 = 50 'Waarde 1
pbm2 = 40 'Waarde 2
pbm3 = 60 'Waarde 3
pbm3 = 128 'Waarde 4
PWM_cycles = 255
x = 0
Output pen_a
Output pen_b
Output pen_c
Output pen_d
PBM:
DelayUS 700
High pen_a
High pen_b
High pen_c
High pen_d
For x = 0 To PWM_cycles
DelayUS 6
If x >= pbm1 Then
Low pen_a
EndIf
If x >= pbm2 Then
Low pen_b
EndIf
If x >= pbm3 Then
Low pen_c
EndIf
If x >= pbm4 Then
Low pen_d
EndIf
Next
GoTo PBM
End
Dit werkt al efficienter... Echter 1 nadeel ik krijg het niet voor mekaar om hem goed afgeregeld te krijgen...
Ik moet in 20ms een puls geven van 0.7 - 2,3 us.
EDIT2:
Ok werkende software inmiddels en een conclusie rijker
Pulsin commando is de boosdoener.. Deze moet efficienter. Iemand enig idee hoe ik dat kan doen? Om de tijd te meten met zo min mogelijk delay?