Тахометр гравера цифровой

Все прочитали, вроде даже поняли, взяли паяльник - а нифига не получается? Скорее сюда! Поможем. Чем можем...
Ответить
Встал на лапы
Сообщения: 88
Зарегистрирован: Чт апр 02, 2015 00:45:23

Сообщение savdm »

Можно ли датчиком холла снимать обороты с обмоток коллекторного двигателя дремеля или другого гравера? - Не хочется на вал крепить неодимовый магнит . Обороты 8000-30000 регулируемые.
Или возможно кто-то подскажет более подходящий способ, есть сомнения, что датчик холла из DvD rom подходит.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 16545
Зарегистрирован: Вт сен 07, 2010 03:01:06
Откуда: Moscow-Izmaylovo

Сообщение m.ix »

вешаем оптопару
и замазываем всё чорным
или лепим блестяшку
Лечу лечить WWWашу покалеченную технику.
Контактная информация:
Реклама
Встал на лапы
Сообщения: 88
Зарегистрирован: Чт апр 02, 2015 00:45:23

Сообщение savdm »

и 30000 будет считать?) :shock:
Нужен ик диод и фототранзистор? Или что то другое, посоветуйте.
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

30000 в минуту - 500 в секунду. Не так уж и много.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 88
Зарегистрирован: Чт апр 02, 2015 00:45:23

Сообщение savdm »

Для магнита и датчика холла много:)) Что за оптопара?
Реклама
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

не сказать чтобы. В даташитах характерное время отклика - десяток микросекунд; положение роторов многофазных бесколлекторников ими вполне определяют :dont_know:
если оптопару - есть жеж готовые как на просвет, так и на отражение.
Реклама
Встал на лапы
Сообщения: 88
Зарегистрирован: Чт апр 02, 2015 00:45:23

Сообщение savdm »

у меня с щетками, значит коллекторный)
Друг Кота
Аватара пользователя
Сообщения: 16545
Зарегистрирован: Вт сен 07, 2010 03:01:06
Откуда: Moscow-Izmaylovo

Сообщение m.ix »

savdm писал(а):и 30000 будет считать?) :shock:.

Изображение
Лечу лечить WWWашу покалеченную технику.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7576
Зарегистрирован: Пн мар 22, 2010 11:01:14
Откуда: СССР, г. Москва.

Сообщение Соник »

m.ix писал(а):
savdm писал(а):и 30000 будет считать?) :shock:.

Изображение
Схемой не поделишься? :oops:
Я рожден при социализме, и я этим горжусь!
Встал на лапы
Сообщения: 88
Зарегистрирован: Чт апр 02, 2015 00:45:23

Сообщение savdm »

Приехал, наконец-то вот такой датчик http://ru.aliexpress.com/item/Free-Ship ... 27899.html
Пробовал черное белое, на белом цифровой сигнал около 0, а на черном VCC. Теперь вот вопрос: внешние прерывания, какие использовать, а то пока у меня бредни получаются при выводе на экран.
Спойлер

Код: Выделить всё

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
	char flag =0;
	char pr=0;
	unsigned int rpm = 0;

// Команды для управления портами LCD
/* RS */
#define RS1 registr(0x01, 1)
#define RS0 registr(0x01, 0)

/* E */
#define E1 registr(0x02, 1)
#define E0 registr(0x02, 0)

/* D4 */
#define D41 registr(0x04, 1)
#define D40 registr(0x04, 0)

/* D5 */
#define D51 registr(0x08, 1)
#define D50 registr(0x08, 0)

/* D6 */
#define D61 registr(0x10, 1)
#define D60 registr(0x10, 0)

/* D7 */
#define D71 registr(0x20, 1)
#define D70 registr(0x20, 0)

// Функция установки курсора в указанную точку
#define lcd_gotoxy(x, y) write_to_lcd(0x80|((x)+((y)*0x40)), 0)

// Функция передачи данных в регистр
void registr(unsigned char data, unsigned char WriteOrErase)
{
	volatile static unsigned char tempdata = 0;
	
	if(WriteOrErase == 1)
	tempdata = (tempdata|data);
	else
	tempdata &= ~(data);
	PORTB &= ~(1 << PB1); // ST_CP 0

	PORTB &= ~(1 << PB3); // SH_CP 0
	if(tempdata & 0x80)PORTB |= (1 << PB0);
	else PORTB &= ~(1 << PB0);
	PORTB |= (1 << PB3); // SH_CP 1
	PORTB &= ~(1 << PB3); // SH_CP 0
	if(tempdata & 0x40)PORTB |= (1 << PB0);
	else PORTB &= ~(1 << PB0);
	PORTB |= (1 << PB3); // SH_CP 1
	PORTB &= ~(1 << PB3); // SH_CP 0
	if(tempdata & 0x20)PORTB |= (1 << PB0);
	else PORTB &= ~(1 << PB0);
	PORTB |= (1 << PB3); // SH_CP 1
	PORTB &= ~(1 << PB3); // SH_CP 0
	if(tempdata & 0x10)PORTB |= (1 << PB0);
	else PORTB &= ~(1 << PB0);
	PORTB |= (1 << PB3); // SH_CP 1
	PORTB &= ~(1 << PB3); // SH_CP 0
	if(tempdata & 0x08)PORTB |= (1 << PB0);
	else PORTB &= ~(1 << PB0);
	PORTB |= (1 << PB3); // SH_CP 1
	PORTB &= ~(1 << PB3); // SH_CP 0
	if(tempdata & 0x04)PORTB |= (1 << PB0);
	else PORTB &= ~(1 << PB0);
	PORTB |= (1 << PB3); // SH_CP 1
	PORTB &= ~(1 << PB3); // SH_CP 0
	if(tempdata & 0x02)PORTB |= (1 << PB0);
	else PORTB &= ~(1 << PB0);
	PORTB |= (1 << PB3); // SH_CP 1
	PORTB &= ~(1 << PB3); // SH_CP 0
	if(tempdata & 0x01)PORTB |= (1 << PB0);
	else PORTB &= ~(1 << PB0);
	PORTB |= (1 << PB3); // SH_CP 1
	PORTB |= (1 << PB1); // ST_CP 1
}

// Функция передачи данных или команды в LCD
void write_to_lcd(char p, unsigned char rs)
{
	if(rs == 1) RS1;
	else RS0;
	
	E1;

	if(p&0x10) D41; else D40;
	if(p&0x20) D51; else D50;
	if(p&0x40) D61; else D60;
	if(p&0x80) D71; else D70;
	E0;
	_delay_ms(2);
	
	E1;
	
	if(p&0x01) D41; else D40;
	if(p&0x02) D51; else D50;
	if(p&0x04) D61; else D60;
	if(p&0x08) D71; else D70;
	E0;

	_delay_ms(2);
}

// Функция инициализации LCD
void lcd_init(void)
{
	write_to_lcd(0x02, 0); // Курсор в верхней левой позиции
	write_to_lcd(0x28, 0); // Шина 4 бит, LCD - 2 строки
	write_to_lcd(0x0C, 0); // Разрешаем вывод изображения, курсор не виден
	write_to_lcd(0x01, 0); // Очищаем дисплей
}
void up_string(void)
{
	lcd_gotoxy(0, 0);
	write_to_lcd(rpm/10000+48,1);
	write_to_lcd(rpm%10000/1000+48,1);
	write_to_lcd(rpm%1000/100+48,1);
	write_to_lcd(rpm%100/10+48,1);
	write_to_lcd(rpm%10+48,1);
	rpm=0;
	pr=0;
	flag=0;
}
// Функция вывода строки
void lcd_puts(const char *str)
{
	unsigned char i = 0;

	while(str[i])
	write_to_lcd(str[i++], 1);
}
ISR(INT0_vect)
{
	rpm++;
}
ISR	(TIM0_OVF_vect)
{
	if (pr==30)
	{
		up_string();
	}
	else pr++;
}

int main(void)
{

	DDRB = 0b00001011; // Настраиваем входы/выходы

	lcd_init(); // Инициализация дисплея

	write_to_lcd(0x01, 0); // Очищаем дисплей

	lcd_gotoxy(0, 1); // Выводим строки на LCD
	lcd_puts("rpm");
TCCR0B=0x05;
TIMSK=0x02;
GIMSK=0x40;
MCUCR=0x00;
sei();
	while(1)
	{
	}
}

Ответить

Вернуться в «Практика»