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

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

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;

}

Считает но далеко неправельно :(
что делаю не так?
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

Re: AVR-MT-128

Сообщение CiSi » 05 май 2010, 20:04

с одним энкодером разобрался (HOA0901-012). :)
Изображение
теперь заимел инкрементный датчик скорости (энкодер) ЛИР-158 на 2500 имп/об.
Необходимо снимать с него данные без тормозов, так как прошивка для предъидущего датчика не справляется (достаточно сильно тормозит)? Как это сделать не представляю, подскажите плиз?
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

Re: AVR-MT-128

Сообщение boez » 06 май 2010, 11:02

Частоты какие (вращения или импульсов)?
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: AVR-MT-128

Сообщение CiSi » 06 май 2010, 17:42

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

Добавлено спустя 57 секунд:
Max. частота вращения вала 10000 об/мин
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

Re: AVR-MT-128

Сообщение CiSi » 07 май 2010, 17:03

Мах. частота выходного сигнала 2.5МГц.
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

Re: AVR-MT-128

Сообщение *Egor* » 07 май 2010, 23:50

Max. частота вращения вала 10000 об/мин
Герцы это сколько раз в секунду!
*Egor*
 
Сообщения: 5
Зарегистрирован: 10 мар 2010, 15:54
Откуда: С-Пб.
прог. языки: ASM
ФИО: Егор

Re: AVR-MT-128

Сообщение galex1981 » 08 май 2010, 21:51

Герц это 1/сек
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4363
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

Re: AVR-MT-128

Сообщение Duhas » 09 май 2010, 06:24

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

я на электрониксе уже отписался )
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: AVR-MT-128

Сообщение CiSi » 10 май 2010, 19:47

Продать не могу, не мой - нужен для дела.
Хочется конечно программно реализовать болие менее нормальное ститывание данных с энкодера. С ПЛИС еще не работал.
Как сделать это программно?
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

Re: AVR-MT-128

Сообщение Duhas » 10 май 2010, 20:29

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

самое нормальное на простой меге - вешать 1 канал на прерывание ...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: AVR-MT-128

Сообщение CiSi » 10 май 2010, 21:39

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

А как обработку прерывания описать?
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

Re: AVR-MT-128

Сообщение blindman » 11 май 2010, 04:48

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

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: AVR-MT-128

Сообщение CiSi » 11 май 2010, 09:24

Да, наверное так и придется сделать. Опишите пожалуйсто как работает схема и что выходитиз неё на мк? А то что-то непойму нечего.
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

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

Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: AVR-MT-128

Сообщение boez » 11 май 2010, 12:24

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

Ну а вообще при таких частотах наверное надо аппаратный модуль, или на плис, или встроенный в МК (но тогда МК будет уже не авр, а какой-нить TMS320LF28xx ;) )
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7