Четверг, 28.03.2024, 13:17
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | Пропорциональное управление на МК с нуля - Страница 22 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: ВитГо  
Форум » Разработка электронных устройств » Разрабатываю ! » Пропорциональное управление на МК с нуля (пошаговое строительство пропорционального управления с нуля)
Пропорциональное управление на МК с нуля
uwrteyДата: Пятница, 26.04.2013, 20:21 | Сообщение # 316
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Репутация: 11
Статус: Offline
shy и как я сам то не додумался... facepalm
Цитата
ну для твоего случая - синхроимпульс всегда по длительности больше 13 мс.. (2 мс * 3 канала =6 мс, общая длинна пакета 20 мс)

немного расчетов:
если таймер тикает каждые 0,5 мкс ( 1 тик таймера = 0,5 мкс )
то синхроимпульс будет всегда больше 26000 тиков таймера ( 0b110010110010000 или 0x6590 ) (13 мс)

то-есть остается сравнить полученное в прерывании число с 0b110010110010000 и если больше, то значит синхроимпульс, если меньше, то это не он...
и тут до меня доходит, что сравнивать-то я еще не умею...
тут мне в голову пришли два решения:

1) сравниваю полученную длительность с 8,192 мс ( это тоже - больше, чем длина всех каналов )
как я это делаю:
делаю маску 0b0100000000000000 и проверяю четырнадцатый бит на единицу.
если в нем единица, то значит, что полученная длительность больше, чем 8,192 мили секунды - а это значит, что мы замеряли синхроимпульс...

2) сравниваю полученную длительность с 13 мс ( 0b110010110010000 )
как я это делаю:
из 0b110010110010000 (13мс) вычитаем, то значение, которое получили при входе в прерывание.
и если в результате мы получили положительное число, то это - что-то меньше 13 милисекунд
а если в результате отрицательное число, то это больше, чем 13 милисекунд. ( синхроимпульс )

Я скорее всего выберу второй вариант.


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

Сообщение отредактировал uwrtey - Пятница, 26.04.2013, 22:04
 
ВитГоДата: Суббота, 27.04.2013, 06:46 | Сообщение # 317
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
почему не умеешь сравнивать ? мы же писали 16ти битное сравнение !!!

Цитата (uwrtey)
1) сравниваю полученную длительность с 8,192 мс ( это тоже - больше, чем длина всех каналов )
как я это делаю:
делаю маску 0b0100000000000000 и проверяю четырнадцатый бит на единицу.
если в нем единица, то значит, что полученная длительность больше, чем 8,192 мили секунды - а это значит, что мы замеряли синхроимпульс...


не пойдет ! а если у тебя будет синхроимпульс 16 мс - то четырнадцатый бит будет равен 0 :-) а 15ый - будет равен единице :-)

используй 16ти битное сравнение ! мы писали эту процедуру помоему в 40 командном управлении...


Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 27.04.2013, 12:32 | Сообщение # 318
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Репутация: 11
Статус: Offline
Точно! ПисАли же... Пустая моя голова... facepalm
вот-же этот код
Код


;*********************************************************************************
; проверяем длину ИМПУЛЬСА TCNT1 и 3300-10%=2970  ( 0xB9A )
;*********************************************************************************

mov Temp,XH   ; копируем  "Х"
mov Temp1,XL

ldi YH,0xB   ; записываем в регистровую пару "Y" 3300-10%=2970  ( 0xB9A )
ldi YL,0x9A

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

breq X_bolshe_Y_2970_imp    ; переход на обработку когда X=Y
brcs X_menshe_Y_2970_imp    ; переход на обработку когда X<Y
rjmp X_bolshe_Y_2970_imp    ; переход на обработку когда X>Y

;*****************************************************************************************
; подпрограмма сравнения
;*****************************************************************************************

compare_XY16:

cp Temp,YH   ; сравниваем старшие части регистров
breq xh_eq_yh   ; значения старших регистров равны, нужно сравнить младшие xl и yl
; флаг С - установлен когда X<Y
; флаг С - сброшен когда X>Y
ret

xh_eq_yh:

cp Temp1,YL   ; сравниваем младшие части регистров
; флаг Z=1 когда X=Y
; флаг С - установлен когда X<Y
; флаг С - сброшен когда X>Y

ret   


__________________________________________________________________________________________________________

Цитата

не пойдет ! а если у тебя будет синхроимпульс 16 мс - то четырнадцатый бит будет равен 0 :-) а 15ый - будет равен единице :-)

используй 16ти битное сравнение ! мы писали эту процедуру помоему в 40 командном управлении...

а как Тебе второй вариант ?

вот он: ( он, кстати меньше по объему )
Код


     ldi Temp, Low(pause_len)
     ldi Temp1, high(pause_len)

     SUB XL, Temp    ; вычитаем
     SBC XH, Temp1    ;

     andi XH, 0b10000000   ; маска ( где 1, там остается информпция, где 0, так стирается )

         
     cpi XH, 0b10000000   ; это число отрицательное ? ( это синхроимпульс ?)
     brne out_1    ; нет - ВЫХОД
     rjmp sinhro_imp    ; да

sinhro_imp:

     ldi Temp, 3    ; флаг синхроимпульс
     sts ch_count, Temp

     rjmp out_1    ; выход


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

Сообщение отредактировал uwrtey - Суббота, 27.04.2013, 13:05
 
uwrteyДата: Суббота, 27.04.2013, 20:16 | Сообщение # 319
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Репутация: 11
Статус: Offline
ну вот немного кода накидал
Прикрепления: 2200325.asm (10.8 Kb)


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

Сообщение отредактировал uwrtey - Суббота, 27.04.2013, 20:17
 
uwrteyДата: Суббота, 27.04.2013, 20:17 | Сообщение # 320
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Репутация: 11
Статус: Offline
в голове вроде что-то стало раскладываться по полочкам....
... кодю дальше....
smile
Прикрепления: 7412461.asm (11.1 Kb)


не успеваю за своими мыслями......
 
ВитГоДата: Суббота, 27.04.2013, 20:48 | Сообщение # 321
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
да в принципе любой вариант хорош.. что вычитанием что сложением..

Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 28.04.2013, 00:45 | Сообщение # 322
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Репутация: 11
Статус: Offline
я вплотную подошел к тому, что нужно полученные данные применить к моторам
Если я правильно понял, то нужно запустить аппаратный шим и полученные данные вывести в этот шим
Прикрепления: 1793498.asm (12.9 Kb)


не успеваю за своими мыслями......
 
ВитГоДата: Воскресенье, 28.04.2013, 15:47 | Сообщение # 323
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
ну с этим вопросом к Андрею :-) он во вся эксперементирует с моторами :-)

Виталий (аka ВитГо)
 
uwrteyДата: Среда, 01.05.2013, 22:31 | Сообщение # 324
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Репутация: 11
Статус: Offline
ну для двигателей нужно организовать Phase Correct PWM Mode
на два канала OC1A и OC1B smile

http://www.promelec.ru/pdf/ATTINY2313.pdf
стр 106, таблица 46.

максимальное число на каждый мотор ( THR+RUDS ) 1023+512=1535 ( 0b10111111111 )
а это ни два ни полтора! sad ( шим бывает 8,9 и 10-битный; либо 0-16 битный но задан через ICR1 )
можно было бы выбрать вершину ШИМ в ICR1, но этот регистр занят прерыванием в режиме захвата ( ICP )

хоть прерывание по захвату меняй на прерывание по int0... sad
или
нужно как-то организовать условие что бы THR1 и THR2 были равны значению от 0 до 1023 и тогда можно будет использовать 10-ти битный ШИМ

тут мне нужна подсказка...

...

---------------------------------------------
это какой Андрей? Lordddoid ?

Добавлено (01.05.2013, 22:31)
---------------------------------------------
хотя есть и еще один вариант - это использование программного ШИМа surprised


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

Сообщение отредактировал uwrtey - Среда, 01.05.2013, 22:35
 
ВитГоДата: Четверг, 02.05.2013, 21:24 | Сообщение # 325
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
или ШИМ или BAM

Виталий (аka ВитГо)
 
uwrteyДата: Пятница, 03.05.2013, 10:08 | Сообщение # 326
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Репутация: 11
Статус: Offline
как ты смотришь на то, что я переделаю прерывание по INT0 ?

не успеваю за своими мыслями......
 
ВитГоДата: Пятница, 03.05.2013, 13:05 | Сообщение # 327
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
гм.. попробуй

Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 04.05.2013, 13:15 | Сообщение # 328
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Репутация: 11
Статус: Offline
ну тогда сделаю резервную копию того что наработал smile

Добавлено (04.05.2013, 13:15)
---------------------------------------------
вчера уже начал переделывать, думаю что управление моторами сегодня- завтра доделаю, а как быть с рулевой машинкой пока непонятно smile
там видно будет..

Прикрепления: 4105833.zip (65.1 Kb)


не успеваю за своими мыслями......
 
ВитГоДата: Суббота, 04.05.2013, 14:49 | Сообщение # 329
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
а что тебя пугает в рулевой машинке ?

Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 04.05.2013, 21:27 | Сообщение # 330
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Репутация: 11
Статус: Offline
Пока ничего, просто у одного таймера настроенного на ШИМ максимум 2 ножки.
Обе ножки я задействую для двух моторов.
Я еще не задавался вопросом как буду рулевой машинкой управлять.
Видимо я полностью полагаюсь на Твою помощь, и мне кажется, что я импровизирую вместо того что-бы в самом начале накидать полный план действий.
Хотя в программировании это наверно совсем не допустимо - можно много времени потратить на написание кода, который окажется тупиковым и придется все полностью переделывать.... surprised


не успеваю за своими мыслями......
 
Форум » Разработка электронных устройств » Разрабатываю ! » Пропорциональное управление на МК с нуля (пошаговое строительство пропорционального управления с нуля)
Поиск:


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