roboforum.ru

Технический форум по робототехнике.

AVR-MT-128_энкодер_продолжение

Re: AVR-MT-128

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;

}

Считает но далеко неправельно :(
что делаю не так?

Re: AVR-MT-128

CiSi » 05 май 2010, 20:04

с одним энкодером разобрался (HOA0901-012). :)
Изображение
теперь заимел инкрементный датчик скорости (энкодер) ЛИР-158 на 2500 имп/об.
Необходимо снимать с него данные без тормозов, так как прошивка для предъидущего датчика не справляется (достаточно сильно тормозит)? Как это сделать не представляю, подскажите плиз?

Re: AVR-MT-128

boez » 06 май 2010, 11:02

Частоты какие (вращения или импульсов)?

Re: AVR-MT-128

CiSi » 06 май 2010, 17:42

Датчик вращения на 2500 имп/об.

Добавлено спустя 57 секунд:
Max. частота вращения вала 10000 об/мин

Re: AVR-MT-128

CiSi » 07 май 2010, 17:03

Мах. частота выходного сигнала 2.5МГц.

Re: AVR-MT-128

*Egor* » 07 май 2010, 23:50

Max. частота вращения вала 10000 об/мин
Герцы это сколько раз в секунду!

Re: AVR-MT-128

galex1981 » 08 май 2010, 21:51

Герц это 1/сек

Re: AVR-MT-128

Duhas » 09 май 2010, 06:24

ТС продай энкодер )))))

я на электрониксе уже отписался )

Re: AVR-MT-128

CiSi » 10 май 2010, 19:47

Продать не могу, не мой - нужен для дела.
Хочется конечно программно реализовать болие менее нормальное ститывание данных с энкодера. С ПЛИС еще не работал.
Как сделать это программно?

Re: AVR-MT-128

Duhas » 10 май 2010, 20:29

ну программно только если забыть об остальных задачах..

самое нормальное на простой меге - вешать 1 канал на прерывание ...

Re: AVR-MT-128

CiSi » 10 май 2010, 21:39

У меня достаточно несложная задача: после обнуления счетчика подсчитать число импульсов и вывести его на LCD.

А как обработку прерывания описать?

Re: AVR-MT-128

blindman » 11 май 2010, 04:48

На таких скоростях мегой считать программно не получится. При скорости 9000 мин-1 времени хватит ровно на то, чтобы считать импульсы - больше МК ничем заниматься не успеет. Можно добавить пару корпусов логики как на схеме, и считать двумя аппаратными счетчиками - и вычитать один из другого. Только надо будет подумать, чтобы обломов не было при переполнении счетчиков.
Вложения
e.png
e.png (3.92 КиБ) Просмотров: 2358

Re: AVR-MT-128

CiSi » 11 май 2010, 09:24

Да, наверное так и придется сделать. Опишите пожалуйсто как работает схема и что выходитиз неё на мк? А то что-то непойму нечего.

Re: AVR-MT-128

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;
}


Re: AVR-MT-128

boez » 11 май 2010, 12:24

Да, страшное дело эта полупрограммная обработка энкодеров :) А чего 2.5 МГц? у меня 417 кГц вышло вроде... И АВР такое может быть даже потянет чисто программно, если его аккуратно замучать (там надо смотреть тактовую частоту, время входа в прерывание, ну и не запрещать прерывания нигде в программе, и обработчик на асме, в общем щас не скажу так мысленно - получится или нет).

Ну а вообще при таких частотах наверное надо аппаратный модуль, или на плис, или встроенный в МК (но тогда МК будет уже не авр, а какой-нить TMS320LF28xx ;) )


Rambler\'s Top100 Mail.ru counter