Продолжение предыдущей статьи. Здесь представлена новая программа и рассказано об основных отличиях этой программы от кода показанного в ранее опубликованной статье.
Сначала напомню основные моменты. Предлагаемое устройство должно способствовать облегчению процесса обучения управлению радиоуправляемым самолетом. Само устройство состоит из Arduino Pro Mini ATmega328P (5V, 16MHz). К ардуино подключаются два приемника (учителя и ученика) и электроника самолета (ESC и сервоприводы). Подробное описание соединения компонентов представлено ниже.
Подключение приемника от аппаратуры учителя к ардуино
Arduino --- Receiver
D0 --- CH1 (AIL)
D1 --- CH2 (ELE)
D2 --- CH5 (тумблер)
D3 --- CH3 (THR)
D4 --- CH4 (RUD)
VCC --- VCC
GND --- GND
Подключение приемника от аппаратуры ученика к ардуино
Arduino --- Receiver
A0 --- CH1 (AIL)
A1 --- CH2 (ELE)
A3 --- CH3 (THR)
A4 --- CH4 (RUD)
VCC --- VCC
GND --- GND
Подключение электроники самолета к ардуино
Arduino --- Airplane
D8 --- AIL (сервоприводы элеронов)
D9 --- ELE (сервопривод руля высоты)
D11 --- THR (регулятор электродвигателя)
D12 --- RUD (сервопривод руля направления)
Земля всех компонентов соединяется с землей ардуино. Питание всех компонентов также соединяется с питанием ардуино.
Выше приведен один из возможных вариантов подключения электронных компонентов самолета к ардуино. Всё зависит от конструкции конкретного самолета.
Программа
Программа написана на ассемблере. Как превратить такой код в прошивку я уже рассказывал http://justforduino.blogspot.ru/2014/10/atmel-studio-6.html Про загрузку получившейся прошивки в ардуино тоже уже писал http://justforduino.blogspot.ru/2014/10/arduino.html
Достоинством ассемблерной программы является относительная простота расчета времени выполнения кода. Чтобы оценить время выполнения скетча ардуино необходимо дизассемблировать прошивку созданную Arduino IDE. Это несколько сложнее и менее надежно. Возможны ошибки.
Итак. Программа обновляет порт B (D8, D9, D10, D11, D12, D13) максимум за 17 тактов. Контроллер работает на частоте 16 MHz. Значит за одну микросекунду выполняется 16 тактов. Таким образом программа может изменять длительность управляющих импульсов на плюс минус одну микросекунду (сервоприводы такие колебания не замечают).
((1.0 / 16000000.0) * 17.0 ) * 1000000.0 = 1.0625 us
Управляющие импульсы не выходят за допустимые границы и всегда находятся в пределах от 1000 до 2000 микросекунд.
Между управляющими импульсами должна присутствовать пауза. Её длительность обычно составляет от 18000 до 19000 микросекунд. Не значительные изменения времени паузы никак не проявляются. В представленной программе, в момент переключения управления, возможно изменение длительности паузы от 10000 до 30000 микросекунд. Это ни какого влияния ни на что не оказывает.
Показанная в этой статье программа сильно лучше скетча из прошлой статьи. Она работает довольно быстро и достаточно точно.
Сначала напомню основные моменты. Предлагаемое устройство должно способствовать облегчению процесса обучения управлению радиоуправляемым самолетом. Само устройство состоит из Arduino Pro Mini ATmega328P (5V, 16MHz). К ардуино подключаются два приемника (учителя и ученика) и электроника самолета (ESC и сервоприводы). Подробное описание соединения компонентов представлено ниже.
Подключение приемника от аппаратуры учителя к ардуино
Arduino --- Receiver
D0 --- CH1 (AIL)
D1 --- CH2 (ELE)
D2 --- CH5 (тумблер)
D3 --- CH3 (THR)
D4 --- CH4 (RUD)
VCC --- VCC
GND --- GND
Подключение приемника от аппаратуры ученика к ардуино
Arduino --- Receiver
A0 --- CH1 (AIL)
A1 --- CH2 (ELE)
A3 --- CH3 (THR)
A4 --- CH4 (RUD)
VCC --- VCC
GND --- GND
Подключение электроники самолета к ардуино
Arduino --- Airplane
D8 --- AIL (сервоприводы элеронов)
D9 --- ELE (сервопривод руля высоты)
D11 --- THR (регулятор электродвигателя)
D12 --- RUD (сервопривод руля направления)
Земля всех компонентов соединяется с землей ардуино. Питание всех компонентов также соединяется с питанием ардуино.
Выше приведен один из возможных вариантов подключения электронных компонентов самолета к ардуино. Всё зависит от конструкции конкретного самолета.
Программа
;---------------------------------------------
; Program : Trainer
; Compiler : Atmel Studio
; Chip type : ATmega328P
; System Clock : 16 MHz
; Date :
;---------------------------------------------
.include "m328Pdef.inc"
;---------------------------------------------
; Interrupt vectors
.cseg
.org 0x0000 ; Reset
jmp RESET
.org 0x0002 ; External Interrupt Request 0
reti
.org 0x0004 ; External Interrupt Request 1
reti
.org 0x0006 ; Pin Change Interrupt Request 0
reti
.org 0x0008 ; Pin Change Interrupt Request 1
reti
.org 0x000A ; Pin Change Interrupt Request 2
reti
.org 0x000C ; Watchdog Time-out Interrupt
reti
.org 0x000E ; Timer/Counter 2 Compare Match A
reti
.org 0x0010 ; Timer/Counter 2 Compare Match B
reti
.org 0x0012 ; Timer/Counter 2 Overflow
reti
.org 0x0014 ; Timer/Counter 1 Capture Event
reti
.org 0x0016 ; Timer/Counter 1 Compare Match A
reti
.org 0x0018 ; Timer/Counter 1 Compare Match B
reti
.org 0x001A ; Timer/Counter 1 Overflow
reti
.org 0x001C ; Timer/Counter 0 Compare Match A
reti
.org 0x001E ; Timer/Counter 0 Compare Match B
reti
.org 0x0020 ; Timer/Counter 0 Overflow
reti
.org 0x0022 ; SPI Serial Transfer Complete
reti
.org 0x0024 ; USART, Rx Complete
reti
.org 0x0026 ; USART, UDR Empty
reti
.org 0x0028 ; USART, Tx Complete
reti
.org 0x002A ; ADC Conversion Complete
reti
.org 0x002C ; EEPROM Ready
reti
.org 0x002E ; Analog Comparator
reti
.org 0x0030 ; Two-wire Serial Interface
reti
.org 0x0032 ; Store Program Memory Read
reti
.org INT_VECTORS_SIZE
;---------------------------------------------
RESET:
;---------------------------------------------
; Steck initialization
ldi R16, Low(RAMEND)
out SPL, R16
ldi R16, High(RAMEND)
out SPH, R16
;---------------------------------------------
; USART
ldi R16, 0
sts UBRR0H, R16
sts UBRR0L, R16
sts UCSR0A, R16
sts UCSR0B, R16
sts UCSR0C, R16
;---------------------------------------------
; Input/Output ports
ldi R16, 0b00000000
out PORTB, R16
ldi R16, 0b00111111
out DDRB, R16
ldi R16, 0b00000000
out PORTC, R16
ldi R16, 0b00000000
out DDRC, R16
ldi R16, 0b00000000
out PORTD, R16
ldi R16, 0b00000000
out DDRD, R16
;---------------------------------------------
; Timer/Counter 2
ldi R16, 0
sts TCNT2, R16
; COM2A1 COM2A0 COM2B1 COM2B0 - - WGM21 WGM20
ldi R16, 0
sts TCCR2A, R16
; FOC2A FOC2B - - WGM22 CS22 CS21 CS20
ldi R16, ((1<<CS22)|(1<<CS21))
sts TCCR2B, R16
; - - - - - OCIE2B OCIE2A TOIE2
ldi R16, 0
sts TIMSK2, R16
; - - - - - OCF2B OCF2A TOV2
ldi R16, 0
sts TIFR2, R16
;---------------------------------------------
eor R16, R16
eor R17, R17
eor R18, R18
eor R19, R19
eor R20, R20
eor R21, R21
eor R22, R22
;---------------------------------------------
; Global interrupt disable
cli
;---------------------------------------------
; main
main:
cpi R17, 94
brsh l_01 ; R17 >= 94
cpi R18, 1
brne l_02 ; R18 != 1
in R19, PIND
out PORTB, R19
sbic PIND, 2 ; (PIND & 0b00000100) == 0
rjmp l_03
cpi R20, 1
brne main ; R20 != 1
lds R17, TCNT2
ldi R20, 0
rjmp main
l_03:
cpi R20, 0
brne main ; R20 != 0
sts TCNT2, R16
ldi R20, 1
rjmp main
l_02:
cpi R18, 2
brne l_04 ; R18 != 2
in R19, PINC
out PORTB, R19
andi R19, 0b00011011
brne main ; R19 != 0
ldi R18, 0
rcall delay ; delay
rjmp main
l_04:
in R19, PIND
andi R19, 0b00011011
brne main ; R19 != 0
ldi R18, 1
rjmp main
l_01:
cpi R18, 2
brne l_05 ; R18 != 2
in R19, PINC
out PORTB, R19
sbic PIND, 2 ; (PIND & 0b00000100) == 0
rjmp l_06
cpi R20, 1
brne main ; R20 != 1
lds R17, TCNT2
ldi R20, 0
rjmp main
l_06:
cpi R20, 0
brne main ; R20 != 0
sts TCNT2, R16
ldi R20, 1
rjmp main
l_05:
cpi R18, 1
brne l_07 ; R18 != 1
in R19, PIND
out PORTB, R19
andi R19, 0b00011011
brne main ; R19 != 0
ldi R18, 0
rcall delay ; delay
rjmp main
l_07:
in R19, PINC
andi R19, 0b00011011
brne main ; R19 != 0
ldi R18, 2
rjmp main
;---------------------------------------------
; wait 10 ms
delay:
ldi R21, 0x40 ; Low byte
ldi R22, 0x9C ; High byte
l_10:
subi R21, 1
sbci R22, 0
brcc l_10
ret
;---------------------------------------------
Программа написана на ассемблере. Как превратить такой код в прошивку я уже рассказывал http://justforduino.blogspot.ru/2014/10/atmel-studio-6.html Про загрузку получившейся прошивки в ардуино тоже уже писал http://justforduino.blogspot.ru/2014/10/arduino.html
Достоинством ассемблерной программы является относительная простота расчета времени выполнения кода. Чтобы оценить время выполнения скетча ардуино необходимо дизассемблировать прошивку созданную Arduino IDE. Это несколько сложнее и менее надежно. Возможны ошибки.
Итак. Программа обновляет порт B (D8, D9, D10, D11, D12, D13) максимум за 17 тактов. Контроллер работает на частоте 16 MHz. Значит за одну микросекунду выполняется 16 тактов. Таким образом программа может изменять длительность управляющих импульсов на плюс минус одну микросекунду (сервоприводы такие колебания не замечают).
((1.0 / 16000000.0) * 17.0 ) * 1000000.0 = 1.0625 us
Управляющие импульсы не выходят за допустимые границы и всегда находятся в пределах от 1000 до 2000 микросекунд.
Между управляющими импульсами должна присутствовать пауза. Её длительность обычно составляет от 18000 до 19000 микросекунд. Не значительные изменения времени паузы никак не проявляются. В представленной программе, в момент переключения управления, возможно изменение длительности паузы от 10000 до 30000 микросекунд. Это ни какого влияния ни на что не оказывает.
Показанная в этой статье программа сильно лучше скетча из прошлой статьи. Она работает довольно быстро и достаточно точно.
Комментариев нет:
Отправить комментарий