Технический форум по робототехнике.
CiSi » 02 май 2010, 20:36
Сделал от прерывания, вот код:
- Код: Выделить всё • Развернуть
#include<mega128.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
unsigned char q;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
q=q+1;
}
int main()
{
char w[1];
DDRA=0x00;
PORTA=0x00;
DDRD=0x00;
PORTD=0xFF;
DDRB=0xF0;
PORTB=0x00;
DDRE = 0b00110000;
PORTE = 0b00100000;
lcd_init(16);
lcd_gotoxy(5,0);
lcd_putsf("Hello!");
delay_ms(3000);
while(1) {
q=0;
lcd_clear();
lcd_putsf("_ 1 _ 2 _ 3 _");
delay_ms(10);
if (!(PINA & 0b00000001)) { //Пуск
lcd_clear();
lcd_putsf("_ 1 _");
delay_ms(1000);
while(PINA.1==1){ //Стоп
SREG.7 = 1;
EIMSK = 0x01;
EICRA = 0x0C;
EICRB = 0x0C;
}
while(PINA & 0b00000100){ //Сброс
lcd_clear();
EIMSK = 0x00;
sprintf(w,"adc= %d\n",q);
lcd_puts(w);
delay_ms(50);
}
lcd_clear();
lcd_putsf("_ 3 _");
delay_ms(2000);
}
}
return 0;
}
Считает но далеко неправельно
что делаю не так?
CiSi » 05 май 2010, 20:04
с одним энкодером разобрался (HOA0901-012).
теперь заимел инкрементный датчик скорости (энкодер) ЛИР-158 на 2500 имп/об.
Необходимо снимать с него данные без тормозов, так как прошивка для предъидущего датчика не справляется (достаточно сильно тормозит)? Как это сделать не представляю, подскажите плиз?
boez » 06 май 2010, 11:02
Частоты какие (вращения или импульсов)?
CiSi » 06 май 2010, 17:42
Датчик вращения на 2500 имп/об.
Добавлено спустя 57 секунд:
Max. частота вращения вала 10000 об/мин
CiSi » 07 май 2010, 17:03
Мах. частота выходного сигнала 2.5МГц.
*Egor* » 07 май 2010, 23:50
Max. частота вращения вала 10000 об/мин
Герцы это сколько раз в секунду!
galex1981 » 08 май 2010, 21:51
Герц это 1/сек
Duhas » 09 май 2010, 06:24
ТС продай энкодер )))))
я на электрониксе уже отписался )
CiSi » 10 май 2010, 19:47
Продать не могу, не мой - нужен для дела.
Хочется конечно программно реализовать болие менее нормальное ститывание данных с энкодера. С ПЛИС еще не работал.
Как сделать это программно?
Duhas » 10 май 2010, 20:29
ну программно только если забыть об остальных задачах..
самое нормальное на простой меге - вешать 1 канал на прерывание ...
CiSi » 10 май 2010, 21:39
У меня достаточно несложная задача: после обнуления счетчика подсчитать число импульсов и вывести его на LCD.
А как обработку прерывания описать?
blindman » 11 май 2010, 04:48
На таких скоростях мегой считать программно не получится. При скорости 9000 мин-1 времени хватит ровно на то, чтобы считать импульсы - больше МК ничем заниматься не успеет. Можно добавить пару корпусов логики как на схеме, и считать двумя аппаратными счетчиками - и вычитать один из другого. Только надо будет подумать, чтобы обломов не было при переполнении счетчиков.
- Вложения
-
- e.png (3.92 КиБ) Просмотров: 2358
CiSi » 11 май 2010, 09:24
Да, наверное так и придется сделать. Опишите пожалуйсто как работает схема и что выходитиз неё на мк? А то что-то непойму нечего.
blindman » 11 май 2010, 10:00
При вращении вала в одну сторону, единица на прямом выходе триггера, при вращении в другую - на инверсном. Соответственно импульсы будут на одном из двух выходов схемы в зависимости от направления вращения. Импульсы подаем на входы двух 16-битных счетчиков МК. По прерыванию при переполнении счетчиков программно увеличиваем 16-битные переменные, в результате имеем 2 32-битных счетчика. Разность между этими счетчиками дает положение вала. Самое сложное здесь - правильно отловить переполнение аппаратных счетчиков в момент чтения положения.
Добавлено спустя 14 минут:Примерно вот так
- Код: Выделить всё • Развернуть
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
uint16_t ctr_plus, ctr_minus;
ISR(SIG_OVERFLOW3)
{
ctr_plus++;
}
ISR(SIG_OVERFLOW1)
{
ctr_minus++;
}
int32_t read_position()
{
uint32_t plus, minus;
cli();
plus = TCNT3;
if (plus < 0x7FFF) {
if (ETIFR & (1 << TOV3)) {
plus += 0x10000U;
}
}
plus += (uint32_t)ctr_plus << 16;
minus = TCNT1;
if (minus < 0x7FFF) {
if (TIFR & (1 << TOV1)) {
minus += 0x10000U;
}
}
minus += (uint32_t)ctr_minus << 16;
sei();
return plus - minus;
}
boez » 11 май 2010, 12:24
Да, страшное дело эта полупрограммная обработка энкодеров
А чего 2.5 МГц? у меня 417 кГц вышло вроде... И АВР такое может быть даже потянет чисто программно, если его аккуратно замучать (там надо смотреть тактовую частоту, время входа в прерывание, ну и не запрещать прерывания нигде в программе, и обработчик на асме, в общем щас не скажу так мысленно - получится или нет).
Ну а вообще при таких частотах наверное надо аппаратный модуль, или на плис, или встроенный в МК (но тогда МК будет уже не авр, а какой-нить TMS320LF28xx
)