я такой код использую, но он с резкими движениями получается
- Код: Выделить всё • Развернуть
For I = 30 To Top Step 10
X = Center + I
Servo(1) = X
Waitms Wait1
Gosub Sharp_left
Next
Технический форум по робототехнике.
For I = 30 To Top Step 10
X = Center + I
Servo(1) = X
Waitms Wait1
Gosub Sharp_left
Next
$regfile = "m16def.dat" 'используем мк ATmega16
$crystal = 16000000 'частота кварцевого резонатора 16mHz
$include "config ports.bas"
'*********************************ЖКИ*******************************************
$lib "lcd4.lbx" 'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
Cursor Off : Cls 'отключаем курсор и очищаем дисплей
'************************Переменные и константы*********************************
Dim Minimum As Byte , Maximum As Byte , Center As Byte , Speed As Byte : Speed = 200
Dim X As Integer , I As Integer
Minimum = 80 : Maximum = 160 : Center = Maximum - Minimum 'подсчитываем разворот в градусах для сервопривода
Const Wait1 = 500 : Const Top = 30
'*****************************Основной цикл*************************************
1:
Do
Gosub Вперёд ' Если сигнала от ик-датчика(Sharp) не поступает, значит двигаемся всё время прямо
'******************Вращение сервопривода и датчика Sharp************************
'*********************************Вправо****************************************
For I = 30 To Top Step 10
X = Center + I
Servo(1) = X
Waitms Wait1
Gosub Sharp_left
Next
'*********************************Центр*****************************************
For I = 30 To Top Step 10
Servo(1) = Center
Waitms Wait1
Gosub Sharp_center
Next
'*********************************Влево*****************************************
For I = 30 To Top Step 10
X = Center - I
Servo(1) = X
Waitms Wait1
Gosub Sharp_right
Next
'*********************************Центр*****************************************
For I = 30 To Top Step 10
Servo(1) = Center
Waitms Wait1
Gosub Sharp_center
Next
Loop
'*******************************************************************************
$include "gosub.bas"
'*******************************************************************************
End
'*******************************************************************************
Config Servos = 1 , Servo1 = Portc.0 , Reload = 12 ' Указываем кол-во серв, присваеваем имя Servo1 порту PD2, указываем длину импульса.
=DeaD= писал(а):Почему Step 10 ?
$regfile = "m16def.dat" ' specify the used micro
$crystal = 16000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
'Servo's need a pulse in order to operate
'with the config statement CONFIG SERVOS we can specify how many servo's we
'will use and which port pins are used
'A maximum of 14 servos might be used
'The SERVO statements use one byte for an interrupt counter and the TIMER0
'This means that you can not use TIMER0 anymore
'The reload value specifies the interval of the timer in uS
'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
Config Servos = 1 , Servo1 = Portc.0 , Reload = 10
'as an option you can use TIMER1
'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10 , Timer = Timer1
'we use 2 servos with 10 uS resolution(steps)
'we must configure the port pins used to act as output
Config Portc = Output
'finally we must turn on the global interrupt
Enable Interrupts
'the servo() array is created automatic. You can used it to set the
'time the servo must be on
Servo(1) = 10 '10 times 10 = 100 uS on
'Servo(2) = 20 '20 times 10 = 200 uS on
Dim I As Byte
Do
For I = 50 To 200 Step 1
Servo(1) = I
Waitms 30
Next
For I = 200 To 50 Step -1
Servo(1) = I
Waitms 30
Next
Loop
End
$regfile = "m16def.dat"
$crystal = 16000000
Config Servos = 1 , Servo1 = Portc.0 , Reload = 10
Config Portc = Output
Enable Interrupts
Servo(1) = 10 '10 times 10 = 100 uS on
Dim I As Byte
Do
For I = 45 To 90 Step 1 ' начинаем движение от 45 градусов и до 90 с шагом 1
Servo(1) = I
Waitms 12 ' время за которое будет выполняться один шаг(движение на один градус).
' то есть в нашем случае каждые 12 мс серва будет сдвигаться влево или вправо на один градус.
Next
Waitms 500 ' задерживаем серву в данном положение на 0, 5 секунды
For I = 90 To 135 Step 1
Servo(1) = I
Waitms 12
Next
Waitms 500
For I = 135 To 90 Step -1
Servo(1) = I
Waitms 12
Next
Waitms 500
For I = 90 To 45 Step -1
Servo(1) = I
Waitms 12
Next
Waitms 500
Loop
End