Технический форум по робототехнике.
Duhas » 18 май 2010, 21:24
по-видимому да...
CiSi » 19 май 2010, 09:52
И как это сделать?
Duhas » 19 май 2010, 14:31
ну вариантов несколько.. например такт с МК с XTAL2 .. или один из таймеров на ШИМ с TOP-ом = 2 или 3 и сравнением на 1 .. без предделителя ... будет что-то типа такт/4 ... вроде мона так )
CiSi » 19 май 2010, 17:18
А какая частота тактирования нужна? И можно ли подключить отдельный кварц?
Ну а проще наверное будет микруху соединить с XTAL2 МК.
Duhas » 19 май 2010, 17:20
кварц поставить не выйдет, нужен генератор.. мона на логике сделать ...
CiSi » 19 май 2010, 18:26
А частоты кварца мк хватит?
Duhas » 19 май 2010, 18:46
там судя по ДШ ета частота используется для цифровой фильтрации.. т.е. для избавления от дребезга всякого и тд ..
она нужна в 3-4 раза большая чем частота импульсов с энкодера будет ...
CiSi » 10 авг 2010, 12:54
Сделал счетчик от прерывания, оказалось что такого вполне должно хватить.
Энкодер подключен напрямую к мк без логики т.к. сначало хочется хотябы просто считать импульсы в одном направлении.
Считать то вроде считает но неправильно. после включения питания на дисплее показано 0 импульсов, как и должно быть, а при последующем прикосновении к валу (некрутя его) энкодера, значение с нуля сразу добегает до пары тысяч. И каждый раз значение разное. При вращении вала все время в одном направлении може быть даже отрицательное значение на дисплее.
Вопрос: что за глюк?
Добавлено спустя 1 минуту 31 секунду:- Код: Выделить всё • Развернуть
#include<mega128.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
unsigned long q;
interrupt [EXT_INT0] void ext_int0_isr(void) // процедура обработки прерывания
{
q++; //с каждым прерыванием значение переменной увеличивается на 1
}
int main()
{
char w[32]; //для преобразования числа в строку/символы
DDRA=0x00;
PORTA=0x00;
DDRB=0xF0;
PORTB=0x00;
DDRE = 0b00110000;
PORTE = 0b00100000;
lcd_init(16);
lcd_gotoxy(5,0);
lcd_putsf("Hello!");
Privet();
delay_ms(3000);
while(1) {
q=0;
lcd_clear();
Go();
lcd_putsf(" ");
Stop();
lcd_putsf(" ");
Reset();
delay_ms(10);
if (!(PINA & 0b00000001)) { //Пуск
lcd_clear();
Go();
delay_ms(1000);
SREG.7 = 1;
EIMSK = 0x01;
EICRA = 0x0C;
EICRB = 0x0C;
while(PINA & 0b00000100){ //Сброс
lcd_clear();
sprintf(w,"adc= %d\n",q);
lcd_puts(w);
delay_ms(50);
}
lcd_clear();
Reset();
delay_ms(2000);
}
}
return 0;
}
Сергей » 10 авг 2010, 13:01
Код невозможно прочесть. Навскидку скажу, что это может быть от помех, посмотри осциллографом твои импульсы с энкодера. У меня было такое однажды.
CiSi » 11 авг 2010, 10:45
Изменил изменил условия внешних прерываний на на "условие 1/0" и внутреннюю подтяжку включил - все заработало НО! Теперь надо органировать реверс, а как это сделать? Наверное придется использовать сдвиг фаз двух каналов. А как это можно сделать програмно?
Пробовал собирать предложенную схему blindman-ом
, но устройство работало неправильно, значение все время прыгало.
CiSi » 19 авг 2010, 15:43
Подключал даже подтяжку к SR, но безрезультатно
Duhas » 20 авг 2010, 13:57
можно описать доступно - для масс (ну или для меня) что подразумевается под "Теперь надо органировать реверс"?
желательно полно, с того места откуда проистекает задача...
CiSi » 20 авг 2010, 19:44
Требовалось не только прибавлять импульсы при вращении в одну сторону, а еще их и убавлять при вращении вала энкодера в другую сторону.
К счастью проблемму сегодня решит, исключительно программно. вроде работает!
Duhas » 20 авг 2010, 19:55
дык естественно тут все решается исключительно программно.. либо аппаратно - если поддержка "квадратурного интерфейса" есть..
CiSi » 10 сен 2010, 18:02
Возникла очередная проблемка, да бы не создавать новую тему и не захламлять форум, задам вопрос тут: Данные с датчика требуется отправлять на комп - с этой задачей с горем на пополам справился. Так же требуется кое какие данные отправлять на внешнее устройство, обмен данными ведется через интерфейс 232 по USART, но вот эту задачу почему то не удается реализовать.При использовании процедуры getchar() программа виснет. помогите плиз.