Страница 1 из 1

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

Добавлено: Вт дек 22, 2015 01:57:06
savdm
Можно ли датчиком холла снимать обороты с обмоток коллекторного двигателя дремеля или другого гравера? - Не хочется на вал крепить неодимовый магнит . Обороты 8000-30000 регулируемые.
Или возможно кто-то подскажет более подходящий способ, есть сомнения, что датчик холла из DvD rom подходит.

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

Добавлено: Вт дек 22, 2015 02:05:08
m.ix
вешаем оптопару
и замазываем всё чорным
или лепим блестяшку

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

Добавлено: Вт дек 22, 2015 12:47:43
savdm
и 30000 будет считать?) :shock:
Нужен ик диод и фототранзистор? Или что то другое, посоветуйте.

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

Добавлено: Вт дек 22, 2015 13:54:02
arkhnchul
30000 в минуту - 500 в секунду. Не так уж и много.

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

Добавлено: Вт дек 22, 2015 15:30:26
savdm
Для магнита и датчика холла много:)) Что за оптопара?

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

Добавлено: Вт дек 22, 2015 17:34:42
arkhnchul
не сказать чтобы. В даташитах характерное время отклика - десяток микросекунд; положение роторов многофазных бесколлекторников ими вполне определяют :dont_know:
если оптопару - есть жеж готовые как на просвет, так и на отражение.

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

Добавлено: Ср дек 23, 2015 00:22:37
savdm
у меня с щетками, значит коллекторный)

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

Добавлено: Ср дек 23, 2015 03:13:09
m.ix
savdm писал(а):и 30000 будет считать?) :shock:.

Изображение

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

Добавлено: Вт янв 12, 2016 09:59:46
Соник
m.ix писал(а):
savdm писал(а):и 30000 будет считать?) :shock:.

Изображение
Схемой не поделишься? :oops:

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

Добавлено: Ср фев 03, 2016 23:35:22
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)
	{
	}
}