Лайнтрейсер с ПИД алгоритмом. Вопросы по исходнику.

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Лайнтрейсер с ПИД алгоритмом. Вопросы по исходнику.

Сообщение osc » 28 сен 2010, 23:13

Здравствуйте!
Есть исходник для Bascom AVR, не понятно за что отвечают переменные Steeringrear и Steeringfront.
Еще не ясно что значит Reset Motor?
Подскажите пожалуйста.
Код: Выделить всё
$regfile = "attiny44.dat"
$crystal = 8000000
$framesize = 32
$hwstack = 64
$swstack = 48

Waitms 100

Dim Diff As Long                                            'Difference between target position and measured position
Dim Difflast As Long                                        'Previous Difference value
Dim Prop As Single                                          'Proportional Value
Dim Integral As Single                                      'Integral Value
Dim Deriv As Single                                         'Derivative Value
Dim Rate As Single                                          'Rate calculation used for Derivative
Dim Control As Single                                       'Calculated value used to control steering
Dim Mpos As Long                                            'Measured Position
Dim Sensors As Byte                                         'Byte used to hold sensor values
Dim I As Long , X As Long , Temp As Single , Mystr As String * 16
Dim Tlong As Long , Myint As Integer

'Aliases
Speed Alias Pwm1a
Motor Alias Porta.7
Steeringfront Alias Servo(2)
Steeringrear Alias Servo(1)


'PID Constants
Const Kp = 4.5                                              'Gain factor for proportional
Const Kd = .4                                               'Gain factor for derivitive
Const Ki = .1                                               'Gain Factor for Integral

Const Interval = .01                                        'Not used
Const Tpos = 0                                              'Target position of sensors
Const Upperlimit = 30                                       'Maximum control value
Const Lowerlimit = -30                                      'Minimum control value


'Other Constants                                           '
Const Scenterf = 101
Const Scenterr = 105

Const Fast = 650
Const Medium = 640
Const Slow = 600
Const Nogo = 512

'Configuration Statements
Config Timer1 = Pwm , Prescale = 1 , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect
Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 8

'Config Ports
Config Porta = Input
Config Porta.6 = Output
Config Porta.7 = Output
Config Portb = Output

'Turn on Internal Pullups
Porta = &B00011111

'Turn off Motor
Set Motor
Speed = Nogo


'Enable everything
Enable Timer1
Enable Interrupts

Steeringfront = Scenterf
Steeringrear = Scenterr

Wait 2

Difflast = 0
Reset Motor
Speed = Medium

Do
      Sensors = Not Pina
      Sensors = Sensors And &B00011111

      Select Case Sensors

         Case &B00001                                       'Right most sensor
         Mpos = 4
         'Speed = Slow

         Case &B00011                                       'Right Sensors
         Mpos = 3

         Case &B00010                                       'Right Mid sensor
         Mpos = 2

         Case &B00111                                       'Center Right
         Mpos = 1

         Case &B00110                                       'Center Right
         Mpos = 1

         Case &B00100                                       'Centered on the line
         Mpos = 0

         Case &B01100                                       'Center Left
         Mpos = -1

         Case &B11100                                       'Center Left
         Mpos = -1

         Case &B01000                                       ' Left Mid Sensor
         Mpos = -2

         Case &B11000                                       ' Left sensors
         Mpos = -3

         Case &B10000                                       'Left most sensor
         Mpos = -4

         Case &B00000                                       'lost line
         If Mpos < 0 Then Mpos = -5 Else Mpos = 5

      End Select

   Diff = Tpos - Mpos
   Prop = Diff * Kp                                         'Calculate Proportional

   Integral = Integral + Diff                               'Calculate Integral
   Integral = Integral * Ki

   Rate = Diff - Difflast                                   'Calculate Differential
   Deriv = Rate * Kd

   Difflast = Diff

   Control = Prop + Deriv                                   'New control value
   Control = Control + Integral


   If Control > Upperlimit Then Control = Upperlimit        'Keep within safe range
   If Control < Lowerlimit Then Control = Lowerlimit

   Temp = Scenterf - Control
   Myint = Temp                                             'Convert Single to Integer
   Steeringfront = Myint
   Temp = Scenterr + Control
   Myint = Temp
   Steeringrear = Myint                                     'Convert Single to Integer

   Waitms 5                                                 'wait 5ms between loops (200 times a second)

Loop

End


Добавлено спустя 2 часа 19 минут 12 секунд:
Тишина...
Бейсик никто не знает?
Выложить тоже самое, но переделанное на C?
Аватара пользователя
osc
 
Сообщения: 333
Зарегистрирован: 07 сен 2009, 20:06
прог. языки: c, c#
ФИО: Евгений

Re: Лайнтрейсер с ПИД алгоритмом. Вопросы по исходнику.

Сообщение EdGull » 28 сен 2010, 23:49

Reset это установка в 0

Для чего нужны эти переменные нужно спрашивать у автора или читать комментарии

Добавлено спустя 2 минуты 19 секунд:
alias он и в африке алиас
или не понятно что такое серва?
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Лайнтрейсер с ПИД алгоритмом. Вопросы по исходнику.

Сообщение osc » 29 сен 2010, 17:59

EdGull, я конкретно спросил что не понятно, не надо гадать.

PS: разобрался.
Последний раз редактировалось osc 30 сен 2010, 16:57, всего редактировалось 1 раз.
Аватара пользователя
osc
 
Сообщения: 333
Зарегистрирован: 07 сен 2009, 20:06
прог. языки: c, c#
ФИО: Евгений

Re: Лайнтрейсер с ПИД алгоритмом. Вопросы по исходнику.

Сообщение Radist » 29 сен 2010, 22:25

Не нравятся мне такие вопрошающие. Наезды безличные (типа простого бейсика мы не знаем), наезды личные. А ну как и мой ответ топикстартеру не понравится и меня он пошлет лесом? Неприятно.

Насколько я понял, в качестве моторов используются сервы, переделанные на постоянное вращение. Из названий переменных можно вычленить слова "перед" и "зад". А также есть установка серв в центральное положение, что эквивалентно останову. Вот что эти переменные означают (на мой взгляд). А в проге я не разбирался - мне не хочется тратить время на грубияна. ПИД алгоритм - он и в Африке ПИД алгоритм, его можно на любом языке реализовать.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Лайнтрейсер с ПИД алгоритмом. Вопросы по исходнику.

Сообщение osc » 30 сен 2010, 17:00

Radist, спасибо за исчерпывающий ответ, разобрался, те самые переменные это вроде define в си.
Аватара пользователя
osc
 
Сообщения: 333
Зарегистрирован: 07 сен 2009, 20:06
прог. языки: c, c#
ФИО: Евгений


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13