Пропорциональное управление на МК с нуля
| |
uwrtey | Дата: Вторник, 16.07.2013, 16:41 | Сообщение # 436 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Хотя нет. Вряд ли это выход за пределы...
При включении приемника серва занимает среднее положение, а затем положение должно зависеть от положения ручки на пульте.... Но при включении передатчика серва ни куда не поворачивает свою качалку, а так и остается в среднем положении. А качалка в свою очередь начинает легко поворачиваться от руки... И если серву в это время повернуть, а затем отключить пульт, то серва снова займет среднее положение, а этого она делать ни как не должна! Серва должна занимать среднее положение только при старте!
что же это может быть?
Меня сильно смущает, тот факт, что приемник и передатчик связаны гальванически.... во первых линия которая передает данные, а во вторых источник питания у них один.
На всякий случай, я повесил диод на линию данных... Теперь при той-же самой прошивке серва ведет себя совсем по другому. Она как бешеная мотает своей качалкой из стороны в сторону ( не описать ) Но при отключении передатчика серва все равно делает то, чего делать не должна - она занимает среднее положение!
ни чего не понимаю..
дисплей пока не подключил...
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Среда, 17.07.2013, 10:25 |
|
| |
ВитГо | Дата: Среда, 17.07.2013, 20:29 | Сообщение # 437 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| попробуй просто подать на серву питание (без управляющего сигнала) -
обычно серва без импульсов ничего не делает.. встать на центр может после после неверной длительности импульса
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Среда, 17.07.2013, 20:59 | Сообщение # 438 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Цитата (ВитГо) встать на центр может после после неверной длительности импульса в смысле? сама что-ли? без управляющего сигнала?
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Среда, 17.07.2013, 20:59 |
|
| |
uwrtey | Дата: Четверг, 18.07.2013, 01:27 | Сообщение # 439 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| OFFTOP
вот торрент со всеми схемами, которые хоть как-то могут быть связаны с климат-контролем. некоторые схемы повторяются ( там добавлены некоторые обновления ) в торренте архив - он запаролен. Пароль в личке.
как создавать торренты нашел тут http://isif-life.ru/polezny....ro.html
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Четверг, 18.07.2013, 01:27 |
|
| |
uwrtey | Дата: Воскресенье, 21.07.2013, 23:08 | Сообщение # 440 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Цитата (ВитГо) обычно серва без импульсов ничего не делает.. встать на центр может после после неверной длительности импульса ого, точно... Я изменил программу так, что бы при старте серва занимала не центральное положение а крайнее... Теперь после отключения питания передатчика серва так-же как и в прошлом варианте занимает центральное положение. Видимо она действительно встает на центральное положение, после того как на нее прекращают поступать импульсы длина которых выходила за пределы... Встроенная в сервопривод функция? ( только я не пойму как она работает, серва ведь аналоговая )
Цитата (ВитГо) попробуй просто подать на серву питание (без управляющего сигнала) - без управляющего сигнала серва ни чего не делает...
тогда точно нужно вешать дисплей и смотреть, какой длины приходят импульсы...
**
Добавлено (21.07.2013, 10:15) ---------------------------------------------
Дисплей я прикошачил. И он работает!
Добавлено (21.07.2013, 23:08) --------------------------------------------- ну вот проверил: при среднем положении стика на экран выводится 0BC5 ,что в десятичной системе равно 3013 тиков в крайнем верхнем 0E77 = 3703 тиков в крайнем нижнем 094B = 2379 тиков 1 тик = 0,5 мкс И это значит, что на сервопривод выводится нужная длительность!
Завтра буду разбираться дальше....
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 21.07.2013, 23:09 |
|
| |
ВитГо | Дата: Понедельник, 22.07.2013, 21:26 | Сообщение # 441 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| осциллограммы получается посмотреть ? в смысле с изменением длительности.. ?
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Понедельник, 22.07.2013, 22:56 | Сообщение # 442 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Цитата (ВитГо) осциллограммы получается посмотреть ? в смысле с изменением длительности.. ? не понял вопрос..... осциллограмма чего? осциллограмма импульсов с передатчика ??? если "да" то с ней все в порядке... Или осциллограмма импульсов идущих на сервопривод? Если ты про нее, то я ее снимал, но уже не помню какую прошивку использовал.. Но зато помню, то что при включении передатчика сервопривод ни куда не отклонялся и при этом легко вращался рукой....
А если линию передачи данных с передатчика на приемник пропустить через диод, то серва дергается как сумасшедшая... вот это мне в обще не понятно... Но тут, скорее всего, банально, МК не может понять логический уровень... ( не видит лог_0 )
_____________________
сегодня отключил дисплей и повесил сервопривод обратно, но программу изменил так: ( прошивку прикрепил )
При включении приемника сервопривод занимает среднее положение. А при включении передатчика сервопривод занимает то положение, которое задано стиком. И программа приемника тут-же зависает в бесконечном цикле ( прямо в прерывании ). Скомпилировал. Залил. Все работает. - Сервопривод послушно занимает заданный угол... А это значит, что с передаваемой длительностью импульса и его приемом все в порядке! Тут скорее всего дело в том, что я обнуляю тот же таймер на котором организован ШИМ... // Хотя, Ты вроде говорил, что так можно делать?!....
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Вторник, 23.07.2013, 07:27 |
|
| |
ВитГо | Дата: Среда, 24.07.2013, 06:14 | Сообщение # 443 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| нееее!!! счетчик обнулять нельзя!!!!! этим ты ломаешь генерацию !!! можно менять значения регистров совпадения !!
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Среда, 24.07.2013, 11:15 | Сообщение # 444 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Цитата (ВитГо) этим ты ломаешь генерацию !!! дак, это понятно... Видимо мы тогда не правильно друг друга поняли... стр 25 сообщения 374 и 375
Цитата (ВитГо) можно менять значения регистров совпадения !! это как ?
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Четверг, 25.07.2013, 00:35 |
|
| |
ВитГо | Дата: Четверг, 25.07.2013, 21:37 | Сообщение # 445 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ну можно меня значения регистров ocr
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 27.07.2013, 23:49 | Сообщение # 446 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: 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
Статус: Offline
| ну может быть тогда делать что то программно ? какая у тебя тактовая частота ?
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Понедельник, 29.07.2013, 23:22 | Сообщение # 448 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: 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
Статус: Offline
| ну вот.... что то даже набросал:
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Четверг, 01.08.2013, 21:18 |
|
| |
uwrtey | Дата: Пятница, 02.08.2013, 22:28 | Сообщение # 450 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: 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 |
|
| |
|