|
Реверсивный счетчик на таймере |
|
|
|
Dec 10 2007, 16:27
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 11-09-05
Пользователь №: 8 451

|
Добры день, нужна ваша помощ. Задача состоит в том - что бы создать реверсивный счетчик на одном из таймеров AVR (ATMega8(16) или другие). 0-й таймер - не подходит, т.к. он считает только в одну сторону (по даташиту). Остальные таймеры, в частности 1-й - имеет вход направления, но это направление меняется только внутренным контроллером таймера и только в в режиме Phase-correct и Frequency - Phase Correct PWM.
У кого какие соображения нужна максимальная частота которую он может выдать (~ 3.3 МГц на максимуме), при реверсе частота нужно небольшая.
Эту задачу нужно решить для стыковки AVR-ки с энкодером (16-бит - на оборот), в качестве сигнала направления используется выход синронного D-триггера, на D-вход которого подается один из квадратурных выходов, а на вход синронизации - другой.
У кого какие идеи, или может кто-то нашел другой способ стыковки енкодера с AVR-кой.
В поиск - не посылать, AVRFreak - не посылать, к АппНоутам - не посылать, я там везде уже был.
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Dec 10 2007, 16:36
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Erv&Sed @ Dec 10 2007, 20:27)  Добры день, нужна ваша помощ. Задача состоит в том - что бы создать реверсивный счетчик на одном из таймеров AVR (ATMega8(16) или другие). 0-й таймер - не подходит, т.к. он считает только в одну сторону (по даташиту). Остальные таймеры, в частности 1-й - имеет вход направления, но это направление меняется только внутренным контроллером таймера и только в в режиме Phase-correct и Frequency - Phase Correct PWM.
У кого какие соображения нужна максимальная частота которую он может выдать (~ 3.3 МГц на максимуме), при реверсе частота нужно небольшая.
Эту задачу нужно решить для стыковки AVR-ки с энкодером (16-бит - на оборот), в качестве сигнала направления используется выход синронного D-триггера, на D-вход которого подается один из квадратурных выходов, а на вход синронизации - другой.
У кого какие идеи, или может кто-то нашел другой способ стыковки енкодера с AVR-кой.
В поиск - не посылать, AVRFreak - не посылать, к АппНоутам - не посылать, я там везде уже был. Ничего не понял, но - для аппаратной реализации нужно иметь два D-триггера и два счетчика. Входы D-триггеров включаются одинаково с точностью до наоборот к фазам энкодера, а выходы на входы счетчика. Разница между значеними двух счетчиков показывает абсолютное положение. - если частота импульсов небольшая, все реализуется программно без триггеров и счетчиков. - ни один таймер Атмеги не может быть реверсивным.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Dec 10 2007, 21:22
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 11-09-05
Пользователь №: 8 451

|
У ATMega8 1-ый и 2-ой таймеры - реверсивны, просто мы не можем програмно указать направление счета, если таймер работает в режиме "Phase correct PWM" - то счетчик увеличивается до значения TOP, потом уменьшается до значения BOTTOM (0), после опять увеличивается до значения TOP и т.д. Мне на ум приходит единственное решение моей проблемы - в момент реверса (двигателя -> энкодера) - сделать что-то на подобие: In Tmp,TCNT1A Inc Tmp Out OCR1A,Tmp А в обработчике OC1A In Tmp,TCNT1A Dec Tmp Out TCNT1A В первом случае добавляем чтобы точно не пропустить момент "Compare Match" (т.е. одинаковые значения TCNT1A и OCR1A), а в обработчике - чтобы исключить погрешность. Саму тему я создал для того чтобы узнать ваще видене решения проблемы (при такой частоте импульсов). Реализация нужна програмная, просто мне сказали что мол есть такие контроллеры в которых есть так называемый квадратурный счетчик, на что я ответил что и AVR`ка тоже будет считать просто надо добавить небольшую аппаратную часть, но не сам счетчик!!! Принцип работы D-тригера такова: по фронту (спаду) одного из сигналов устанавливаем значение второго, т.е. если двигатель вращается в одну сторону - первый сигнал опережает второй и к переднему фронту первого - на втором будет "0", а при вращении в другую - "1". Прикрепил модель в Proteus`е.
Сообщение отредактировал Erv&Sed - Dec 10 2007, 21:27
|
|
|
|
|
Dec 11 2007, 09:57
|
Группа: Новичок
Сообщений: 1
Регистрация: 15-11-07
Пользователь №: 32 371

|
Цитата(Erv&Sed @ Dec 11 2007, 01:22)  Реализация нужна програмная, просто мне сказали что мол есть такие контроллеры в которых есть так называемый квадратурный счетчик, на что я ответил что и AVR`ка тоже будет считать просто надо добавить небольшую аппаратную часть, но не сам счетчик!!! Когда-то, очень давно, я такое делал, цепляя енкодер к счетчику Т2 i8052. Уже точно и не помню, кажется входы T2 и T2EX. Один вход - импульсы счета, второй - направление. Т.к. счетчик 16-ти разрядный, приходилось его расширять программно. Потом такие поделки перевел на программируемую логику (Альтера) + AVR. Альтера, в отличие от i8052, дала одновременно скорость + синхронность + разрядность.
|
|
|
|
|
Dec 11 2007, 11:37
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(Erv&Sed @ Dec 10 2007, 19:27)  Добры день, нужна ваша помощ. Задача состоит в том - что бы создать реверсивный счетчик на одном из таймеров AVR ...
У кого какие соображения нужна максимальная частота которую он может выдать (~ 3.3 МГц на максимуме), при реверсе частота нужно небольшая.
Эту задачу нужно решить для стыковки AVR-ки с энкодером (16-бит - на оборот), в качестве сигнала направления используется выход синронного D-триггера, на D-вход которого подается один из квадратурных выходов, а на вход синронизации - другой.
В поиск - не посылать, AVRFreak - не посылать, к АппНоутам - не посылать, я там везде уже был. Ну что ж, раз нужна наша помощь и Вы уже везде были... 1. добры, помош , что бы надо писать как добрый, помошь, и чтобы 2. Какова максимальная частота квадратурного сигнала? И тогда что такое 16 бит? 3. Вам не нужны таймеры. Нужно циклически (по таймеру) принимать состояния квадратурных сигналов и, сравнив их с предыдущим состоянием, принимать решение. Именно так, потому что, как правило, там будет дребезг. PS. D-триггер работает только с идеальным сигналом, причём съедает один зуб на реверсе. Надо 2 триггера. Нарисуйте диаграммы сигналов на бумажке - увидите.
|
|
|
|
|
Dec 12 2007, 19:57
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 11-09-05
Пользователь №: 8 451

|
Спасибо за ответы, в особенности vpv у которого это был первое сообщение, и тут-же вопрос: как вы связывали Алтеру с AVR`кой через SPI, UART не слишком ли это медленно??, а как на счет дребезга, как вы с ним справлялись? Maik-vs кол-во моих ошибок напрямую зависит от стажа прибывания в интернете (так-что надежды никакой). По сути дела. Под 16-битный я имел ввиду 65536 дискрет на оборот, есть такие энкодеры, выпускаются у нас в Питере а максимальная частота до 10000 об/мин, но я брал 3000 об/мин, итого ~ 3.3 МГЦ а период ~ 305 нс, интересно а дребезг сколько будет длиться, если соизмеримо с этим периодом - то у нас получается сплошной дребезг. А на счет D-триггера (пропуск при реверсе) - это можно убрать програмно. Хотя с другой стороны в одной микросхеме идут несколько триггеров, поэтому можно сделать через два триггера, но это вносит задержку если я вас правильно понял. СКБ ЛИР выпускает энкодеры, как они пишут, с выходом совместимым с RS422, надо ли это понимать что проблема с дребезгом решена или как это надо понимать. Здесь даташит на одно из их изделий http://skbis-lir.ru/pdf/lir-112a-212a.pdf
|
|
|
|
|
Dec 13 2007, 20:02
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(Erv&Sed @ Dec 12 2007, 22:57)  По сути дела. Под 16-битный я имел ввиду 65536 дискрет на оборот, есть такие энкодеры, выпускаются у нас в Питере а максимальная частота до 10000 об/мин, но я брал 3000 об/мин, итого ~ 3.3 МГЦ а период ~ 305 нс, интересно а дребезг сколько будет длиться, если соизмеримо с этим периодом - то у нас получается сплошной дребезг. А на счет D-триггера (пропуск при реверсе) - это можно убрать програмно. Хотя с другой стороны в одной микросхеме идут несколько триггеров, поэтому можно сделать через два триггера, но это вносит задержку если я вас правильно понял. Ну если так, то дребезга скорее всего не будет. Я поначалу понял, что 16 импульсов на оборот. Честно говоря, ничего не приходит в голову кроме внешнего реверсивного счётчика и прерывания от его переполнения.
Сообщение отредактировал Maik-vs - Dec 13 2007, 20:03
|
|
|
|
|
Dec 14 2007, 14:47
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 11-09-05
Пользователь №: 8 451

|
Всем спасибо за ответы, в итогое ничего не получилось с чистым реверсом. Хоть таймер действительно реверсивный, но поменять направление счета можно только в если он считает в одну сторону. Скажем если он считаел от 0 к верху - то его можно "реверснуть", но обратно - никак.
В итоге сделал в "нормальном режиме" работы таймера, при реверсе происходит захват -> в обработчике считывается значение ICR добавляется к (вычитается из) предыдущему состоянию если произошло переполнение и т.д. и т.п. ..., очищается значение счетчика. Т.к. в момент ревреса частота близка к 0-ю (из-за инерционности), то мы вполне можем это себе позволить.
Ну в общем кому интересно будет можно спросить в почте Erv[брр]Sed4 щенок ВК[над и]Ru. Пишите так, чтобы можно было отличать от спама.
rezident спасибо за поддержку, но нужен именно квадратурный сигнал.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|