Пропорциональное управление на МК с нуля
| |
uwrtey | Дата: Пятница, 26.04.2013, 20:21 | Сообщение # 316 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| и как я сам то не додумался... Цитата ну для твоего случая - синхроимпульс всегда по длительности больше 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
Статус: Offline
| почему не умеешь сравнивать ? мы же писали 16ти битное сравнение !!!
Цитата (uwrtey) 1) сравниваю полученную длительность с 8,192 мс ( это тоже - больше, чем длина всех каналов ) как я это делаю: делаю маску 0b0100000000000000 и проверяю четырнадцатый бит на единицу. если в нем единица, то значит, что полученная длительность больше, чем 8,192 мили секунды - а это значит, что мы замеряли синхроимпульс...
не пойдет ! а если у тебя будет синхроимпульс 16 мс - то четырнадцатый бит будет равен 0 :-) а 15ый - будет равен единице :-)
используй 16ти битное сравнение ! мы писали эту процедуру помоему в 40 командном управлении...
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 27.04.2013, 12:32 | Сообщение # 318 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| Точно! ПисАли же... Пустая моя голова... вот-же этот код Код
;********************************************************************************* ; проверяем длину ИМПУЛЬСА 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
Статус: Offline
| ну вот немного кода накидал
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Суббота, 27.04.2013, 20:17 |
|
| |
uwrtey | Дата: Суббота, 27.04.2013, 20:17 | Сообщение # 320 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| в голове вроде что-то стало раскладываться по полочкам.... ... кодю дальше....
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Суббота, 27.04.2013, 20:48 | Сообщение # 321 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| да в принципе любой вариант хорош.. что вычитанием что сложением..
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 28.04.2013, 00:45 | Сообщение # 322 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| я вплотную подошел к тому, что нужно полученные данные применить к моторам Если я правильно понял, то нужно запустить аппаратный шим и полученные данные вывести в этот шим
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Воскресенье, 28.04.2013, 15:47 | Сообщение # 323 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ну с этим вопросом к Андрею :-) он во вся эксперементирует с моторами :-)
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Среда, 01.05.2013, 22:31 | Сообщение # 324 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| ну для двигателей нужно организовать Phase Correct PWM Mode на два канала OC1A и OC1B
http://www.promelec.ru/pdf/ATTINY2313.pdf стр 106, таблица 46.
максимальное число на каждый мотор ( THR+RUDS ) 1023+512=1535 ( 0b10111111111 ) а это ни два ни полтора! ( шим бывает 8,9 и 10-битный; либо 0-16 битный но задан через ICR1 ) можно было бы выбрать вершину ШИМ в ICR1, но этот регистр занят прерыванием в режиме захвата ( ICP )
хоть прерывание по захвату меняй на прерывание по int0... или нужно как-то организовать условие что бы THR1 и THR2 были равны значению от 0 до 1023 и тогда можно будет использовать 10-ти битный ШИМ
тут мне нужна подсказка...
...
--------------------------------------------- это какой Андрей? Lordddoid ?
Добавлено (01.05.2013, 22:31) --------------------------------------------- хотя есть и еще один вариант - это использование программного ШИМа
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Среда, 01.05.2013, 22:35 |
|
| |
ВитГо | Дата: Четверг, 02.05.2013, 21:24 | Сообщение # 325 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| или ШИМ или BAM
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Пятница, 03.05.2013, 10:08 | Сообщение # 326 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| как ты смотришь на то, что я переделаю прерывание по INT0 ?
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Пятница, 03.05.2013, 13:05 | Сообщение # 327 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| гм.. попробуй
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 04.05.2013, 13:15 | Сообщение # 328 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| ну тогда сделаю резервную копию того что наработал Добавлено (04.05.2013, 13:15) --------------------------------------------- вчера уже начал переделывать, думаю что управление моторами сегодня- завтра доделаю, а как быть с рулевой машинкой пока непонятно там видно будет..
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Суббота, 04.05.2013, 14:49 | Сообщение # 329 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| а что тебя пугает в рулевой машинке ?
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 04.05.2013, 21:27 | Сообщение # 330 |
Генерал-майор
Группа: Администраторы
Сообщений: 3256
Статус: Offline
| Пока ничего, просто у одного таймера настроенного на ШИМ максимум 2 ножки. Обе ножки я задействую для двух моторов. Я еще не задавался вопросом как буду рулевой машинкой управлять. Видимо я полностью полагаюсь на Твою помощь, и мне кажется, что я импровизирую вместо того что-бы в самом начале накидать полный план действий. Хотя в программировании это наверно совсем не допустимо - можно много времени потратить на написание кода, который окажется тупиковым и придется все полностью переделывать....
не успеваю за своими мыслями......
|
|
| |
|