Jump to content

Nepieciešama neliela palīdzība ar Arduino.


Dundurs
 Share

Recommended Posts

Lieta sekojoša, nepieciešams "uzcept" vienu signālu pārveidotāju. Nodarbojos ar šādām tādām izvirtībām savā auto, nepieciešams konvertēt ātruma signāla ipulsu. Faktiski kods jau ir pieejams gatavs, tik viena bēda, tas rakstīts pirms gadiem 10. Un mans Arduino Nano Every nedraudzējas ar to, jo tam jaunāks procesors. Respektīvi "TimerOne" papildu bibliotēkas funkcija ar "every" plati nestrādā, tā jāaizvieto ar EveryTimerB funkciju, kas pieejama iekš github. 

 

Kods orģinālais ir šāds:

//VSS converter from civic eg vss to s2000 cluster
//Version 1.0
//read.the.disclaimer@gmail.com

#include <TimerOne.h> //this library will allow us to use pwm signals with custom period

int vssOut = 9;
int vssIn = 7;
double scale=0;
int factor=37; //scaling factor between s2000 pulses and civic pulses (s2000 pulses are around 37 times faster than civic ones)
unsigned long durationHigh=0; //duration of the pulse in High zone (5v)
unsigned long durationLow=0; //duration of the pulse in Low zone (0v)
unsigned long period=0;
unsigned long duty=0;
int i=9000;


void setup(){
  pinMode(vssOut, OUTPUT); //sets the pin as output
  pinMode(vssIn, INPUT); //sets the pin as input      
  Timer1.initialize(); //initializing the Timer1, so we can use pwm function
  Serial.begin(9600);
}
 
void loop(){ 
  int duration=pulseIn(vssIn,LOW);
  Serial.println(int);
  int speed = 1.263654879*pow(10,-2)*pow(duration,2) - 37.71764488*duration + 25133.52801;
  
  //Timer1.pwm(vssOut,512,18650/(0.50*220)); //we set the new custom pwm on vssOut pin
      
      Timer1.pwm(vssOut,512,18650/(0.50*speed));
      
      
     
        
       
      
}

 

Ja man būtu pie rokas, kāda nano/micro plate ar Atmega 328 mikreni, nebūtu problēmu. Ja kādam ir kādas idejas/ piedāvājumi, droši PM. Neprasu par brīvu gluži to izdarīt.

Labots - Dundurs
Link to comment
Share on other sites

AndrisBB

Tad kāds ir uzdevums?

Nolasīt PWM duty cycle no viena pina un copēt to uz otru ar tādu pašu duty cycle, bet 37 reizes 'ātrāku' frequenci? 

Labots - AndrisBB
Link to comment
Share on other sites

Dundurs
Pirms 25 minūtēm , AndrisBB teica:

Tad kāds ir uzdevums?

Nolasīt PWM duty cycle no viena pina un copēt to uz otru ar tādu pašu duty cycle, bet 37 reizes 'ātrāku' frequenci? 

Tieši tā

Link to comment
Share on other sites

AndrisBB

Nav man tāda Arduino pa rokai, varu tev tikai emocionālu atbalstu sniegt un iedot norādes kur rakt.

Droši vien ka aizmirstu par kautkādām dīvainām bibliotēkām un atrisinātu problēmu pats, soli pa solim.

 

Dabot datašītu priekš tā MCU. https://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ProductDocuments/DataSheets/ATmega4808-09-DataSheet-DS40002173C.pdf

 

1. Sāc ar to ka nolasi periodu/duty-cycle in inputa pina. Izmanto vienu taimeri (tur viņi ir 4 gabali), lai nolasītu periodu/duty-ciklu.

Katram timerim tur ir vairāks modes, kas var nolasīt tikai periodu vai arī periodu + dudy ciklu.

 

Reku piemērs kā izmantot Input Capture Frequency Measurement Modi

 

void setup() {
  Serial.begin(9600);
  EVSYS.CHANNEL4 = EVSYS_GENERATOR_PORT1_PIN5_gc; // Route pin 3, PF5
  EVSYS.USERTCB0 = EVSYS_CHANNEL_CHANNEL4_gc; // to TCB0
  TCB0.CTRLA = 0; // Turn off channel for configuring
  TCB0.CTRLB = 0x3; // Frequency mode
  TCB0.EVCTRL = 0x41; // Enable input capture, positive edge
  TCB0.INTCTRL = 1; // Enable interrupt
  TCB0.CTRLA = 1; // Enable and use system clock
}
volatile uint16_t period;

void loop() {
  uint16_t tempVal;
  delay(1000);
  cli();
  tempVal = period;
  sei();
  Serial.println((tempVal + 8) / 16);
}

ISR(TCB0_INT_vect) {
  period = TCB0.CCMP; // reading CCMP clears interrupt flag
}

 

Interrupts tiek ģenerēts uz katru 'augošo' signālu.

 

 

 

 

 

 

'Izpīpē' kā iestatīt Input Capture Frequency and Pulse-Width Measurement Mode

 

 

Labots - AndrisBB
Link to comment
Share on other sites

AndrisBB

No tā arī izrēķināsi periodu/duty-ciklu.

 

2. 'Manuāli' nokopē to pašu signālu ar pinWrite uz citu pinu. Tīri testam.

 

3. Izrēķini kādu periody/duty-ciklu gribi uz 'izejas' pina. Iestati nākamo timeri, lai automātiski ģenerē PWM at tevis dotajiem parametriem.

Reku skaidrojums no Micročips, pielāgo priekš Arduino

https://github.com/microchip-pic-avr-examples/atmega4809-getting-started-with-tcb-studio/tree/master/Using_TCB_in_8-bit_PWM_Mode

Ja dabūsi pirmo soli darbībā, tad varbūt kādi centīgie biedri arī palīdzēs 'izpīpēt' reģistru vērtības visam pārējam.

Labots - AndrisBB
Link to comment
Share on other sites

Varētu padalīties, kā tadas lietas risinu assemblerī, tas ir vienkārši, kā divus pirkstus ..., bet laikam jau tas nevienam nebūs interesanti. Kurš tad vairs asmā ko raksta. Pašreiz taisu vienu projektiņu izmantojot šīs sērijas (Atmega  808/809, 1608/1609, 4808/4809, utt.) kontrolierus. Kas interesanti - dabūju taisīt priekš šiem atsevišķu programmatoru. Viņiem programmēšanai izmantots UPDI interfeiss, ar ko līdz šim nebiju saskāries.

Link to comment
Share on other sites

Pukinens

Nesaprotu kādu tieši palīdzību tu sagaidi...

Ja jautājums ir par to kā adaptēt "faktiski gatavo kodu", tad tak tajā biblenes aprakstā "usage" sadaļā viss ir pateikts.

 

Ja uz pirkstiem, tad šo rindu

#include <TimerOne.h> //this library will allow us to use pwm signals with custom period

 

vajag aizvietot ar šādām

#ifdef ARDUINO_ARCH_MEGAAVR
#include "EveryTimerB.h"
#define Timer1 TimerB2 // use TimerB2 as a drop in replacement for Timer1
#else // assume architecture supported by TimerOne ....
#include "TimerOne.h"
#endif

 

un viss.

 

 

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...