Thread Rating:
  • 1 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Relejni atenuator
#61
Evo ideje da sredimo to forumski.
Imam od nekud skinutu verziju softwera Codewheel kojim se može vrlo lako odraditi inkrementalni ili apsolutni enkoder tako što bi se dobijeni izlazni fajl odštampao na providnoj foliji.
Sa jedne strane folije postavimo reflektivni senzor i odatle pokupimo signal. Za apsolutni enkoder veće rezolucije bi išlo više ovakvih senzora. Ako imamo nekog veštog da dizajnira kućište koje se može odštampati na 3D štampaču eto kompletnog rešenja.
Evo primera za senzor:

https://uk.rs-online.com/web/p/reflectiv...s/1241360/

a evo kako izgleda codewheel i generisani fajl za apsolutni enkoder sa 8 koraka za pun krug.


Attached Files Thumbnail(s)

Reply
#62
Evo pokušaću ja da nacrtam kućište ali treba mi gomila detalja koje morate da usvojite kako bih znao šta sve mora da udje u kućište.
Reply
#63
Ne zanosite se crtkaranjem enkodera.
Optički enkoderi su "malko" komplikovaniji od vaših zamisli, barem što se konstrukcije tiče. Kreću se u rezolucijama od sitnih pa do 2000+ LPR.
Za očitavanje viših rezolucija potrebna je ozbiljnija optika od LED/Foto dioda(tranzistor) kombinacije.
Make no mistake between my personality and my attitude.
My personality is who I am.
My attitude depends on who you are.

塞爾維亞文
Reply
#64
Ukucajte u Google "3d printed optical encoder" izacice vam svasta ...

U sustini "pravi" opticki enkoder ne moze da se napravi tek-tako, mehanicki je zahtevno ...

A sto bi to radili, "da ustedimo"? Sta stedimo? Vreme sigurno ne stedimo ...

Onaj enkoder je IP50 otporan na prasinu i vlagu, ima lezajeve, ima opticki disk koji je ufasovan u mikron ...
Reply
#65
Drugari, možda se previše mešam u topic koga nisam lično pokrenuo, ali ja zaista mislim da je rešenje da se lepo upregne ova "bagatelna" varijanta kineskih enkodera od 1 Eura, iz par razloga:
1. Ima ih svuda po kupujem prodajem, aliexpress, ebay, kelcu,
2. Takođe ima u Cometu uvek isti, zeleni, koji za sada ne rade, ali napravićemo ih
3. Ima ih u TME, Farnell itd... po cenama od 2 Eura, a i ALPS za par eura više od koga očekujemo da mogu duže da se eksploatišu mehanički, tj. godinama da rade.

Sve preko toga mislim da spada u overkill za ovaj projekat.
Reply
#66
Možemo li da utičemo na dodavanje mogućnosti ovog projekta, u smislu ideja? Recimo, kontrola daljincem, vremenska konstanta (podesiva) okidanja nekih releja, itd...
Reply
#67
(04-30-2021, 11:41 AM)BeliNinja Wrote: Evo pokušaću ja da nacrtam kućište ali treba mi gomila detalja koje morate da usvojite kako bih znao šta sve mora da udje u kućište.

Za odgovor svima citiraću sebe. Dakle, meni je sve jedno šta ću crtati i da li je opravdano ili ne. Samo sam hteo da pomognem projekat. Ako bude došlo do crtanja, tu sam. A svakako podržavam Mikijevu ideju za one industrijske "skupe" enkodere koji će da traju dugo.
Reply
#68
Hardware i firmware u sustini podrzavaju bilo koju vrstu enkodera, i zelene i opticke i magnetne ... Smile
Na vama je da izaberete koji ce da stavite ... Ja sam probao sve osim magnetnih i prepricao sam vam kako/sta radi ...
Sa mehanickim ce najvise problema i bugova da ima, ko voli sprave koje bagiraju neka stavi to ... ceo zivot ispravljam svoje a i tudje bagove ... ja znam sta cu da stavim kod sebe Smile
Reply
#69
Da li je neko probao male step motore da upotrebi kao encoder.
Reply
#70
(04-30-2021, 04:03 PM)Boban Wrote: Možemo li da utičemo na dodavanje mogućnosti ovog projekta, u smislu ideja? Recimo, kontrola daljincem, vremenska konstanta (podesiva) okidanja nekih releja, itd...

ne bi išao na to bar ne u ovoj temi. neka ljudi svode ka kraju svoju zamisao kad im već ide ovako dobro,jer će inače i ova tema da potone pod teretom želja.
ako želiš nešto drugačije,otvori novu temu.
"Претпоставка је мајка зајеба..." : Д.В. - Дуд
🇷🇸 🇷🇸 🇷🇸
"Pretpostavka je majka zajeba..." : D.V. - Dude
Reply
#71
Hehe, ne terajte me sad za inat da uvedem i Z-index sinhronizaciju za opticki enkoder (ona jos jedna zica sto je zamotana ispod lepljive trake) jer mi je taj deo programa inace zakomentarisan a postoji : ) .. To je za apsolutnu sinhronizaciju i prevenciju kumulativne greske ...
Salim se malo, to je za mehatroniku potrebno ...
Reply
#72
Ovaj kod sam testirao sa Comet zelenim enkoderom, oznaka ED1112S-20. Nucleo ploča sa STM32L073RZ.
Na ENCA i ENCB pinovima sam koristio interne pull-up otpornike i koristim QEI na TIM2 modulu. Pinovi su PA0 i PA1 za ENCA i ENCB.

Jedna rotacija pravi jedan korak ka +, odnosno jedna rotacija radi jedan korak ka -. Nema preskakanja, nema skakanja, "divljanja". Lepo jedan po jedan inkrement.
Dodatno, kada se izvrši rotacija punog kruga, generiše se interapt rutina koja broji broj punih krugova, tako da je sa ovim enkoderom moguće izbrojati od - do + u celom opsegu signed long vrednosti što je u brojkama -2,147,483,648 to 2,147,483,647

Code:
#define MAXCNT (20u * 4u)// 20 impulsa po obrtaju x 4 jer se inkrement radi u QEI x 4

signed int Get_QEI_POS(void)
{
    signed int tmp;

    tmp = MAXCNT;
    tmp *= QEI_FullTurn;
    tmp += (TIM2->CNT);

    return(tmp >> 2);
}

int main(void)
{

  /* USER CODE BEGIN 1 */
    static unsigned char Counter = 0;
    
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_USART2_UART_Init();
  MX_TIM6_Init();
  MX_TIM7_Init();

  /* USER CODE BEGIN 2 */
 
    if(HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL) != HAL_OK)
    {
        Error_Handler();
    }

    __HAL_TIM_CLEAR_FLAG(&htim2, TIM_IT_UPDATE);
    __HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE); 

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
        if(na_100ms)
        {
            na_100ms = 0;
            HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
            
            sprintf(UARTBuff, "Test %03u, Get_QEI_POS: %05d, QEI_FullTurn: %05d\r\n", Counter++, Get_QEI_POS(), QEI_FullTurn);
            USART2_Puts(UARTBuff);
            
        }
            
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}


/* TIM2 init function */
static void MX_TIM2_Init(void)
{

  TIM_Encoder_InitTypeDef sConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = MAXCNT;//0xFFFF;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    
  sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC1Filter = 0x0F;
    
  sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC2Filter = 0x0F;
    
  if (HAL_TIM_Encoder_Init(&htim2, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
* @brief This function handles TIM2 global interrupt.
*/
void TIM2_IRQHandler(void)
{
  /* USER CODE BEGIN TIM2_IRQn 0 */

  /* USER CODE END TIM2_IRQn 0 */
  HAL_TIM_IRQHandler(&htim2);
  /* USER CODE BEGIN TIM2_IRQn 1 */
    
    if(TIM2->CR1 & TIM_CR1_DIR)
    {
        QEI_FullTurn--;
    }
    else
    {
        QEI_FullTurn++;
    }

  /* USER CODE END TIM2_IRQn 1 */
}
Reply
#73
Sad me kopka da li je do kontrolera ili do programa a ne mogu da probam ni jedno ni drugo ... : )
Probaj na Pilulici ...
Reply
#74
Nebojša, inicijalizacija tajmera u qei modu i IRQHandler nam je potpuno isti. Ja samo koristim TIM3 na onoj tvojoj pločici za mikroampermetar. Ipak mislim da je do enkodera. Nije važno sve ovo ali nervira kad ne možeš da se pouzdaš da će da radi uvek kako treba.
Reply
#75
Jos jednom sam probao zeleni sa istim program koji koristim za opticki samo samo promenio broj impulsa (TIM2->ARR) sa 200 na 4 i ukljucio kvadraturni mode i to nije dobro radilo, uhvatim ga u jednom polozaju gde recimo totalno ne konta da mrdam enkoder korak napred-nazad, 20 puta probam 1 korak napred-nazad ne skonta, probam malo vise koraka on proradi lepo pa posle opet brljavi ...

Probao sam i zadnju opciju a to je da TIM2->ARR stavim na 2 i iskljucio kvadraturni mode, e to vec radi malo bolje, nisam ga jos uhvatio da zaglupi!!! Wink

BTW: Za QEI mode rada kod TIMx imaju posebni registri sa preskaler (TIM_CCMR1_IC1PSC_0 i TIM_CCMR1_IC2PSC_0 ) koji rade kako treba, onaj "glavni" TIM2->PSC se ne dira i ostaje 0.
Reply
#76
Evo kako trenutno izgleda konfiguracija za TIM2 i interupt rutina, tu je nadogradjeno za ostale potrebe oko edit moda i menu, glavne stvari su tu resene. Tu je implementiran i histerezis!

Code:
void TIM2_Setup_ENC (void) {
   //ukljuci clock za TIM4
   RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
   
   //konfiguracija GPIO ...

   //konfiguracija za TIM2 kao enkoder
   TIM2->ARR  = ENC_IMPS_PER_STEP; //auto reload vrednost 200
   TIM2->PSC  = 0; //preskaler
   TIM2->EGR  = TIM_EGR_UG; //generisi update event
   TIM2->CNT  = ENC_IMPS_PER_STEP_HALF; //set start count (mora posle EGR!)
   TIM2->CCER = 0; //input capture on rising edge
   TIM2->CCMR1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0;//input configuration
    TIM2->CCMR1 |= TIM_CCMR1_IC1F_Msk | TIM_CCMR1_IC2F_Msk;//input MAX FILTER configuration
    //TIM2->CCMR1 |= TIM_CCMR1_IC1PSC_0 | TIM_CCMR1_IC2PSC_0;//input prescaler
   TIM2->SMCR     = 2; //Encoder Mode 3, update na obe ivice = 4Q mode, 2=normal
   TIM2->DIER     |= TIM_DIER_UIE; //enable update interupt

   TIM2->SR &=~ TIM_SR_UIF;//clear flag

   //Enable TIM interrupt
   NVIC_EnableIRQ(TIM2_IRQn); //enable channel
   NVIC_SetPriority(TIM2_IRQn, 1); //interupt priority

   //run
   TIM2->CR1     |= TIM_CR1_CEN; //ENABLE tim periferial
}

//---------- TIM2 IRQ -----------------
void TIM2_IRQHandler (void){   

   if (TIM2->SR & TIM_SR_UIF) {//update interupt
      if (TIM2->CR1 & TIM_CR1_DIR) {//koji je smer
            TIM2->CNT = ENC_IMPS_PER_STEP_HALF; //put on half for hysteresis
            if (menu_active) {
                if (!edit_active) {
                    MyData[MENU] --;
                } else {
                    MyData[MyData[MENU]+1] ++;
                }
            } else {
                MyData[VOLUME] ++;
            }
      } else {
            TIM2->CNT = ENC_IMPS_PER_STEP_HALF; //put on half for hysteresis
            if (menu_active) {
                if (!edit_active) {
                    MyData[MENU] ++;
                } else {
                    MyData[MyData[MENU]+1] --;
                }
            } else {
                MyData[VOLUME] --;
            }
      }

        //Limiti (ovo moze da se optimizuje da radi samo za izabranu stavku u tom trenutku)
        if (MyData[VOLUME] > 0 ) MyData[VOLUME] = 0;
        if (MyData[VOLUME] < -64 ) MyData[VOLUME] = -64;
        if (MyData[MENU] > 3 ) MyData[MENU] = 3;
        if (MyData[MENU] < 0 ) MyData[MENU] = 0;
        if (MyData[OVERLAP] > 100 ) MyData[OVERLAP] = 100;
        if (MyData[OVERLAP] < 0 ) MyData[OVERLAP] = 0;
        if (MyData[DELAY] > 255 ) MyData[DELAY] = 255;
        if (MyData[DELAY] < 0 ) MyData[DELAY] = 0;
        if (MyData[SLOPE] > 255 ) MyData[SLOPE] = 255;
        if (MyData[SLOPE] < 0 ) MyData[SLOPE] = 0;

        TIM2->SR &=~ TIM_SR_UIF;//clear flag

        //reset timer for last update (za auto edit-off, stedi jedan klik!)
        SW_timers[2] = 0;

    }
}
Reply
#77
(04-30-2021, 10:14 PM)mikikg Wrote: Sad me kopka da li je do kontrolera ili do programa a ne mogu da probam ni jedno ni drugo ... : )
Probaj na Pilulici ...

  Vidim da si već rešio, ali probaću svakako, imam negde Blue Pill... I mene kopka kako to radi sa HW QEI, imam jedan projekat u najavi sa STM32H755 gde trebam da postavim dva enkodera za upravljanje.

(04-30-2021, 10:48 PM)gorankg Wrote: Nebojša, inicijalizacija tajmera u qei modu i IRQHandler nam je potpuno isti. Ja samo koristim TIM3 na onoj tvojoj pločici za mikroampermetar. Ipak mislim da je do enkodera. Nije važno sve ovo ali nervira kad ne možeš da se pouzdaš da će da radi uvek kako treba.

  Ne bih ja bio tako uporan da sam nesiguran u ove enkodere Smile Više godina ih koristim za raznorazne projekte, a recimo jedan pozitivan primer je da sam pre par godina prijatelju za koga sam izradio neke tajmere sa tasterima pre desetak godina, prebacio uređaj na upravo ove enkodere. Ti tajmeri se koriste u pekarama, uslovi eksploatacije su značajno gori od laboratorijskih, i za ove tri godine nije mi se žalio da ima probleme. Prethodno sa tasterima redovan servis je podrazumevao zamenu tastera. Upravo sam ga zvao i reče da je nekih dvadesetak komada ugradio i nije imao ni jednu jedinu reklamaciju od 2017. godine kako smo izradili ovaj uređaj. Inače enkodere kupuje u Cometu, baš te "zelene".
Reply
#78
@npejcic

Za sada imam sve bitne SW/HW stvari resene, samo jedna stvar mi fali a to je data-EEprom emulacija/zamena, da mogu da snimim 20-ak bajtova negde tamo u slobodnoj programskoj memoriji ...

Da nemas slucajno nesto gotovo oko toga?
Reply
#79
Skinuto odnekud. Ja nisam probao. Javi da li radi.


Attached Files
.c   flash.c (Size: 3,45 KB / Downloads: 5)
.h   flash.h (Size: 513 bytes / Downloads: 3)
Reply
#80
Hvala, probacu.

Ti fajlovi verovatno poticu odavde:
https://github.com/kanflo/opendps
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)