Или возможно кто-то подскажет более подходящий способ, есть сомнения, что датчик холла из DvD rom подходит.
Тахометр гравера цифровой
- Сообщения: 88
- Зарегистрирован: Чт апр 02, 2015 00:45:23
Можно ли датчиком холла снимать обороты с обмоток коллекторного двигателя дремеля или другого гравера? - Не хочется на вал крепить неодимовый магнит . Обороты 8000-30000 регулируемые.
Или возможно кто-то подскажет более подходящий способ, есть сомнения, что датчик холла из DvD rom подходит.
Или возможно кто-то подскажет более подходящий способ, есть сомнения, что датчик холла из DvD rom подходит.
- Реклама
вешаем оптопару
и замазываем всё чорным
или лепим блестяшку
и замазываем всё чорным
или лепим блестяшку
Лечу лечить WWWашу покалеченную технику.
- Сообщения: 88
- Зарегистрирован: Чт апр 02, 2015 00:45:23
и 30000 будет считать?) 
Нужен ик диод и фототранзистор? Или что то другое, посоветуйте.
Нужен ик диод и фототранзистор? Или что то другое, посоветуйте.
- Сообщения: 88
- Зарегистрирован: Чт апр 02, 2015 00:45:23
- Реклама
не сказать чтобы. В даташитах характерное время отклика - десяток микросекунд; положение роторов многофазных бесколлекторников ими вполне определяют
если оптопару - есть жеж готовые как на просвет, так и на отражение.
если оптопару - есть жеж готовые как на просвет, так и на отражение.
- Сообщения: 88
- Зарегистрирован: Чт апр 02, 2015 00:45:23
savdm писал(а):и 30000 будет считать?).

Лечу лечить WWWашу покалеченную технику.
Схемой не поделишься?m.ix писал(а):savdm писал(а):и 30000 будет считать?).
Я рожден при социализме, и я этим горжусь!
- Сообщения: 88
- Зарегистрирован: Чт апр 02, 2015 00:45:23
Приехал, наконец-то вот такой датчик http://ru.aliexpress.com/item/Free-Ship ... 27899.html
Пробовал черное белое, на белом цифровой сигнал около 0, а на черном VCC. Теперь вот вопрос: внешние прерывания, какие использовать, а то пока у меня бредни получаются при выводе на экран.
Пробовал черное белое, на белом цифровой сигнал около 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)
{
}
}


