Отговори на тема  [ 24 мнения ]  Отиди на страница Предишна  1, 2
Търся някой да доработи DRO проекта от форума 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Ное 27, 2012 9:27 pm
Мнения: 2011
Мнение Re: Търся някой да доработи DRO проекта от форума
Дай кода да го пробвам, може и това да е проблема иначе схемата на снимката е почти като моята схема.


Пон Фев 20, 2017 11:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Търся някой да доработи DRO проекта от форума
Кода е на любимия ми Pascal :D
Ще трябва да се потрудиш съвсем малко ;)

Код:
{************************************
*                                   *
*  This file provides a             *
*  FRP /encoder/ functions for      *
*  STS_211-06/12 Extended Counter   *
*                                   *
*  16 - Mar - 2007`                 *
*  PIC18F2620 @ 40 MHz              *
*  MikroPascal v6.0.0.2             *
*                                   *
*  rsrachev    gmail       *
*                                   *
************************************}
unit frp_211;

uses definitions_211, counters_file;

const
  FRP_ENABLE         : byte = 0;
  FRP_ENABLED        : byte = 1;
  FRP_DISABLED       : byte = 0;
  //FRP_ONLINE         : byte = 1;
  //FRP_OFFLINE        : byte = 0;
 
var
  frp_input_A_now, frp_input_A_pre, frp_input_A      : word;  // TIMER3
  frp_input_B_now, frp_input_B_pre, frp_input_B      : word;  // TIMER0
  frp_UP, frp_DOWN                                   : word;  // |A - B|
  in_A_L, in_A_H, in_B_L, in_B_H                     : byte;
  input_divider_UP_counter, input_divider_DOWN_counter               : word;
  FRP_MODULE_ENABLED                                 : byte; register;

implementation

procedure FRP_Init(var frp_port : byte; frp_pin : byte; frp_online : boolean);
var
  ddr_port : ^byte;  //a pointer to TRIS REG
begin
  ddr_port := @frp_port + TRIS_OFFSET;  //Get TRIS address
  ddr_port^.frp_pin := 0;
  if frp_online then
    begin
      //TMR0H := 0; TMR0L := 0;
      //TMR3H := 0; TMR3L := 0;
      frp_input_A_pre := 0;
      frp_input_B_pre := 0;
      input_divider_UP_counter := 1;
      input_divider_DOWN_counter := 1;
      CCP1CON := 0;
      CCPR1H := 0; CCPR1L := 0;
      T0CON := %10101000;
      T3CON := %10000011;  //16 bit mode with sync input!!!
      frp_port.frp_pin := FRP_ENABLED;
      FRP_MODULE_ENABLED := True;
      TMR0H := 0; TMR0L := 0;  //moved here to solve bug 'count at startup'
      TMR3H := 0; TMR3L := 0;
    end
  else
    begin
      T0CON.TMR0ON := 0;
      T3CON.TMR3ON := 0;
      frp_port.frp_pin := FRP_DISABLED;
      FRP_MODULE_ENABLED := False;
     
      ddr_port^.frp_pin := 1;
    end;
end;

procedure FRP_Handle;
begin
  if direction_1_value = _FORWARD then  //change count direction
    begin
      in_A_L := TMR3L; in_A_H := TMR3H;
      in_B_L := TMR0L; in_B_H := TMR0H;
    end
  else
    begin
      in_A_L := TMR0L; in_A_H := TMR0H;
      in_B_L := TMR3L; in_B_H := TMR3H;
    end;
 
  frp_input_A_now := 0;
  frp_input_A_now := (in_A_H shl 8) + in_A_L;

  frp_input_B_now := 0;
  frp_input_B_now := (in_B_H shl 8) + in_B_L;

  //frp_UP := 0;
  //if PIR1.TMR1IF = 0 then  //frp_input_A_now >= frp_input_A_pre then
    //begin
      frp_UP := frp_input_A_now - frp_input_A_pre;
    //end
  //else
    //begin
      //frp_UP := $FFFF - frp_input_A_pre;
      //frp_UP := frp_UP + frp_input_A_now + 1;
      //PIR1.TMR1IF := 0;
    //end;
   
  //if INTCON.TMR0IF = 0 then  //frp_input_B_now >= frp_input_B_pre then
    frp_DOWN := frp_input_B_now - frp_input_B_pre;
  //else
    //begin
      //frp_DOWN := $FFFF - frp_input_B_pre;
      //frp_DOWN := frp_DOWN + frp_input_B_now + 1;
      //INTCON.TMR0IF := 0;
    //end;
   
  //limes check ?
  {if (frp_UP >= 1) or (frp_DOWN >= 1) then
    begin
      STACK[0] := ADD_TASK_Dispatcher;
      ADD_TASK_Dispatcher := TASK_CHECK_LIMES_ON_REVERSE_MODES;
    end;}

  frp_input_A_pre := frp_input_A_now;
  frp_input_B_pre := frp_input_B_now;
  if frp_DOWN > frp_UP then
    direction_1 := BACKWARD;
  if frp_DOWN < frp_UP then
    direction_1 := _FORWARD;
    //begin
      //frp_DOWN := frp_DOWN - frp_UP;
      while (frp_DOWN >= 1) do
        begin
          Inc(input_divider_DOWN_counter);
          input_divider_UP_counter := input_divider_1_value - input_divider_DOWN_counter + 1;
          if input_divider_DOWN_counter > input_divider_1_value then
            begin
              input_divider_UP_counter := 1;
              input_divider_DOWN_counter := 1;
              if prescaler_1_in_use then
                Multiply_Counter_1_On_Dec
              else
                Dec_Counter_1;
            end;
          Dec(frp_DOWN);
         
          {STACK[0] := ADD_TASK_Dispatcher;
          ADD_TASK_Dispatcher := TASK_CHECK_LIMES_ON_REVERSE_MODES;}
        end;
    //end
  //else
    //begin
      //frp_UP := frp_UP - frp_DOWN;
      while (frp_UP >= 1) do
        begin
          Inc(input_divider_UP_counter);
          input_divider_DOWN_counter := input_divider_1_value - input_divider_UP_counter + 1;
          if input_divider_UP_counter > input_divider_1_value then
            begin
              input_divider_UP_counter := 1;
              input_divider_DOWN_counter := 1;
              if prescaler_1_in_use then
                Multiply_Counter_1
              else
                Inc_Counter_1;
            end;
          Dec(frp_UP);
         
         
          {STACK[0] := ADD_TASK_Dispatcher;
          ADD_TASK_Dispatcher := TASK_CHECK_LIMES_ON_REVERSE_MODES;}
          {if ADD_TASK_Dispatcher <> TASK_CHECK_LIMES_ON_REVERSE_MODES then
            begin
              STACK[0] := ADD_TASK_Dispatcher;
              ADD_TASK_Dispatcher := TASK_CHECK_LIMES_ON_REVERSE_MODES;
            end;}
        end;
    //end;
   

end;

procedure FRP_Set;
begin
  if MAIN_TASK_Dispatcher = ENCODER_MODE then
    FRP_Init(PORTA, FRP_ENABLE, True)
  else
    FRP_Init(PORTA, FRP_ENABLE, False);
end;

end.


Вто Фев 21, 2017 12:17 am
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Ное 27, 2012 9:27 pm
Мнения: 2011
Мнение Re: Търся някой да доработи DRO проекта от форума
Това беше извратено. :D Хубаво е че съм Делфи-ст :D
Пусни ми хекса за да направя симулацията.
Между другото схемата която си дал е схема на самия енкодер а аз такъв имам и то много прецизен. Проблема е над 1000 об/мин да речем на ниските обороти се справя чудесно.


Вто Фев 21, 2017 1:50 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Търся някой да доработи DRO проекта от форума
Hex не мога да ти дам, а и няма да ти свърши работа.
И схемата и софтуера са малка част от доста по голям проект, който някога съм разработвал... минали 10 години като гледам, датата, а все едно беше вчера....

http://www.stselectronics.eu/Programiruemi-broyachi/Programiruemi/Programiruem-broyach-STS-211-12.php

Гледам сме дали 500kHz по спецификация, но това беше, защото EPIQ искаха 400. Иначе съм го тествал на няколко MHz със енкодер 2500 имп/оборот. Доколкото си спомням, енкодера (на ЗГПУ) удържаше до към 2000 оборота.....

А и няма какво да те мързи да преведеш 20 реда.
Частта с while (...) направо я изхвърляш. Инициализация и четенето. И се съобрази с коментарите.


Вто Фев 21, 2017 9:13 am
Профил ICQ WWW
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Юли 13, 2016 4:42 pm
Мнения: 37
Мнение Re: Търся някой да доработи DRO проекта от форума
Момчета, а на мен ми трябва система която да може да чете стандартен квадратурен енкодер и да го изкара на LCD 2x16 примерно. Аз имам китайска оптична линия с изходи А и В, стандартно ТТЛ ниво 5 волта. Сигналите са стандартни:
Изображение
От сигналите А и Б на енкодера по принцип могат да се извадят 4 пъти по-фини стойности на линейното преместване (четем всеки фронт).
Искам да може да показва преместването в мм, ще се нагажда с коефициент (брой импулси на линейно преместване).

Необходимо е да има поне бутон за зануляване по всяка ос - като го натисна, да стане всичко 000.00 мм и да почне да брои от това положение.

Искам да може да чете 2 енкодера едновременно на общ LCD и да показва преместването в мм. Иначе ако не може да е 2 канално, ще направя за всяка ос по 1 индивидуален четец и толкова, със собствен LCD.

За преместването в мм - в програмата ще трябва да се въвежда коефициент, примерно 1 стъпка от енкодера да отговаря да кажем на 0.01 мм (зависи от енкодера разбира се).
Трябва да може да брои напред и назад.

Опционално: ако може да се доработи така, че да му се добави клавиатура и вместо нулиране да може да се въвеждат конкретни стойности, примерно 153.58мм и да почне да брои от тях нагоре и надолу, ще е супер, понеже такава опция по принцип си трябва, но ако не може здраве да е.


Вто Фев 21, 2017 9:55 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Търся някой да доработи DRO проекта от форума
@Eddie

Два брояча от линка по - горе (6 разрядни ) могат да ти свършат работа. Имат дробен множител и може да се настроят да показват в мм. Има и опция за избор на позицията на десетичната точка. През интерфейса може да се зададе начална стойност. Нулиране чрез бутон, вход или през интерфейса, опция за забрана. Недостатъци : не е LCD; под 0 не брои в минус, а от 999999 надолу; размера и вида на кутиите сигурно няма да е подходящ за монтиране където ти трябва; трябва да се добави управление през интерфейса; аз не печеля нищо :lol:

Другия вариант..... мога да ти разработя системата с конкретните изисквания.


Сря Фев 22, 2017 1:47 am
Профил ICQ WWW
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Юли 13, 2016 4:42 pm
Мнения: 37
Мнение Re: Търся някой да доработи DRO проекта от форума
relsys написа:
@Eddie
Другия вариант... мога да ти разработя системата с конкретните изисквания.

Това май е единственият свестен вариант, защото броенето под 0 трябва да е с минус и да нараства от 0.


Пон Фев 27, 2017 2:09 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Сря Юли 13, 2016 4:42 pm
Мнения: 37
Мнение Re: Търся някой да доработи DRO проекта от форума
На какъв език и компилатор пишеш?


Пон Фев 27, 2017 2:10 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Търся някой да доработи DRO проекта от форума
Eddie написа:
На какъв език и компилатор пишеш?


'С'.


Пон Фев 27, 2017 5:31 pm
Профил ICQ WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 24 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 10 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни