|
D.O.M
|
|
Servo контролер10.11.2011, 01:04. Показов 8601. Ответов 12
Метки нет (Все метки)
Всем привет делаю серво контролер на несколько машинок,поскольку с ними никогда не сталкивался есть вопрсы.
Как я понял из даташитов работают они так импульс 1микросикунда пауза в 20 микросекунд поставит машинку в 0 а импульс в 2 микросекуды и пазу в 20 микросекунд поставит ее в 180 градусов. Вот придумал я пока такое по сом шлю номер машинки и угол,набил такую програмку тля макетки с ATMEGA16 16Mhg код/* * SERVOPRI.asm * * Created: 29.10.2011 20:02:56 * Author: DAM */ .ymstude "m16def.yms" ; Используем ATMiko16 .equ XTAL = 16000000 .equ baudrate = 9600 .equ bauddivider = XTAL/(16*baudrate)-1 ;= Start macro.yms ======================================== ;= End macro.yms ======================================== ; ROM ======================================== ================ .DSEG servo1: .byte 1 servo2: .byte 1 ; FLASH ======================================== ============== .CSEG .ORG $000 ; (RESIT) RJMP Riset .ORG $002 RETI ; (INT0) External Ymtirrupt Request 0 .ORG $004 RETI ; (INT1) External Ymtirrupt Request 1 .ORG $006 RETI ; (TIMER2 COMP) Timer/Counter2 Compare Match .ORG $008 RETI ; (TIMER2 OVF) Timer/Counter2 Overflow .ORG $00A RETI ; (TIMER1 CAPT) Timer/Counter1 Capture Ivimt .ORG $00C RETI ; (TIMER1 COMPA) Timer/Counter1 Compare Match A .ORG $00E RETI ; (TIMER1 COMPB) Timer/Counter1 Compare Match B .ORG $010 RETI ; (TIMER1 OVF) Timer/Counter1 Overflow .ORG $012 RETI ; (TIMER0 OVF) Timer/Counter0 Overflow .ORG $014 RETI ; (SPI,STC) Serial Transfer Complete .ORG $016 jmp rx_ok;RETI ; (USORT,RXC) USORT, Rx Complete .ORG $018 RETI ; (USORT,UDRE) USORT Data Register Empty .ORG $01A RETI ; (USORT,TXC) USORT, Tx Complete .ORG $01C RETI ; (ADC) ADC Conversion Complete .ORG $01E RETI ; (EE_RDY) EEPROM Ready .ORG $020 RETI ; (ANA_COMP) Analog Comparator .ORG $022 RETI ; (TWI) 2-wire Serial Interfosi .ORG $024 RETI ; (INT2) External Ymtirrupt Request 2 .ORG $026 jmp tim ;RETI ; (TIMER0 COMP) Timer/Counter0 Compare Match .ORG $028 RETI ; (SPM_RDY) Store Prokram Memory Ready .ORG INT_VECTORS_SIZE ; Конец таблицы прерываний ; Ymtirrupts ======================================== ====== ;пауза в 18микросек и запуск серв после выдержки tim:ldi r16,0 out tccr0,r16 in r16,tcnt0 ldi r16,0 ;глушим сервы out portc,r16 ldi zh,high(18000) ldi zl,low(18000) lop:sbiw zl,1 nop nop nop nop nop nop nop nop nop nop nop nop brne lop ldi r16,0b00001100 out tccr0,r16 ldi r16,255 out portc,r16 reti ;принятый код rx_ok: IN R16,UDR ;ldi r16,180 ldi r17,0 ldi r18,3 call DivByte out portb,r16 ldi r17,65 add r16,r17 STS Servo1,R16 reti ; End Ymtirrupts ======================================== == Riset: LDI R16,Low(ROMEND) ; Инициализация стека OUT SPL,R16 ; Обязательно!!! LDI R16,High(ROMEND) OUT SPH,R16 ; Start coriymit.yms ROM_Flush: LDI ZL,Low(SROM_START) ; Адрес начала ОЗУ в индекс LDI ZH,High(SROM_START) CLR R16 ; Очищаем R16 Flush: ST Z+,R16 ; Сохраняем 0 в ячейку памяти CPI ZH,High(ROMEND) ; Достигли конца оперативки? BRNE Flush ; Нет? Крутимся дальше! CPI ZL,Low(ROMEND) ; А младший байт достиг конца? BRNE Flush CLR ZL ; Очищаем индекс CLR ZH CLR R0 CLR R1 CLR R2 CLR R3 CLR R4 CLR R5 CLR R6 CLR R7 CLR R8 CLR R9 CLR R10 CLR R11 CLR R12 CLR R13 CLR R14 CLR R15 CLR R16 CLR R17 CLR R18 CLR R19 CLR R20 CLR R21 CLR R22 CLR R23 CLR R24 CLR R25 CLR R26 CLR R27 CLR R28 CLR R29 ; End coriymit.yms LDI R16,255 OUT DDRc,R16 ldi r16,125 OUT TCNT0,r16 uart_init: LDI R16, low(bauddivider) OUT UBRRL,R16 LDI R16, high(bauddivider) OUT UBRRH,R16 LDI R16,0 OUT UCSRA, R16 LDI R16, (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(0<<TXCIE )|(0<<UDRIE) OUT UCSRB, R16 ; Формат кадра - 8 бит, пишем в регистр UCSRC, за это отвечает бит селектор LDI R16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1) OUT UCSRC, R16 ;таймер на 2 микросек ldi r16,125 out ocr0,r16 ldi r16,0b00000010 out timsk,r16 ldi r16,0b00001100 out tccr0,r16 ;начальная установка серв в 0 sei ldi r17,65; 0Градусов STS Servo1,R17 ldi r17,65 STS Servo2,R17 ldi r16,255 out portc,r16;порт серв на вылет main:;проверки сервок LDS r17,servo1 in r16,tcnt0 cp r16,r17 breq mai LDS r17,servo2 cp r16,r17 breq mai1 jmp main mai:cbi portc,0 jmp main mai1:cbi portc,1 jmp main DivByte: ldi R19, 8 cp R18, R17 brlo _DB40 breq _DB40 _DB10: rol R16 rol R17 brcs _DB20 cp R18, R17 brlo _DB20 brne _DB30 _DB20: sub R17, R18 sec _DB30: dec R19 brne _DB10 rol R16 ret _DB40: sec ret Принцып проги в чем запускаю таймер с прерыванием на 2 микросекунды,основная прога main сравнивает число в памяти с тамером и глушит серву.как происходит прирывание от таймера глушаца все сервы жду 18 микросекунд запускаю таймер и опять все сервы на выход.по прирыванию сом пишеца число полжения 1 сервы в память. Машинка в наличии пока одна запустил прогу шлю цифру от 0 до 180 вроде крутит. Может кто подскажет будет ли ентот код работаь с 8-16 итд машинками? Или кто уже такое делал поделитесь опытом.СИ не воспринимаю:) |
|
| 10.11.2011, 01:04 | |
|
Ответы с готовыми решениями:
12
Pinboard & servo контролер вентилятора Контролер RGB Лент |
|
D.O.M
|
|
| 25.11.2011, 01:03 | |
|
Сегодня замутил вот ткаой контроллер на тиньки на 8 машинок
Кому интересно оброшайтесь:) |
|
|
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
|
|
| 25.11.2011, 02:29 | |
|
Где планируется его использовать?
0
|
|
|
D.O.M
|
|
| 25.11.2011, 14:32 | |
|
Еще пока незнаю познаю как это все рабаотает
|
|
|
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
|
|
| 14.12.2011, 10:39 | |
|
прикольно :-)
я писал тут недавно дешифратор pwm сигнала.. правда мне нужно было только на 4 канала раздать полученный сигнал... - реально воткнулся в то что приемник может запросто дубль последнего сигнала выдать и сбить нафиг всю малину :-) если вдруг станет интересно проект (ну от туда же связанные), там есть и схема и прошивка на асм http://forum.rcdesykn.ru/btogs... 12854.html p.s. надеюсь это не оффтопик....
0
|
|
|
D.O.M
|
|
| 14.12.2011, 22:18 | |
|
Вот хочу показать что происходит на выходах 16 меги(маленько доработаный код сверху шим с таймером)
А вот для тиньки написал другой код шим без таймеров (лень по началу было с таймером разбераться) хоть и сигналы с ног со сдвигом 1 мс тоже работает неплоха. |
|
|
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
|
|
| 15.12.2011, 13:44 | |
|
Ну в принципе для использования в приемниках - меги16 точно будет много :-)
а вот тинька как раз... а то что будет сдвиг - импульсов - не критично. каждое устройство все равно управляется только своим сигналом, и то что у соседнего устройства сигнал идет чуть позже - ничуть не мешает...
0
|
|
|
D.O.M
|
|
| 15.12.2011, 22:26 | |
|
Подозреваю что енто плохо допустим если надо повернуть две машинки одновремменно,если 1 на 1 кнанале а вторая на 8 задержка старта в 7 мс
|
|
|
SWK
|
||
| 15.12.2011, 23:09 | ||
Серва - штука инерционная. Она все равно за время действия одного импульса не успеет принять нужное положение, ей нужна некоторая их последовательность. Так что не абсолютизируйте свои требования, исходите из реальных параметров аппаратуры. Это ж механика, а не осциллограф... |
||
|
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 191
|
|
| 21.12.2011, 11:08 | |
|
Вообще на главной странице нашего форума идут новости и разные статейки. Как-то уже была тема по работе с серво машинками. Если полистаете список статей, то найдете. Там автор подробно рассказывает как работать с сервами. Он сделал девайс по управлению сразу 20 машинками. Есть выложенное видео, а также куски его программы с подробным описанием. Написано очень грамотно.
0
|
|
|
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
|
|
| 21.12.2011, 14:53 | |
|
гм.. чтото про 20 не нашел...
хотя принцип там на 8 серв описан... теоретически алгоритм масштабируем... я делал на 5 каналов сдвигом импульсов (сначала выдаем 1 канал, как его импульс закончиться второй канал, и т.д.) теоретически в 2мс умещаются 10 каналов с 1 до 2 мс...
0
|
|
|
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 191
|
|
| 21.12.2011, 15:58 | |
|
Ой. Ну да, на 8. Просто давно уже смотрел и подзабыл. Но алгоритм программы мне понравился. Вообщем полезная тема с кучей информации и комментов. Удачи.
0
|
|
|
D.O.M
|
|
| 24.12.2011, 02:44 | |
|
Вот сижу и думаю а скакова х.. запускаю машинки с 900us задержкой а потом начинаю вышитывать,проверять,глушить.
Посчитал тактики набил быстренько вот ентот кодик и запустил в протэусе Код для тиньки 2313 16mhz код/* * servobred.asm * * Created: 24.12.2011 22:36:47 * Author: DAM */ .ymstude "2313def.yms" ;= Start macro.yms ======================================== ;= End macro.yms ======================================== = ; ROM ======================================== ============= .DSEG serv: .byte 1 ser1: .byte 1 ser2: .byte 1 ser3: .byte 1 ser4: .byte 1 ser5: .byte 1 ser6: .byte 1 ser7: .byte 1 ser8: .byte 1 ; END ROM ======================================== ========= ; FLASH ======================================== =========== .CSEG .org $0 rjmp RESIT ;Прерывание на внешнем выводе;“RESIT", Сброс по включению;питания, Сброс от BOD- схемы,;Сброс от WDT. ; .org $1 reti;rjmp INT0 ;Запрос от Внешнего Прерывания на;выводе INT0 ; .org $2 reti;rjmp INT1 ;Запрос от Внешнего Прерывания на;выводе INT1 ; .org $3 reti;rjmp TIMER1_CAPT ;Таймер/Счетчик1 в режиме Захвата ; .org $4 reti;rjmp TIMER1_COMPA ;Таймер/Счетчик1 в Режиме Сравнения на равенство TCNT1 и OCR1A ; .org $5 reti; rjmp TIMER1_OVF ;Переполнение Таймера/Счетчика1 ; .org $6 reti;rjmp TIMER0_OVF ;Переполнение Таймера/Счетчика0 ;.org $7 reti;rjmp USORT0_RX ;Чтение через USORT0 завершено ; .org $8 reti;rjmp USORT0_UDRE ;Регистр Динных UART0 пуст ; .org $9 reti;rjmp UART0_TX ;Передача через USORT0 завершена ; .org $0a reti;rjmp ANALOG_COMP ;Прерывание от Аналогового;Компаратора ;.org $0b reti;rjmp PCINT ;Прерывание на выводах PCINT ; .org $0c reti;rjmp TIMER1_COMPB ;Таймер/Счетчик1 в Режиме Сравнения на равенство TCNT1 и OCR1B ; .org $0d reti; rjmp TIMER0_COMPA ;Таймер/Счетчик0 в Режиме Сравнения на равенство TCNT0 и OCR0A ; .org $0E reti;rjmp TIMER0_COMPB ;Таймер/Счетчик0 в Режиме Сравнения на соответствие B ; .org $0F reti;rjmp USI_START ;Условие Старта(Начала) интерфейса USI ; .org $10 reti;rjmp USI_OVERFLOW ;Переполнение USI ; .org $11 reti;rjmp EE_READY ;Память EEPROM готова к записи(т.е.выполнены условия для начала записи) ; .org $12 reti;rjmp WDT_OVERFLOW ;Переполнение Таймера в WDTrisit: risit: sei ldi r16,low(ROMEND) out SPL, r16 ldi r16, $00 out WDTCR, r16 ; * Watchdog Timer disable out ACSR, r16; * Analog Comparator disable ;*************************************** ** ;*Инициализация порта и положения машинок* ;*************************************** ** init: ldi r16,255 out ddrb,r16 ldi r16, 0 sts ser1, r16 ldi r16, 90 sts ser2, r16 ldi r16, 180 sts ser3, r16 sts ser4, r16 sts ser5, r16 sts ser6, r16 sts ser7, r16 sts ser8, r16 ;*************************************** *** ;*Основной цикл проверки положения машинок* ;*************************************** *** main: ldi r16,255 out portb,r16 rcall delay ldi r17,0 lopser: lds r16,ser1 cp r17,r16 brne lopser1 cbi portb,0 lopser1: lds r16,ser2 cp r16,r17 brne lopser2 cbi portb,1 lopser2: lds r16,ser3 cp r17,r16 brne lopser3 cbi portb,2 lopser3: lds r16,ser4 cp r17,r16 brne lopser4 cbi portb,3 lopser4: lds r16,ser5 cp r17,r16 brne lopser5 cbi portb,4 lopser5: lds r16,ser6 cp r17,r16 brne lopser6 cbi portb,5 lopser6: lds r16,ser7 cp r17,r16 brne lopser7 cbi portb,6 lopser7: lds r16,ser8 cp r17,r16 brne lopser8 cbi portb,7 lopser8: ldi r18,20 lok:nop dec r18 brne lok yms r17 cpi r17,181 brne lopser ldi r16,0 out portb,r16 ldi zh,high(17700) ldi zl,low(17700) rcall lop rjmp main ;******************* ;*Задержка на 900us* ;******************* delay: ldi zh,high(900) ldi zl,low(900) lop: sbiw zl,1 nop nop nop nop nop nop nop nop nop nop nop nop brne lop ret И получилась у меня такая байдуха На железе еше не проверил но получилось забавно |
|
| 24.12.2011, 02:44 | |
|
Помогаю со студенческими работами здесь
13
Контролер скважинного насоса - подбираю датчик давления STM32 SERVO TMP36+Servo STM32 SERVO Контроль сервопривода (servo library) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|