|
|
  |
tiny2313 & mega8, посоветуйте плз |
|
|
|
Dec 7 2006, 11:04
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Terapefft @ Dec 7 2006, 09:49)  раскажите пожалуста про энкодер, что это такое? какие они бывают? как с ними быть? Простейший энкодер -- внутри мыши такое колёсико с дырочками + две детальки на плате  . А если серьёзно, то задай Google вопрос и найдешь кучу информации на руском языке. Множество русских фирм продаёт энкодеры любых видов для разных целей и у них есть техдокументация. Самому сделать -- тоже просто берём диск сверлим по контуру отверстия или нарезаем полосочки, ставим оптопару (их тоже много продают готовых) устанавливаем на вал, вывод фотодатчка подключаем к мп и имеем обратную связь. Програмно считаем импульсы и конкретно тормозим в нужный момент. Ниже есть обсуждение подключения энкодера. Удачи!
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Dec 7 2006, 11:49
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Terapefft @ Dec 7 2006, 10:25)  а если просто поставить какой нить индуктивный датчик? я вот просто алгоритм до конца не пойму. Допустим после включения насоса ждать пока сигнал с датчика появится на ноге, пока его не будет цикл не продолжать? можно так поступить? а после того как на ноге появилась "1" продолжить цикл Какой датчик поставить это тебе решать. Главное чтобы он выдавал импульсы, ну скажем 5В. Количество импульсов зависит от дотчика. Главное что при вращении вала шли импульсы, а когда вал стоит -- нет. Ведь ты включаешь двигатель, кажется "доза", на какое-то время. За это время двигатель делает какое-то количество оборотов, скажем N. Пусть датчик на валу за один оборот формирует M импульсов (зависит от количества "дырочек"  в диске). Теперь мы можем посчитать на "сколько" импульсов нам надо включать двигатель для получения "правильной" дозы (N*M). Поэтому мы можем просто включать двигатель и теперь считать импульсы от датчика (не на время). По приходе нужного количества импульсов (N*M), выключаем двигатель и включаем тормоз. Эти мы исключаем всякие внешние факторы на количество оборотов -- количество "дозы". Ведь от времени включения двигателя зависит "доза"? Или я не прав?
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Dec 7 2006, 12:08
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Terapefft @ Dec 7 2006, 10:54)  да верно, доза зависит от времени включения насоса, я вот просто не пойму как програмно реализовать подсчет импульсов Выход датчика заводишь на любой вход INT0 или INT1, организуешь пп обработки прерывания, настраиваешь прерывание на фронты или уровни срабатывания, и, в пп обработки прерывания, делаешь INC Rd. Конечно всё зависит от количества импульсов, но это уже програмные штучки  .
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Dec 7 2006, 16:58
|

Частый гость
 
Группа: Свой
Сообщений: 167
Регистрация: 14-06-06
Из: Рязань
Пользователь №: 18 052

|
я тут подумал и решил сделать так: взять диск и просверлить в нем дырки, и поставить его на вал двигателя, импульсы фиксировать индуктивным датчиком, т.е. если он попадает на "дырку" на выходе "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 (высокий уровень или низкий) ? и как посчитать кол-во импульсов которые пройдут за один оборот вала? может оно будет равно кол-ву дырок? и как подобрать кол-во импульсов за которые наберется литр? просто подобрать "методом тыка"?
|
|
|
|
|
Dec 7 2006, 17:21
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Terapefft @ Dec 7 2006, 15:58)  sbi ddrd,3 ; установить PD3 как выход Почему PD3 выход он же ВХОД ПРЕРЫВАНИЯЦитата вот у меня возникли вопросы : что записать в PORTD (высокий уровень или низкий) ? Если пин порта вход, то запись в регистр PORTD 1 подключает внутренний пулап резистор Цитата и как посчитать кол-во импульсов которые пройдут за один оборот вала? может оно будет равно кол-ву дырок? Конечно. Но в твоём случае можно просверлить и одно отверстие. Т.к. один регистр может "считать" импульсы только до 255. Для большего количества придется испозовать всё боьше и больше регстров  . Эксперементируй и считай, считай, считай Цитата и как подобрать кол-во импульсов за которые наберется литр? просто подобрать "методом тыка"?  Можно померять сколко наберётся за один оборот. Но для большей точности мерять сколько оборотов надо на один литр. А про проблемы на которые нарвешся прочиай по той ссылке что я давал выше. Пересказывать не буду.
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Dec 7 2006, 17:53
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Ессесно Цитата C:\avr\inddat\inddat.asm(830): error: Illegal attempt to re-use 'INT1' as label Низзя использовать "зарегестрированные" слова. Измени INT1 на что-то вроде: CNT_INT1.
Сообщение отредактировал Wild007 - Dec 7 2006, 17:54
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Dec 8 2006, 15:03
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Terapefft @ Dec 8 2006, 13:41)  подключил я сегодня индуктивный датчик к контроллеру к ноге PD3, А порт правильно настроил? Код inc cntdat cpi cntdat,$8 brne NNN Почему сравнивается с 8? Код ldi radr,doza_0 rcall decod А кто обнулять CNTDAT будет?
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Dec 8 2006, 15:29
|

Частый гость
 
Группа: Свой
Сообщений: 167
Регистрация: 14-06-06
Из: Рязань
Пользователь №: 18 052

|
вот я в начале проги где инициализация таймеров идет поставил 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" чтоб посмотреть будет срабатывать или нет.
|
|
|
|
|
Dec 8 2006, 15:36
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Во первых : Код ldi Ttemp,0b00000100 out mcucr,Ttemp должно стоять в инициализации МК, а Код ldi Ttemp,0b10000000; разрешение прерывания INT1 out gicr,Ttemp после включения двигателя. И (в обработке прерывания), когда выключил двигатель, запрещать прерывание INT1.
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Dec 8 2006, 16:14
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Terapefft @ Dec 8 2006, 14:50)  сейчас сделал как вы сказали, теперь плата индикации не гаснет, но насос не отключается, видимо прерывание не работает.....с чем это может быть связано? Поиграйся с Код cpi cntdat,$01 А может опять где-то CLI стоит?
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|