Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Измеритель линейных перемещений и Bascom Avr


Измеритель линейных перемещений и Bascom Avr

Сообщений 1 страница 30 из 38

1

Пришло время, нужно сделать первый шаг в создании ЧПУ на Atmega  8-)
Взял оптическую линейку и воткнул её в контроллер.
Принцип простой:
https://www.matrix-vision.com/manuals/mvHYPERION/UseCase_IncrementalEncoder_Principle.png
http://automationprimer.com/wp-content/uploads/2012/07/Quadrature.jpg

Как и в радиальном, так и линейном, одинаковые сигналы + контрольная метка.
Пробовал подлючить в МК, по идее можно по одному прерыванию следить за 1 импульсом, а по другому проверять в какую сторону идёт перемещение.
Вот только одна проблема, 1000 импульсов на 1мм, а скорость станка может быть 3000мм/мин.
Первые наработки показали нестабильность подсчёта импульса, кто нибудь сталкивался с этим?

0

2

а если мерить не количество импульсов, а частоту?

0

3

Нужно мерить расстояние, а не скорость оборотов.)

0

4

Ev3658 написал(а):

Вот только одна проблема, 1000 импульсов на 1мм

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

0

5

Тут очень нужно надёжное измерение, если пропустить хоть один сигнал, уже будет ошибка на 0.001мм., а это не допустимо в металлообработке.
Стандартное решение Bascom не воспринимает эти импульсы как энкодера.
Пробовал брать 1 импульс по подъёму и в этот момент проверял второй импульс на наличие, если есть второй импульс, значит в "+" если нет, значит в "-", получалось увидеть направление, но если перемещать вперёд-назад, потери большие.
Если усложнить алгоритм, то боюсь производительности не хватит.
Продаётся вот такой вот блок (9-17т.р.) - БЛОК на Aliexpress
У него в комплекте три китайские линейки, дающие 1 импульс каждые 0.001мм., сам блок предназначен для установки на любой станок с ручным и педальными перемещениями.
Одну линейку уже несколько раз ломали, сейчас я её взял и пробую чего нибудь сколхозить.
Если получится обрабатывать 1 сигнал без проблем и как-то его передать куда нибудь, это будет круто, многие ЧПУ маньяки смогут себе делать очень точные станки с минимум затрат.

Вот, статейку накопал - http://club.shelek.ru/viewart.php?id=369
в понедельник попробую несколько алгоритмов.

0

6

Пётр написал(а):

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

На ПЛИС? Или просто какой нибудь триггер?
Если далеют ЧПУ станок на компе, то в большинстве случаев используют плату PCI или ISA - ЛИР-940.
http://files3.vunivere.ru/workbase/00/00/24/92/images/image015.jpg
Она имеет 4 канала по 3 сигнала каждый. По сути дела она независимо следит за прерываниями.
Плата на сайте производителе.
Документация, исходники Си и т.п. на сайте производителя.
Параметры:
-Количество осей (количество подключаемых преобразователей)     4   
-Тип преобразователей     Инкрементный   
-Шина компьютера     PCI - PCI Local Bus Specification 2.2   
-Тип гальванической развязки     Сигналы всех датчиков и сигналы внешних (дополнительных)
устройств имеют гальваническую развязку   
-Разъем для подключения преобразователей     9 pin - DRB9F -розетка - 9 контактов   
-Количество дополнительных входов для импульсных сигналов 4   
-Интерфейс для подключения дополнительных внешних устройств RS422   
-Минимальная длительность импульсного сигнала, подаваемого на дополнительных вход платы 40 нс   
-Напряжение пробоя, тест на модели человеческого тела 1000 В   
-Максимальный ток потребления при питании датчиков и дополнительных устройств от DC-DC (на каждый канал) 200 мА   
-Разрядность аппаратного счетчика каждого канала 24   
-Максимальная входная частота сигналов преобразователя 12 МГц   
-Временное сближение фронтов сигналов преобразователя (Тmin), при котором возникает предостерегающее сообщение ≤ 20нс.   
-Уровни сигналов преобразователя ТТЛ   
-Описание (pdf) ЛИР-940 PCI   

Отредактировано Ev3658 (2016-02-07 10:04:32)

0

7

А Z - это нулевая точка на всей линейке (одна) или оно повторяется обязательно через определенный период?
В любом случае, Z как бы не нужен, наверняка концевики на станке и так стоят, а дальше просто быстрый энкодер.

На счет:

1000 импульсов на 1мм, а скорость станка может быть 3000мм/мин.

Неважно сколько импульсов, главное, что в секунду всё равно прилетает всего 50 импульсов в сек - это весьма медленно (50fps), МК легко перемолет...

0

8

А вот зачем это всё на плис пихать - не знаю, он скорее всего больше занят обработкой компьютерной шиной PCI - это избыточно.

0

9

Кстати, люди сами делают энкодеры, так как производители необоснованно завышают цены.
Вот, для принтера печать делений - http://www.chipmaker.ru/files/go/4bf4f5 … 11dfce3c2/

Если придумать USB/Ethernet и т.п. простенькое устройство на 1 энкодер, это прибавит развитие точных самопальных, самодельных на коленке домашних ЧПУ станков.

0

10

RDW написал(а):

А Z - это нулевая точка на всей линейке (одна) или оно повторяется обязательно через определенный период?...


Обычно у оптической линейки или измерителя угла есть три выхода.
Два выхода - обычный энкодер, а третий когда как. На старых линейках обнаружил, что третий выход посылает сигнал в начале и в конце линейки, а на угловом измерителе (радиальный энкодер) он идёт как ноль метка. В современных линейках он идёт как контрольная точка.
В любом случае, без третьего выхода станок ЧПУ не сможет выйти при начальном включении в нулевое положение, от которого будет последующая работа, а выходить в ноль по концевым выключателем - разброс сильный.

Абсолютное положение можно определить по 2м сигналом с этих энкодеров, главное, в процессе перемещение не позволить себе потери.

0

11

Вообще есть такие штуки: http://www.superdroidrobots.com/shop/it … ffer/1523/

+1

12

Ev3658 написал(а):

В любом случае, без третьего выхода станок ЧПУ не сможет выйти при начальном включении в нулевое положение, от которого будет последующая работа, а выходить в ноль по концевым выключателем - разброс сильный.

Ну так никакой разницы, используем 3- конец вместо концевиков, но тогда непонятно в каком из крайних положений стоит линейка.

0

13

RDW написал(а):

.... непонятно в каком из крайних положений стоит линейка.

В готовых системах ЧПУ есть двавида сигналов, один для грубого нуля, другой для точного.
Если ноль ищем по линейке, то в конфигурации ЧПУ указываем простой алгоритм, к примеру двигаемся влево до срабатывания концевика "грубый ноль" и ищем в право ближайшую метку на линейке (по третьему сигналу).
http://s3.uploads.ru/t/k5pWA.jpg

0

14

Находимся в крайнем левом положении, практически в упоре, а теперь "простой алгоритм, к примеру двигаемся влево" - сомнительный результат (износ железа и клин его). Я это к тому, что этих точек (Z) - недостаточно.

Всё производство работает на концевиках и никаких проблем нет.

0

15

RDW написал(а):

Находимся в крайнем левом положении, практически в упоре, а теперь "простой алгоритм, к примеру двигаемся влево" - сомнительный результат (износ железа и клин его). Я это к тому, что этих точек (Z) - недостаточно.

Всё производство работает на концевиках и никаких проблем нет.


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

LS7366R - чудная штука, но дорогая жутко, прям реальное решение.

0

16

Вы знаете зачем используются эти линейки? Не для определения нуля или ещё чего, т.к. у вас движки не стэповые, а линейные/аналоговые, то надо как-то определять шаг и к чему-то привязаться...кстати контроль сия механизма ещё менее стабильна, от сюда и танцы с бубном.

0

17

Вот, что показывает осцилдлограф:
http://cs630318.vk.me/v630318961/256ed/c3uykC0UrC4.jpg
http://cs630318.vk.me/v630318961/256e3/XN0qel5i08w.jpg

0

18

Я  :hobo:  косяк! Забыл про буфер прерываний!!!

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 40
$framesize = 40
$baud = 9600

Config Portd = Input

Config Int0 = Rising     
Dim L As Integer
Dim D As Integer


On Int0 Inn1


Enable Int0
Enable Interrupts
Do


If L <> D Then
   D = L
   Print D
End If


Loop
End


Inn1:
Eifr = &B11000000
If Pind.3 = 1 Then L = L + 1 Else L = L -1
Return

Вроде теперь ровно кажет, правда есть сбои, но это возможно из-за того, что из линейки два раза головку выламывали.

0

19

Вот блин, проблема всплыла.
Код выше считает примерно 20 импульсов на пол сантиметра, но судя по докуменатции (на русском - http://www.cnctver.ru/userFiles/file/KA_linearscale.pdf ) она точностью в 4 раза больше.
Может кто знает, как одним прерыванием считать энкодер?
http://www.pchelar-probvaisambg.com/images/St304_SN4.jpg

В документации написано про цикл сигнала, он от подъёма до подъёма сигнала "А", в этот момент можно выделить 4 сигнала. Но как их обработать одним прерыванием? По фронту подъёма и спада прерывание даст два положения из 4х. или я настолько нищебродный еврей, что входы в МК берегу  :D

0

20

Одним входом INT 4 состояния за период не определишь, а для точности оно и нужно. С 1 по 4 положения это все отдельные щелчки энкодера?
Попадался мне очень нехороший энкодер, с малым количеством щелчков (секторы большие) и, до кучи, за один щелчок выдавал полный период сигналов (последовательность с 1 по 4). Что крайне неудобно в эксплуатации.

0

21

MACTEPok написал(а):

Одним входом INT 4 состояния за период не определишь, а для точности оно и нужно. С 1 по 4 положения это все отдельные щелчки энкодера?
Попадался мне очень нехороший энкодер, с малым количеством щелчков (секторы большие) и, до кучи, за один щелчок выдавал полный период сигналов (последовательность с 1 по 4). Что крайне неудобно в эксплуатации.

Не, я на картинке принцип показал, а энкодер у меня вот такой:
http://renesanceindustrial.com/Index.2.jpg

0

22

Прерывание можно вызвать при смене уровня. Т.е. получите два прерывания за один импульс. Вопрос только как определить направление. Если оно известно, то проще.
А так можно на логике соорудить. Одновибратор на ногу энкодера и элемент "или"

0

23

http://s6.uploads.ru/t/oFuJC.jpg
А разве так нельзя? У меня так работает без ошибок! И в подсчете, и на счет ошибок!

0

24

Мне кажется, что можно попробовать сделать как предложил Каримов, но обработку прерывания чуть усложнить.

- делать срабатывание прерывания по двум уровням;
- анализируем в каком состоянии находится ножка прерывания и дальше делаем доп.логику обработки.

Т.е. чуть усложняем и получаем в 2 раза выше разрешение (от предыдущего алгоритма).

0

25

Поддерживаю! Выборка удвоится!
Только с уровнями не попутать!

Отредактировано Каримов (2016-02-09 14:20:52)

0

26

http://s6.uploads.ru/t/oFuJC.jpg

Так у меня сейчас и работает по прерыванию: If Pind.3 = 1 Then L = L + 1 Else L = L -1 

Точней вот так вот реализовал:
http://cs629505.vk.me/v629505961/2fb66/6eXx4vBfMM8.jpg

Но это не даёт паспортной точности этой линейки. Есть другой вариант, но кажись на 1 энкодер нужно будет два прерывания:
http://cs629505.vk.me/v629505961/2fb5f/mDVjaRd4-sI.jpg

Вот тут то и проблема, хочется 1 прерывание на одну линейку и тогда будет счастье и благодать  8-)

Отредактировано Ev3658 (2016-02-09 15:38:54)

0

27

Тогда Int должен реагировать на фронт или спад, а не на уровень!
использую Falling  и Rising

Отредактировано Каримов (2016-02-09 15:48:20)

0

28

Config Int1 = Falling       'Falling - прерывание по нарастанию уровня
On Int0 Обработка_прерывания_int0 Nosave       ' Подпрограмма обработки прерывания INT0
Enable Int0       ' Разрешаем прерывание INT0
Enable Interrupts

do
.
.
loop

Обработка_прерывания_int0:

смотрим бит порта Х . Если 0, то ДВИЖЕМСЯ (turn right), иначе ДВИЖЕМСЯ (turn left)

0

29

Да, но с таким методом мы упускаем ещё три дискретных сигнала. В итоге измеряем с точностью 0.020 миллиметра, а можно измерять 0.005мм.
Есть вроде ещё одно прерывание: Config Int0 = Change  - прерывание по любому фронту.

Как бы вот это фиксировать не потеряв ничего на одном прерывании:
http://cs629505.vk.me/v629505961/2fb90/GYBVtLU3Jo0.jpg
Видимо без аппаратной приправки никак  :smoke:

Отредактировано Ev3658 (2016-02-09 16:09:25)

0

30

Я бы сделал так: Int0 соединил еще с одним портом(пусть будет переменная А). Второй сигнал- переменная В.
Тогда получим: Пришло прерывание по ИЗМЕНЕНИЮ уровня!!!
Далее:
If A = 0 and B = 0 then Стрелка влево
If A = 0 and B = 1 then Стрелка вправо
If A = 1 and B = 0 then Стрелка вправо
If A = 1 and B = 1 then Стрелка влево

Грубо, но работает! Можно и компактнее.

Отредактировано Каримов (2016-02-09 16:18:30)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Измеритель линейных перемещений и Bascom Avr