Контроллер XY плотера на 16f73
|
|
buller |
Дата: Вс, 28.07.2013, 10:28 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 07.10.2011
Статус:
Offline
|
Всем привет! Не так давно я заинтересовался 3D принтерами, но так как такой принтер пока слишком дорогой для меня, решил начать с чего-то простого. Был куплен старый матричный принтер Epson LX 1050 формата печати A3. Идея такого плоттера в том что вместо головки с иглами там будет обычный карандаш или фломастер, перемещение которого будет контролировать соленоид или сервомотор. Управляет всем этим контроллер через параллельный порт получает команды с компьютера, на котором будет или Mach3 или Linux CNC. Собственно команды компьютера сводятся к простым сигналам Step / DIR. Для этих целей было сделано 3 платы: опторозвязка LPT порта, плата контроллера и плата с силовыми ключами (принципиальные схемы и печатные платы которых я могу выложить если будут желающие). Теперь самое интересное. Команды из компьютера идут с частотой 25кГц, т.е. через каждые 40 мкС. PIC имеет кварц на 20 МГц что позволяет ему выполнять команду по 200нс (т.е. если писать на PICBasic то его команда не займет более 1мкс). Мне кажется что этого более чем достаточно для написания программы.
Описание пинов
Обмотки двигателя каретки (Carriadge) A0-- A A1-- B A2-- C A3-- D C1-- M1Vcc-- питание на центральную обмотку двигателя
Обмотки двигателя подачи бумаги (Feed) C3--A C4--B C5--C C6--D C2-- M2Vcc-- питание на центральную обмотку двигателя
C0-- серво или соленоид
Весь PORTB подключен к LPT порту, но испльзуется только 5 пинов. B0--FEED DIR B1-- CARRIADGE DIR B4--FEED STEP B5--CARRIADGE STEP B6-- PEN
C1 и С2 специально подключены именно к этим ножкам, так как на них есть аппаратный шим, который должен включаться в режиме удержания.
На данный момент у меня получилось крутить моторами в обе стороны на полном или половинном шаге. В прикрепленных файлах схема для симуляции в Протеус и код программы.
|
|
|
|
MiXaS |
Дата: Вс, 28.07.2013, 20:44 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
а в чем вопрос?
|
|
|
|
buller |
Дата: Вс, 28.07.2013, 23:40 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 07.10.2011
Статус:
Offline
|
Проблема в том что я не знаю как написать то кусок программы который будет отвечать за обработку сигналов приходящих из параллельного порта, как програмно определить спадающий фронт
Сообщение отредактировал
buller - Вс, 28.07.2013, 23:43
|
|
|
|
ADMIN |
Дата: Пн, 29.07.2013, 07:20 | Сообщение # 4 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
нужно использовать прерывания по входу INT
|
|
|
|
buller |
Дата: Пн, 29.07.2013, 09:09 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 07.10.2011
Статус:
Offline
|
Цитата (ADMIN) нужно использовать прерывания по входу INT Проблема в том, что из прерывания по B0 это сделать не получится, так как на порт приходят 3 независимых друг от друга синхро сигналы. Допустим нам нужно сместить каретку, не двигая бумагу, тогда получится что импульсы будут идти только на B5 - CARRIADGE STEP. То есть для реализации по такой схеме нам нужно 3 выводы с прерыванием, которые могут независимо друг от друга детектировать фронт сигнала. Единственным вариантом является сделать это через изменение по Б4-B7, но как определять ниспадающий или нарастающий фронт?
|
|
|
|
MiXaS |
Дата: Пн, 29.07.2013, 10:22 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата (buller) Единственным вариантом является сделать это через изменение по Б4-B7, но как определять ниспадающий или нарастающий фронт?
Как написано в шите: сигнал сравнивается с последним чтением порта. Можно попробовать в подпрограмме прерывания следить за сигналом. Например.
Метка_прерывания:
ЗАПРЕТ ВСЕХ ПРЕРЫВАНИЙ
IF RBIF = 1 THEN ЗДЕСЬ ОТСЛЕЖИВАЕТЕ СОСТОЯНИЕ ВХОДОВ RB4-RB7 ENDIF
СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ
Context Restore
|
|
|
|
ADMIN |
Дата: Вт, 30.07.2013, 03:37 | Сообщение # 7 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Цитата (buller) Единственным вариантом является сделать это через изменение по Б4-B7, но как определять ниспадающий или нарастающий фронт? Это не единственный вариант. Если вы знаете, вход INT позволяет настроить прерывание либо по фронту, либо по спаду. Посмотрите эту статью. Возможно, что-то станет ясно.
|
|
|
|
MiXaS |
Дата: Вт, 30.07.2013, 12:58 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата (ADMIN) Посмотрите эту статью. Возможно, что-то станет ясно.
Думаю это самый лучший вариант, так как INT имеет более гибкие настройки. Но усложняется схемотехника.
|
|
|
|
DAY |
Дата: Вт, 30.07.2013, 16:40 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
21
Замечания:
±
На сайте с 09.03.2011
Статус:
Offline
|
Полный шагСпойлер'-------------------------- Описание проекта --------------------------------- 'Проект : StepDir_controller 'Автор : DAY ' 'Версия : 1.0.0 от 26.01.2013 ' '-------------------------- Опции компилятора -------------------------------- DECLARE SHOW_SYSTEM_VARIABLES = OFF ' При симуляции в Proteus не показывать внутренние переменные DECLARE FSR_CONTEXT_SAVE = ON ' Не заботиться о сохранении содержимого регистра FSR DECLARE REMINDERS = OFF ' Выключить напоминания компилятора DECLARE WARNINGS = ON ' Выключить предупреждения компилятора DECLARE OPTIMISER_LEVEL 2 ' Выключить оптимизацию программы DECLARE BOOTLOADER = OFF ' Выключить загрузчик ;-------------------------- Общие настройки------------------------------------ DEVICE = 12F675 ' Используемый микроконтроллер XTAL = 4 ' Частота осциллятора 4 МГц
CONFIG WDT_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT '-------------------------- Настройки портов --------------------------------- DECLARE ALL_DIGITAL = ON ' Каждый порт выполняет свою функцию по умолчанию '-------------------------- Регистры специального назначения------------------- DIM X AS BYTE DIM T AS WORD
SYMBOL St = GPIO.4 SYMBOL Dir = GPIO.3
SYMBOL OUT1 = GPIO.0 SYMBOL OUT2 = GPIO.1 SYMBOL OUT3 = GPIO.2 SYMBOL OUT4 = GPIO.5
IOCB = %00010000 OPTION_REG = %00000111 PIE1 = %00000000 PIR1 = %00000000 INTCON = %11001000 OSCCAL = %11111100 ON_INTERRUPT GOTO ISR
CLEAR TRISIO = %00011000 '-------------------------- Начало ------------------------------------------- '-------------------------- Главная программа ------------------------- X = EREAD 0 Main: FOR T = 0 TO 60000 STEP 1 SELECT X CASE 1 OUT1 = 1 OUT2 = 0 OUT3 = 0 OUT4 = 0 CASE 2 OUT1 = 0 OUT2 = 1 OUT3 = 0 OUT4 = 0 CASE 3 OUT1 = 0 OUT2 = 0 OUT3 = 1 OUT4 = 0 CASE 4 OUT1 = 0 OUT2 = 0 OUT3 = 0 OUT4 = 1 ENDSELECT NEXT T OUT1 = 0 OUT2 = 0 OUT3 = 0 OUT4 = 0 EWRITE 0 , [X]SLEEP GOTO Main ' Возврат на начало основной программы
ISR: IF St = 0 THEN IF Dir = 1 THEN INC X ELSE DEC X ENDIF IF X = 0 THEN X = 4 IF X = 5 THEN X = 1 ENDIF T = 0 INTCON.0 = 0 CONTEXT RESTORE
полушаг СпойлерКод'-------------------------- Описание проекта --------------------------------- 'Проект : StepDir_controller 'Автор : DAY ' 'Версия : 1.0.0 от 26.01.2013 ' '-------------------------- Опции компилятора -------------------------------- DECLARE SHOW_SYSTEM_VARIABLES = OFF ' При симуляции в Proteus не показывать внутренние переменные DECLARE FSR_CONTEXT_SAVE = ON ' Не заботиться о сохранении содержимого регистра FSR DECLARE REMINDERS = OFF ' Выключить напоминания компилятора DECLARE WARNINGS = ON ' Выключить предупреждения компилятора DECLARE OPTIMISER_LEVEL 2 ' Выключить оптимизацию программы DECLARE BOOTLOADER = OFF ' Выключить загрузчик ;-------------------------- Общие настройки------------------------------------ DEVICE = 12F675 ' Используемый микроконтроллер XTAL = 4 ' Частота осциллятора 4 МГц
CONFIG WDT_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT '-------------------------- Настройки портов --------------------------------- DECLARE ALL_DIGITAL = ON ' Каждый порт выполняет свою функцию по умолчанию '-------------------------- Регистры специального назначения------------------- DIM X AS BYTE DIM T AS WORD
SYMBOL St = GPIO.4 SYMBOL Dir = GPIO.3
SYMBOL OUT1 = GPIO.0 SYMBOL OUT2 = GPIO.1 SYMBOL OUT3 = GPIO.2 SYMBOL OUT4 = GPIO.5
IOCB = %00010000 OPTION_REG = %00000111 PIE1 = %00000000 PIR1 = %00000000 INTCON = %11001000 OSCCAL = %11111100 ON_INTERRUPT GOTO ISR
CLEAR TRISIO = %00011000 '-------------------------- Начало ------------------------------------------- '-------------------------- Главная программа ------------------------- X = EREAD 0 Main: FOR T = 0 TO 60000 STEP 1 SELECT X CASE 1 OUT1 = 1 OUT2 = 0 OUT3 = 0 OUT4 = 0 CASE 2 OUT1 = 1 OUT2 = 1 OUT3 = 0 OUT4 = 0 CASE 3 OUT1 = 0 OUT2 = 1 OUT3 = 0 OUT4 = 0 CASE 4 OUT1 = 0 OUT2 = 1 OUT3 = 1 OUT4 = 0 CASE 5 OUT1 = 0 OUT2 = 0 OUT3 = 1 OUT4 = 0 CASE 6 OUT1 = 0 OUT2 = 0 OUT3 = 1 OUT4 = 1 CASE 7 OUT1 = 0 OUT2 = 0 OUT3 = 0 OUT4 = 1 CASE 8 OUT1 = 1 OUT2 = 0 OUT3 = 0 OUT4 = 1 ENDSELECT NEXT T OUT1 = 0 OUT2 = 0 OUT3 = 0 OUT4 = 0 EWRITE 0 , [X]SLEEP GOTO Main ' Возврат на начало основной программы
ISR: IF St = 0 THEN IF Dir = 1 THEN INC X ELSE DEC X ENDIF IF X = 0 THEN X = 8 IF X = 9 THEN X = 1 ENDIF T = 0 INTCON.0 = 0 CONTEXT RESTORE У меня все работает, правда без опторазвязки и схема проще некуда)))
Найденное на халяву, исчезает мгновенно, лишь сто раз заработанное всегда будет твоим.
|
|
|
|