Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
Контроллер XY плотера на 16f73
buller Дата: Вс, 28.07.2013, 10:28  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 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 специально подключены именно к этим ножкам, так как на них есть аппаратный шим, который должен включаться в режиме удержания.

На данный момент у меня получилось крутить моторами в обе стороны на полном или половинном шаге.
В прикрепленных файлах схема для симуляции в Протеус и код программы.
Прикрепления: stepper_drive1r.dsn (121.0 Kb) · XY.bas (11.9 Kb)
ЯНДЕКС Дата: 28.07.2013
MiXaS Дата: Вс, 28.07.2013, 20:44  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

а в чем вопрос?
buller Дата: Вс, 28.07.2013, 23:40  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 07.10.2011

Статус: Offline

Проблема в том что я не знаю как написать то кусок программы который будет отвечать за обработку сигналов приходящих из параллельного порта, как програмно определить спадающий фронт
Сообщение отредактировал buller - Вс, 28.07.2013, 23:43
ADMIN Дата: Пн, 29.07.2013, 07:20  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

нужно использовать прерывания по входу INT
buller Дата: Пн, 29.07.2013, 09:09  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Новенький
Сообщений: 10
Репутация: 0   ±
Замечания:   ±
На сайте с 07.10.2011

Статус: Offline

Цитата (ADMIN)
нужно использовать прерывания по входу INT
Проблема в том, что из прерывания по B0 это сделать не получится, так как на порт приходят 3 независимых друг от друга синхро сигналы. Допустим нам нужно сместить каретку, не двигая бумагу, тогда получится что импульсы будут идти только на B5 - CARRIADGE STEP. То есть для реализации по такой схеме нам нужно 3 выводы с прерыванием, которые могут независимо друг от друга детектировать фронт сигнала. Единственным вариантом является сделать это через изменение по Б4-B7, но как определять ниспадающий или нарастающий фронт?
MiXaS Дата: Пн, 29.07.2013, 10:22  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата (buller)
Единственным вариантом является сделать это через изменение по Б4-B7, но как определять ниспадающий или нарастающий фронт?


Как написано в шите: сигнал сравнивается с последним чтением порта. Можно попробовать в подпрограмме прерывания следить за сигналом. Например.

Метка_прерывания:

ЗАПРЕТ ВСЕХ ПРЕРЫВАНИЙ

IF RBIF = 1 THEN
ЗДЕСЬ ОТСЛЕЖИВАЕТЕ СОСТОЯНИЕ ВХОДОВ RB4-RB7
ENDIF

СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ

Context Restore
Прикрепления: 4763310.png (98.3 Kb)
ADMIN Дата: Вт, 30.07.2013, 03:37  |                                                                                                                Сообщение # 7
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Цитата (buller)
Единственным вариантом является сделать это через изменение по Б4-B7, но как определять ниспадающий или нарастающий фронт?
Это не единственный вариант. Если вы знаете, вход INT позволяет настроить прерывание либо по фронту, либо по спаду. Посмотрите эту статью. Возможно, что-то станет ясно.
MiXaS Дата: Вт, 30.07.2013, 12:58  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата (ADMIN)
Посмотрите эту статью. Возможно, что-то станет ясно.


Думаю это самый лучший вариант, так как INT имеет более гибкие настройки. Но усложняется схемотехника.
DAY Дата: Вт, 30.07.2013, 16:40  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 21
Репутация: 0   ±
Замечания:   ±
На сайте с 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
У меня все работает, правда без опторазвязки и схема проще некуда)))
Прикрепления: STEP_DIR.lay (28.8 Kb)


Найденное на халяву, исчезает мгновенно, лишь сто раз заработанное всегда будет твоим.
  • Страница 1 из 1
  • 1
Поиск: