В этой статья рассказывается об устройстве, которое можно подключить вместо сервопривода или параллельно с сервоприводом к тестеру, приемнику и пр. Это приспособление будет измерять длительность управляющего импульса, а результат измерения будет отображаться на ЖК экранчике.
Прежде всего, нужно сказать несколько слов о том, как осуществляется управление сервоприводами. Всё просто. На управляющей линии сервопривода устанавливается логическая единица. Через некоторое время логическая единица сменяется логическим нолем. Ещё через какое то время логический ноль сменяется логической единицей. А затем логическую единицу опять сменяет логический ноль. И так снова и снова. Именно продолжительность присутствия логической единицы является определяющей. Обычно этот временной интервал находится в пределах от 1000 до 2000 микросекунд. А общее время присутствия на линии логической единицы и следующего за ней логического ноля составляет около 20 миллисекунд. Иначе говоря, частота управляющих импульсов равна 50 Гц. На графике представленном ниже отображен один период этого управляющего сигнала.
Прибор, которому посвящена эта статья, измеряет время в течении которого на управляющей линии присутствует логическая единица.
Сделано устройство на основе Arduino Nano (ATmega168).
Помимо ардуино необходим ЖК экран. Я использовал весьма распространенный символьный экранчик WH1602 (KS0066).
Для управления контрастом экрана я использовал ардуино модуль с переменным резистором.
Подключается всё согласно приведенным ниже инструкциям.
Arduino Nano --- LCD
GND --- VSS (1)
5V --- VDD (2)
D8 --- RS (4)
D9 --- RW (5)
D10 --- E (6)
D0 (RX) --- D0 (7)
D1 (TX) --- D1 (8)
D2 --- D2 (9)
D3 --- D3 (10)
D4 --- D4 (11)
D5 --- D5 (12)
D6 --- D6 (13)
D7 --- D7 (14)
Variable Resistor --- LCD
S --- V0 (3)
Arduino Nano --- Variable Resistor
5V --- +
GND --- -
Приведу пример подключения этого измерительного устройства к приемнику.
Arduino Nano --- Receiver
A0 --- CH1
5V --- VCC
GND --- GND
В этом примере мое устройство получает питание от приемника. А на приемник ток подается с ESC. Стабилизатор ESC должен давать 5 вольт. Не помешает это проверить прежде, чем подключать приемник к ESC.
Программа написана на ассемблере в Atmel Studio.
Готовая прошивка для Arduino Nano (ATmega168) https://yadi.sk/d/T39TlbFsdHWKa
Загружать прошивку в ардуино нужно до подключения экранчика. Иначе ничего не получится. Экранчик будет мешать записи программы в микроконтроллер ардуино.
Прежде всего, нужно сказать несколько слов о том, как осуществляется управление сервоприводами. Всё просто. На управляющей линии сервопривода устанавливается логическая единица. Через некоторое время логическая единица сменяется логическим нолем. Ещё через какое то время логический ноль сменяется логической единицей. А затем логическую единицу опять сменяет логический ноль. И так снова и снова. Именно продолжительность присутствия логической единицы является определяющей. Обычно этот временной интервал находится в пределах от 1000 до 2000 микросекунд. А общее время присутствия на линии логической единицы и следующего за ней логического ноля составляет около 20 миллисекунд. Иначе говоря, частота управляющих импульсов равна 50 Гц. На графике представленном ниже отображен один период этого управляющего сигнала.
Прибор, которому посвящена эта статья, измеряет время в течении которого на управляющей линии присутствует логическая единица.
Сделано устройство на основе Arduino Nano (ATmega168).
Помимо ардуино необходим ЖК экран. Я использовал весьма распространенный символьный экранчик WH1602 (KS0066).
Для управления контрастом экрана я использовал ардуино модуль с переменным резистором.
Подключается всё согласно приведенным ниже инструкциям.
Arduino Nano --- LCD
GND --- VSS (1)
5V --- VDD (2)
D8 --- RS (4)
D9 --- RW (5)
D10 --- E (6)
D0 (RX) --- D0 (7)
D1 (TX) --- D1 (8)
D2 --- D2 (9)
D3 --- D3 (10)
D4 --- D4 (11)
D5 --- D5 (12)
D6 --- D6 (13)
D7 --- D7 (14)
Variable Resistor --- LCD
S --- V0 (3)
Arduino Nano --- Variable Resistor
5V --- +
GND --- -
Приведу пример подключения этого измерительного устройства к приемнику.
Arduino Nano --- Receiver
A0 --- CH1
5V --- VCC
GND --- GND
В этом примере мое устройство получает питание от приемника. А на приемник ток подается с ESC. Стабилизатор ESC должен давать 5 вольт. Не помешает это проверить прежде, чем подключать приемник к ESC.
Программа написана на ассемблере в Atmel Studio.
;--------------------------------------------- ; Program : Tester ; Compiler : AVR Studio ; Chip type : ATmega168 ; System Clock : 16 MHz ; Date : ;--------------------------------------------- .include "m168def.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 ;--------------------------------------------- ; Timer/Counter 1 ldi R16, 0 sts TCNT1H, R16 sts TCNT1L, R16 sts TCCR1A, R16 sts TCCR1B, R16 sts TCCR1C, R16 sts TIMSK1, R16 out TIFR1, R16 ;--------------------------------------------- ; Input/Output Ports ldi R16, 0b00000000 out PORTB, R16 ldi R16, 0b00000000 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 ;--------------------------------------------- ; LCD initialization ldi R16, 0b11111111 out DDRD, R16 ldi R16, 0b11111111 out PORTD, R16 sbi DDRB, 0 sbi DDRB, 1 sbi DDRB, 2 sbi PORTB, 0 sbi PORTB, 1 sbi PORTB, 2 cbi PORTB, 1 rcall delay_40_ms ldi R16, 0b00111000 rcall LcdWriteCom ldi R16, 0b00001100 rcall LcdWriteCom rcall LcdClear ldi R16, 0b00000110 rcall LcdWriteCom ;--------------------------------------------- ; Global interrupt disable cli ;--------------------------------------------- ; main main: ldi R16, 0 sts TCNT1H, R16 sts TCNT1L, R16 l_1: sbis PINC, 0 rjmp l_1 ldi R16, (1<<CS11) sts TCCR1B, R16 l_2: sbic PINC, 0 rjmp l_2 ldi R16, 0 sts TCCR1B, R16 lds R17, TCNT1L lds R18, TCNT1H ; Divide R18:R17 by two lsr R18 ror R17 ; 1000 ldi R20, 0x03 ; High Byte ldi R19, 0xE8 ; Low Byte rcall divide cpi R16, 0 ; Compare R16 to 0 breq l_3 ; Branch if R16 == 0 mov R21, R16 ; Copy R16 to R21 ldi R16, '0' ; Load '0' to R16 add R21, R16 ; Add R16 to R21 (R21=R21+R16) rjmp l_4 l_3: ldi R21, ' ' ; Load ' ' to R21 l_4: ; 100 ldi R20, 0x00 ; High Byte ldi R19, 0x64 ; Low Byte rcall divide mov R22, R16 ; Copy R16 to R22 ldi R16, '0' ; Load '0' to R16 add R22, R16 ; Add R16 to R22 (R22=R22+R16) ; 10 ldi R20, 0x00 ; High Byte ldi R19, 0x0A ; Low Byte rcall divide mov R23, R16 ; Copy R16 to R23 ldi R16, '0' ; Load '0' to R16 add R23, R16 ; Add R16 to R23 (R23=R23+R16) mov R24, R17 ; Copy R17 to R24 ldi R16, '0' ; Load '0' to R16 add R24, R16 ; Add R16 to R24 (R24=R24+R16) rcall LcdClear mov R16, R21 ; Copy R21 to R16 rcall LcdWriteData mov R16, R22 ; Copy R22 to R16 rcall LcdWriteData mov R16, R23 ; Copy R23 to R16 rcall LcdWriteData mov R16, R24 ; Copy R24 to R16 rcall LcdWriteData rjmp main ;--------------------------------------------- ; divide divide: clr R16 ; Clear R16 l_00: ; Compare R18:R17 with R20:R19 cp R17, R19 ; Compare low byte cpc R18, R20 ; Compare high byte brlo l_01 ; Branch if R18:R17 < R20:R19 (unsigned) ; Subtract R20:R19 from R18:R17 sub R17, R19 ; Subtract low byte sbc R18, R20 ; Subtract high byte inc R16 ; Increment R16 rjmp l_00 l_01: ret ;--------------------------------------------- ; 40 ms delay_40_ms: ldi R16, 0x00 ; Low byte ldi R17, 0xF4 ; Middle byte ldi R18, 0x01 ; High byte l_10: subi R16, 1 sbci R17, 0 sbci R18, 0 brcc l_10 ret ;--------------------------------------------- ; 2 ms delay_2_ms: ldi R16, 0x40 ; Low byte ldi R17, 0x1F ; High byte l_20: subi R16, 1 sbci R17, 0 brcc l_20 ret ;--------------------------------------------- ; 2 us delay_2_us: ldi R16, 11 l_30: subi R16, 1 brcc l_30 ret ;--------------------------------------------- ; 40 us delay_40_us: ldi R16, 214 l_40: subi R16, 1 brcc l_40 ret ;--------------------------------------------- ; Lcd Write Com LcdWriteCom: cbi PORTB, 0 ; Clear RC out PORTD, R16 sbi PORTB, 2 ; Set E rcall delay_2_us cbi PORTB, 2 ; Clear E rcall delay_40_us ret ;--------------------------------------------- ; Lcd Write Data LcdWriteData: sbi PORTB, 0 ; Set RC out PORTD, R16 sbi PORTB, 2 ; Set E rcall delay_2_us cbi PORTB, 2 ; Clear E rcall delay_40_us ret ;--------------------------------------------- ; Lcd Clear LcdClear: ldi R16, 0b00000001 rcall LcdWriteCom rcall delay_2_ms ret ;---------------------------------------------
Готовая прошивка для Arduino Nano (ATmega168) https://yadi.sk/d/T39TlbFsdHWKa
Загружать прошивку в ардуино нужно до подключения экранчика. Иначе ничего не получится. Экранчик будет мешать записи программы в микроконтроллер ардуино.
Комментариев нет:
Отправить комментарий