Wild007 0 7 декабря, 2006 Опубликовано 7 декабря, 2006 · Жалоба раскажите пожалуста про энкодер, что это такое? какие они бывают? как с ними быть? Простейший энкодер -- внутри мыши такое колёсико с дырочками + две детальки на плате :) . А если серьёзно, то задай Google вопрос и найдешь кучу информации на руском языке. Множество русских фирм продаёт энкодеры любых видов для разных целей и у них есть техдокументация. Самому сделать -- тоже просто берём диск сверлим по контуру отверстия или нарезаем полосочки, ставим оптопару (их тоже много продают готовых) устанавливаем на вал, вывод фотодатчка подключаем к мп и имеем обратную связь. Програмно считаем импульсы и конкретно тормозим в нужный момент. Ниже естьобсуждение подключения энкодера. Удачи! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terapefft 0 7 декабря, 2006 Опубликовано 7 декабря, 2006 · Жалоба а если просто поставить какой нить индуктивный датчик? я вот просто алгоритм до конца не пойму. Допустим после включения насоса ждать пока сигнал с датчика появится на ноге, пока его не будет цикл не продолжать? можно так поступить? а после того как на ноге появилась "1" продолжить цикл Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wild007 0 7 декабря, 2006 Опубликовано 7 декабря, 2006 · Жалоба а если просто поставить какой нить индуктивный датчик? я вот просто алгоритм до конца не пойму. Допустим после включения насоса ждать пока сигнал с датчика появится на ноге, пока его не будет цикл не продолжать? можно так поступить? а после того как на ноге появилась "1" продолжить цикл Какой датчик поставить это тебе решать. Главное чтобы он выдавал импульсы, ну скажем 5В. Количество импульсов зависит от дотчика. Главное что при вращении вала шли импульсы, а когда вал стоит -- нет. Ведь ты включаешь двигатель, кажется "доза", на какое-то время. За это время двигатель делает какое-то количество оборотов, скажем N. Пусть датчик на валу за один оборот формирует M импульсов (зависит от количества "дырочек" :) в диске). Теперь мы можем посчитать на "сколько" импульсов нам надо включать двигатель для получения "правильной" дозы (N*M). Поэтому мы можем просто включать двигатель и теперь считать импульсы от датчика (не на время). По приходе нужного количества импульсов (N*M), выключаем двигатель и включаем тормоз. Эти мы исключаем всякие внешние факторы на количество оборотов -- количество "дозы". Ведь от времени включения двигателя зависит "доза"? Или я не прав? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terapefft 0 7 декабря, 2006 Опубликовано 7 декабря, 2006 · Жалоба да верно, доза зависит от времени включения насоса, я вот просто не пойму как програмно реализовать подсчет импульсов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wild007 0 7 декабря, 2006 Опубликовано 7 декабря, 2006 · Жалоба да верно, доза зависит от времени включения насоса, я вот просто не пойму как програмно реализовать подсчет импульсов Выход датчика заводишь на любой вход INT0 или INT1, организуешь пп обработки прерывания, настраиваешь прерывание на фронты или уровни срабатывания, и, в пп обработки прерывания, делаешь INC Rd. Конечно всё зависит от количества импульсов, но это уже програмные штучки :) . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terapefft 0 7 декабря, 2006 Опубликовано 7 декабря, 2006 · Жалоба я тут подумал и решил сделать так: взять диск и просверлить в нем дырки, и поставить его на вал двигателя, импульсы фиксировать индуктивным датчиком, т.е. если он попадает на "дырку" на выходе "0". Подключать его буду к PD3. Посмотрите пожалуста программную реализацию в начале я добавляю регистр .def cntdat=r19 и переменную для порта D .equ dat=3 ; вход индуктивного датчика В начале главного цикла ldi Ttemp,0b00001000 ; прерывание по спадающему фронту out mcucr,Ttemp ldi Ttemp,0b10000000 ; разрешение прерывания INT1 out gicr,Ttemp sbi ddrd,3 ; установить PD3 как выход вот у меня возникли вопросы : что записать в PORTD (высокий уровень или низкий) ? и как посчитать кол-во импульсов которые пройдут за один оборот вала? может оно будет равно кол-ву дырок? и как подобрать кол-во импульсов за которые наберется литр? просто подобрать "методом тыка"? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wild007 0 7 декабря, 2006 Опубликовано 7 декабря, 2006 · Жалоба sbi ddrd,3 ; установить PD3 как выход Почему PD3 выход он же ВХОД ПРЕРЫВАНИЯ вот у меня возникли вопросы : что записать в PORTD (высокий уровень или низкий) ? Если пин порта вход, то запись в регистр PORTD 1 подключает внутренний пулап резистор и как посчитать кол-во импульсов которые пройдут за один оборот вала? может оно будет равно кол-ву дырок? Конечно. Но в твоём случае можно просверлить и одно отверстие. Т.к. один регистр может "считать" импульсы только до 255. Для большего количества придется испозовать всё боьше и больше регстров :) . Эксперементируй и считай, считай, считай :) и как подобрать кол-во импульсов за которые наберется литр? просто подобрать "методом тыка"? :) Можно померять сколко наберётся за один оборот. Но для большей точности мерять сколько оборотов надо на один литр. А про проблемы на которые нарвешся прочиай по той ссылке что я давал выше. Пересказывать не буду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terapefft 0 7 декабря, 2006 Опубликовано 7 декабря, 2006 · Жалоба я вот сделал п/п обработки прерывания INT1: in rin1,sreg ; запомнить регистр состояния push rin1 inc cntdat cpi cntdat,$8 brne NNN ldi radr,doza_0 rcall decod NNN: pop rin1 out sreg,rin1 reti я планирую сделать 8 дырок. Как вы думаете нормально ли будет работать эта п/п? вроде на мой взляд должна. У меня почему то АВРстудио ругается при компиляции, говорит: C:\avr\inddat\inddat.asm(830): error: Illegal attempt to re-use 'INT1' as label почему так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wild007 0 7 декабря, 2006 Опубликовано 7 декабря, 2006 (изменено) · Жалоба Ессесно C:\avr\inddat\inddat.asm(830): error: Illegal attempt to re-use 'INT1' as label Низзя использовать "зарегестрированные" слова. Измени INT1 на что-то вроде: CNT_INT1. :) Изменено 7 декабря, 2006 пользователем Wild007 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terapefft 0 8 декабря, 2006 Опубликовано 8 декабря, 2006 · Жалоба подключил я сегодня индуктивный датчик к контроллеру к ноге PD3, прошил контролер поставил на плату. так у меня теперь когда я замыкаю датчик плата индикации гаснет вобще :( . почему это может быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wild007 0 8 декабря, 2006 Опубликовано 8 декабря, 2006 · Жалоба подключил я сегодня индуктивный датчик к контроллеру к ноге PD3, А порт правильно настроил? inc cntdat cpi cntdat,$8 brne NNN Почему сравнивается с 8? ldi radr,doza_0 rcall decod А кто обнулять CNTDAT будет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terapefft 0 8 декабря, 2006 Опубликовано 8 декабря, 2006 · Жалоба вот я в начале проги где инициализация таймеров идет поставил ldi Ttemp,0b10000000 ; разрешение прерывания INT1 out gicr,Ttemp потом в начале рабочего цикла: ldi Ttemp,0b00000100 out mcucr,Ttemp cbi ddrd,3 sbi portd,3 а п/п обработки прерывания: CNT_INT1: in rin,sreg push rin inc cntdat cpi cntdat,$01 brne NNN ldi radr,doza_0 rcall decod sbr reg_flgs,0b00000001 ; clr cntdat NNN: pop rin out sreg,rin reti сравнивал с "8" это типа симуляция одного поворота :) я щас просто поставил "1" чтоб посмотреть будет срабатывать или нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wild007 0 8 декабря, 2006 Опубликовано 8 декабря, 2006 · Жалоба Во первых : ldi Ttemp,0b00000100 out mcucr,Ttemp должно стоять в инициализации МК, а ldi Ttemp,0b10000000; разрешение прерывания INT1 out gicr,Ttemp после включения двигателя. И (в обработке прерывания), когда выключил двигатель, запрещать прерывание INT1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Terapefft 0 8 декабря, 2006 Опубликовано 8 декабря, 2006 · Жалоба сейчас сделал как вы сказали, теперь плата индикации не гаснет, но насос не отключается, видимо прерывание не работает.....с чем это может быть связано? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wild007 0 8 декабря, 2006 Опубликовано 8 декабря, 2006 · Жалоба сейчас сделал как вы сказали, теперь плата индикации не гаснет, но насос не отключается, видимо прерывание не работает.....с чем это может быть связано? Поиграйся с cpi cntdat,$01 А может опять где-то CLI стоит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться