Среда, 24.04.2024, 01:27
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | Пропорциональное управление на МК с нуля - Страница 30 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: ВитГо  
Форум » Разработка электронных устройств » Разрабатываю ! » Пропорциональное управление на МК с нуля (пошаговое строительство пропорционального управления с нуля)
Пропорциональное управление на МК с нуля
uwrteyДата: Вторник, 16.07.2013, 16:41 | Сообщение # 436
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Хотя нет. Вряд ли это выход за пределы...

При включении приемника серва занимает среднее положение, а затем положение должно зависеть от положения ручки на пульте....
Но при включении передатчика серва ни куда не поворачивает свою качалку, а так и остается в среднем положении.
А качалка в свою очередь начинает легко поворачиваться от руки...
И если серву в это время повернуть, а затем отключить пульт, то серва снова займет среднее положение, а этого она делать ни как не должна!
Серва должна занимать среднее положение только при старте!


что же это может быть?

Меня сильно смущает, тот факт, что приемник и передатчик связаны гальванически....
во первых линия которая передает данные, а во вторых источник питания у них один.

На всякий случай, я повесил диод на линию данных...
Теперь при той-же самой прошивке серва ведет себя совсем по другому.
Она как бешеная мотает своей качалкой из стороны в сторону ( не описать )
Но при отключении передатчика серва все равно делает то, чего делать не должна - она занимает среднее положение!

ни чего не понимаю.. sad

дисплей пока не подключил...


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Среда, 17.07.2013, 10:25
 
ВитГоДата: Среда, 17.07.2013, 20:29 | Сообщение # 437
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
попробуй просто подать на серву питание (без управляющего сигнала) -

обычно серва без импульсов ничего не делает.. встать на центр может после после неверной длительности импульса


Виталий (аka ВитГо)
 
uwrteyДата: Среда, 17.07.2013, 20:59 | Сообщение # 438
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Цитата (ВитГо)
встать на центр может после после неверной длительности импульса

в смысле? сама что-ли? без управляющего сигнала?


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Среда, 17.07.2013, 20:59
 
uwrteyДата: Четверг, 18.07.2013, 01:27 | Сообщение # 439
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
OFFTOP

вот торрент со всеми схемами, которые хоть как-то могут быть связаны с климат-контролем.
некоторые схемы повторяются ( там добавлены некоторые обновления )
в торренте архив - он запаролен. Пароль в личке.

как создавать торренты нашел тут http://isif-life.ru/polezny....ro.html
Прикрепления: 8181476.zip (15.1 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Четверг, 18.07.2013, 01:27
 
uwrteyДата: Воскресенье, 21.07.2013, 23:08 | Сообщение # 440
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Цитата (ВитГо)
обычно серва без импульсов ничего не делает.. встать на центр может после после неверной длительности импульса

ого, точно... Я изменил программу так, что бы при старте серва занимала не центральное положение а крайнее...
Теперь после отключения питания передатчика серва так-же как и в прошлом варианте занимает центральное положение.
Видимо она действительно встает на центральное положение, после того как на нее прекращают поступать импульсы длина которых выходила за пределы...
Встроенная в сервопривод функция? ( только я не пойму как она работает, серва ведь аналоговая )

Цитата (ВитГо)
попробуй просто подать на серву питание (без управляющего сигнала) -

без управляющего сигнала серва ни чего не делает...

тогда точно нужно вешать дисплей и смотреть, какой длины приходят импульсы...

**

Добавлено (21.07.2013, 10:15)
---------------------------------------------

Дисплей я прикошачил. И он работает!

Добавлено (21.07.2013, 23:08)
---------------------------------------------
ну вот проверил:
при среднем положении стика на экран выводится 0BC5 ,что в десятичной системе равно 3013 тиков
в крайнем верхнем 0E77 = 3703 тиков
в крайнем нижнем 094B = 2379 тиков
1 тик = 0,5 мкс
И это значит, что на сервопривод выводится нужная длительность!

Завтра буду разбираться дальше....
Прикрепления: 1_003-.txt (11.1 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Воскресенье, 21.07.2013, 23:09
 
ВитГоДата: Понедельник, 22.07.2013, 21:26 | Сообщение # 441
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
осциллограммы получается посмотреть ? в смысле с изменением длительности.. ?

Виталий (аka ВитГо)
 
uwrteyДата: Понедельник, 22.07.2013, 22:56 | Сообщение # 442
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Цитата (ВитГо)
осциллограммы получается посмотреть ? в смысле с изменением длительности.. ?

не понял вопрос..... dry
осциллограмма чего? осциллограмма импульсов с передатчика ??? если "да" то с ней все в порядке...
Или осциллограмма импульсов идущих на сервопривод? Если ты про нее, то я ее снимал, но уже не помню какую прошивку использовал..
Но зато помню, то что при включении передатчика сервопривод ни куда не отклонялся и при этом легко вращался рукой....

А если линию передачи данных с передатчика на приемник пропустить через диод, то серва дергается как сумасшедшая... вот это мне в обще не понятно...
Но тут, скорее всего, банально, МК не может понять логический уровень... ( не видит лог_0 )

_____________________

сегодня отключил дисплей и повесил сервопривод обратно, но программу изменил так: ( прошивку прикрепил )

При включении приемника сервопривод занимает среднее положение.
А при включении передатчика сервопривод занимает то положение, которое задано стиком.
И программа приемника тут-же зависает в бесконечном цикле ( прямо в прерывании ).
Скомпилировал. Залил.
Все работает. smile - Сервопривод послушно занимает заданный угол... smile
А это значит, что с передаваемой длительностью импульса и его приемом все в порядке!
Тут скорее всего дело в том, что я обнуляю тот же таймер на котором организован ШИМ... // Хотя, Ты вроде говорил, что так можно делать?!....
Прикрепления: 5448727.asm (11.8 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Вторник, 23.07.2013, 07:27
 
ВитГоДата: Среда, 24.07.2013, 06:14 | Сообщение # 443
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
нееее!!! счетчик обнулять нельзя!!!!!
этим ты ломаешь генерацию !!!
можно менять значения регистров совпадения !!


Виталий (аka ВитГо)
 
uwrteyДата: Среда, 24.07.2013, 11:15 | Сообщение # 444
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Цитата (ВитГо)
этим ты ломаешь генерацию !!!

дак, это понятно...
Видимо мы тогда не правильно друг друга поняли... стр 25 сообщения 374 и 375 biggrin

Цитата (ВитГо)
можно менять значения регистров совпадения !!

это как ?


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Четверг, 25.07.2013, 00:35
 
ВитГоДата: Четверг, 25.07.2013, 21:37 | Сообщение # 445
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
ну можно меня значения регистров ocr

Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 27.07.2013, 23:49 | Сообщение # 446
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Проблема заключается в том, что у меня не хватает смекалки удовлетворить все свои потребности всего двумя данными таймерами...
Если бы здесь было три 16-битных таймера, то я бы так не тупил...

На Таймере_1 организован аппаратный шим для сервопривода.
А так же Таймером_1 я планирую измерять длительность входящего импульса.

На Таймере_0 я планирую сделать 2 аппаратных ШИМа для управления моторами... ( так что таймер_0 я пока не трогаю )

Таймер_1 у меня тикает всего до 40000 ( 0x9C40 ), то есть максимальная длительность, которую он может замерить всего 0,02 секунды ( это обусловлено частотой ШИМа для сервы )
Но это нормально, так как 0,02 сек "весит" весь пакет - и такую длительность мне замерять не придется....
Обнулять этот таймер нельзя!
А как же мне измерить длину входящего импульса?

А если я буду изменять OCR1*, то это напрямую повлияет на ШИМ : либо на частоту ( если OCR1A ) либо на длительность импульса ( если OCR1B )

Добавлено (27.07.2013, 23:49)
---------------------------------------------
попросил помощи http://radiokot.ru/forum/viewtopic.php?f=57&t=92458


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Четверг, 25.07.2013, 22:12
 
ВитГоДата: Воскресенье, 28.07.2013, 08:03 | Сообщение # 447
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
ну может быть тогда делать что то программно ?
какая у тебя тактовая частота ?


Виталий (аka ВитГо)
 
uwrteyДата: Понедельник, 29.07.2013, 23:22 | Сообщение # 448
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Да-не...
На радиокоте подсказали как быть... нужно каждый раз, как захожу в прерывание, сохранять значение таймера и вычитать из него предыдущее значение...
А если было переполнение, то это нужно учесть... ( я вижу три способа )

первый: Сравнивать полученное значение и предыдущее. Если полученное меньше, чем предыдущее, то нужно из предыдущего вычитать полученное, а не наоборот..
второй: Проверить флаг переполнения таймера, и если он установлен, то нужно из предыдущего вычитать полученное, а не наоборот..
третий: Воспользоваться избыточным кодом

вот пример решения с избыточным кодом:

Таймер у нас считает до 40000 ( 0x9C40 )
В прошлый раз мы сохранили число 39800 ( 0x9B78 )
В этот раз у нас получилось число 3800 ( 0xED8 )
теперь считаем:
3800-39800= -36000 ( 0x7360 ) == 29536
но так как результат был отрицательным, нужно выполнить еще пару действий
65536-29536 = 36000 ( 8CA0 )
40000-36000 = 4000 - это и есть искомая длительность ...

но к сожалению этот вариант нам не подходит, так как отрицательность числа по старшему ( 16-му ) биту нам не определить...
а все потому что у нас в распоряжении всего 2 байта...
поэтому отрицательность числа ( переполнение таймера ) придется проверять либо сравнением либо по флагу переполнения...
флагом переполнения я еще не пользовался поэтому буду использовать сравнение ..


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Вторник, 30.07.2013, 22:07
 
uwrteyДата: Четверг, 01.08.2013, 21:18 | Сообщение # 449
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
ну вот.... что то даже набросал:
Прикрепления: 0990567.txt (13.4 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Четверг, 01.08.2013, 21:18
 
uwrteyДата: Пятница, 02.08.2013, 22:28 | Сообщение # 450
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Один черт - программа не работает как надо... ( сервопривод дергается.. )
сделал программу, что бы на дисплее посмотреть и увидел, что на серву приходят длительности больше чем 50000 тиков - ( 1 тик равен 0,0000005 сек ) !!!

Добавлено (02.08.2013, 22:28)
---------------------------------------------
нашел одну орфографическую ошибку ( опять копипастил )
Код
   
   ldi XH, hight(Chastota_const)    ;   
   ldi XH, low(Chastota_const)

исправил - не помогло... искал другие ошибки не нашел....
туплю....

может какая то логическая ошибка ?

вместо обнуления таймера у меня теперь вот такой код
Код

;**************************************************************************************************************
; вычисление длины импульса/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
;**************************************************************************************************************

  lds ZL, impuls_len  ; загружаем (читаем )  в "z" данные таймера с прошлого раза  
  lds ZH, impuls_len+1

  STS impuls_len, XL  ; сохраняем данные счетчика полученные в этот раз
  STS impuls_len+1, XH  ;  

  mov YH,ZH   ; копируем  данные таймера с прошлого раза  
  mov YL,ZL

  mov Temp,XH   ; копируем данные таймера полученные сейчас
  mov Temp1,XL

  rcall compare_XY16  ; сравниваем...

  breq menshe_2   ; переход на обработку когда X=Y ( сейчас число равно тому, что было в прошлый раз )
  brcs menshe_2   ; переход на обработку когда X<Y ( сейчас число меньше чем в прошлый раз )
  rjmp bolshe_2   ; переход на обработку когда X>Y ( сейчас число больше чем в прошлый раз )

;**************************************************************************************************************
; вычисление длины импульса, если таймер был переполнен
;**************************************************************************************************************

menshe_2:

  SUB ZL, XL   ; из большего вычитаем меньшее
  SBC ZH, XH   ;

  ldi XH, high(Chastota_const)    ; загружаем число 40000
  ldi XL, low(Chastota_const)

  SUB XL, ZL   ; вычисляем длительность импульса
  SBC XH, ZH   ; длительность канала находится в "Х"

  rjmp prodolzaem   ;  

;**************************************************************************************************************
; вычисление длины импульса, если таймер НЕ БЫЛ переполнен
;**************************************************************************************************************

bolshe_2:

  SUB XL, ZL   ; вычисляем длительность импульса
  SBC XH, ZL   ; длительность канала находится в "Х"

  rjmp prodolzaem   ;  
Прикрепления: __.txt (14.1 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Пятница, 02.08.2013, 22:31
 
Форум » Разработка электронных устройств » Разрабатываю ! » Пропорциональное управление на МК с нуля (пошаговое строительство пропорционального управления с нуля)
Поиск:


Copyright MyCorp © 2024
Сделать бесплатный сайт с uCoz