Dundurs Ierakstīts Jūlijs 3, 2023 Share Ierakstīts Jūlijs 3, 2023 (labots) 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 Jūlijs 3, 2023 - Dundurs Link to comment Share on other sites More sharing options...
AndrisBB Jūlijs 3, 2023 Share Jūlijs 3, 2023 (labots) 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 Jūlijs 3, 2023 - AndrisBB Link to comment Share on other sites More sharing options...
Dundurs Jūlijs 3, 2023 Author Share Jūlijs 3, 2023 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 More sharing options...
AndrisBB Jūlijs 3, 2023 Share Jūlijs 3, 2023 (labots) 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 Oktobris 18, 2023 - AndrisBB Link to comment Share on other sites More sharing options...
AndrisBB Jūlijs 3, 2023 Share Jūlijs 3, 2023 (labots) 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 Jūlijs 3, 2023 - AndrisBB Link to comment Share on other sites More sharing options...
M_J Jūlijs 4, 2023 Share Jūlijs 4, 2023 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 More sharing options...
Pukinens Jūlijs 4, 2023 Share Jūlijs 4, 2023 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 More sharing options...
Recommended Posts
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 kontuPierakstīties
Jums jau ir konts? Pierakstieties tajā šeit!
Pierakstīties tagad!