Vizitator Postat Ianuarie 3, 2020 Partajează Postat Ianuarie 3, 2020 (editat) Acum 9 ore, UDAR a spus: După cum vezi el plasează altfel citirea spre ADC. Serios acum. ambele borne sunt legate la +3V. El a desenat cumva doua rezistente serie cu capetele in comun si legate la borna 3V ?!? adica asa ????: practic ( R1+R2)/2 ramane ca o rezistenta de la 3V spre ADC, adica masuram tensiunea pe baterie/sursa , dar scarpinandu-ne cu mana stanga la urechea dreapta. oricum in schema aia , prima, le plaseaza pe bornele motor. cu toate ca in video arata altfel. am dubii totale. zilele astea imi vine jucaria, si de abia astept sa vad ce si cum era. Editat Ianuarie 3, 2020 de Vizitator Link spre comentariu
Liviu M Postat Ianuarie 3, 2020 Partajează Postat Ianuarie 3, 2020 (editat) 1 oră în urmă, Aw Genetix a spus: practic ( R1+R2)/2 Rezistenta echivalenta a unui grup de rezistente in paralel e mai mica decat cea mai mica rezistenta din grup. Pune tu o rezistenta de 1MOhm in paralel cu una de 1 Ohm si vezi ce-ti iese dupa formula ta. Formula "adevarata" e R1 * R2 / (R1 + R2). Editat Ianuarie 3, 2020 de Liviu M Link spre comentariu
Mircea Postat Ianuarie 3, 2020 Partajează Postat Ianuarie 3, 2020 (editat) In loc de masurat tensiuni, daca sistemul mecanic e fiabil (nu exista blocari aleatoare) eu as face detectia capatului de cursa fara sa masor nimic. As opri dupa un timp considerat necesar parcurgerii cursei. Editat Ianuarie 3, 2020 de Thunderer Link spre comentariu
sesebe Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 (editat) Acum 27 minute, Thunderer a spus: In loc de masurat tensiuni, daca sistemul mecanic e fiabil (nu exista blocari aleatoare) eu as face detectia capatului de cursa fara sa masor nimic. As opri dupa un timp considerat necesar parcurgerii cursei. Ca la multe actuatoare auto (mai vechi) ..... Editat Ianuarie 4, 2020 de sesebe Link spre comentariu
validae Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 Asta merge doar în cazul acţionării cu roţi dinţate, unde nu există alunecări, iar cursa utilă e mereu aceeaşi.Dacă există o acţionare cu fricţiune, nu te mai poţi baza pe timpul de acţionare, fiindcă în timp se adună decalaje... Metoda comparării turaţiei prin măsurarea tensiunii contraelectromotoare e foarte precisă, fiindcă tensiunea produsă de motor e dependentă de turaţie.Iar dacă totuşi se foloseşte o acţionare temporizată, e obligatoriu un cuplaj cu alunecare, fiindcă motorul nu trebuie blocat în cazul terminării premature a cursei active.Cu alte cuvinte, dacă fereastra acţionată electric se închide, iar motorul continuă să se rotească din lipsa informaţiei de ,,cap de cursă,, atunci trebuie ca un cuplaj tip ambreiaj să poată aluneca şi astfel limita suprasarcinile cauzate de blocare. Link spre comentariu
UDAR Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 Acum 4 ore, validae a spus: Metoda comparării turaţiei prin măsurarea tensiunii contraelectromotoare e foarte precisă, fiindcă tensiunea produsă de motor e dependentă de turaţie. De acord, dar cum faci asta în cazul de față când, practic, motorul este în paralel pe bornele bateriei(sursei) ? Link spre comentariu
Vizitator Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 (editat) ideea mea e ca vreau sa detectez capetele de cursa pentru o calibrare in microsecunde. apoi, doar pe baza de timp, pentru ca nu fac cursa completa in aplicație. motorașul are angrenaj pe melc, dar oricum timpul difera de la o direcție la alta, pentru ca e un actuator, iar intr-un sens împinge un arc. apropo de formula rezistentelor in paralel. oricum ai calcula, când vorbim de 2 rezistente de 100K, tot 50K rezulta iar problema era alta. de schema aia.. montajul l-am testat final, astept carcasele. de mers merge, asa cum vroiam. l-as ruga pe udar, sa imi spuna la ce problema sa ma aștept cu citirea tensiunii motor din inertie. e vorba doar de supratensiune, sau mai ar fi ceva..? un zener de 3v1 pe ADC, ar fi insuficient..? Acum 11 minute, UDAR a spus: De acord, dar cum faci asta în cazul de față când, practic, motorul este în paralel pe bornele bateriei(sursei) ? eu.. fac citiri de tensiune baterie (aref=1.1), cel putin asa am "rezolvat" eu.. problema cu caderea sursei concomitent. Editat Ianuarie 4, 2020 de Vizitator Link spre comentariu
UDAR Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 (editat) Nu pot să răspund la întrebare până când nu precizezi cum anume - ca schemă electrică - vrei să citești acea tensiune . Trebuie cumva ca pe durata acelei măsurători să pui un capăt al motorului ”la masă” iar pe celălalt la intrarea în ADC . Zener de 3.1V nu prea știu să se găsească - poate ceva comenzi speciale . La o alimentare de 3-3.3V , ținând cont și de toleranța Zener-ului și de spike-ul car poate să apară la șoc de curent , este mai degrabă recomandat un 2.4-2.7V . Presupun de altfel că la acea alimentare vei lucra cu referință de 2.048V. EDIT S-a postat între timp . @Aw Genetix Am înțeles dar aia nu e tensiunea contraelectromotoare . Întrebarea era pentru @validae care a propus metoda. Editat Ianuarie 4, 2020 de UDAR Link spre comentariu
Liviu M Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 Acum 31 minute, Aw Genetix a spus: apropo de formula rezistentelor in paralel. oricum ai calcula, când vorbim de 2 rezistente de 100K, tot 50K rezulta iar problema era alta. de schema aia.. Sa gresesti din graba o formula e OK. Sa "ignori" greseala si sa persisti, nu mai e. Cu formula ta, (100k + 100k) / 2 = 100k, nicidecum 50k. Link spre comentariu
Vizitator Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 1 oră în urmă, Liviu M a spus: Sa gresesti din graba o formula e OK. Sa "ignori" greseala si sa persisti, nu mai e. Cu formula ta, (100k + 100k) / 2 = 100k, nicidecum 50k. da ai dreptate, sincer. dar da-o încolo de formula.. hai sa rămânem in topic. mulțumesc. Link spre comentariu
Vizitator Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 (editat) Update /* * uC: Atmega 328PU 16MHz * Write by UPX * PROGRAM: SMALL DC MOTOR WITH STALL DETECTOR (BETA) */ /*SETUP*/ #define MOT_POWER 2 // 1..10 #define STALL 5 // > 0..20 /*END SETUP*/ #define CW_NPN_PIN 8 #define CW_PNP_PIN 5 #define CCW_NPN_PIN 9 #define CCW_PNP_PIN 6 enum stSense { STOP, CW, CCW }; stSense SEL_SENSE=CW; char * SEL_SENSE_TXT[4] = {"STOP" ,"CW","CCW",'\0'}; #define NPN_ON 1 #define NPN_OFF 0 #define PNP_ON 0 #define PNP_OFF 1 uint32_t cMs = 0; uint32_t lstChanged = 0; int min = 1023, max = 0; void setup(){ Serial.begin(115200); pinMode(A0,INPUT); pinMode(CW_NPN_PIN,OUTPUT); pinMode(CW_PNP_PIN,OUTPUT); pinMode(CCW_NPN_PIN,OUTPUT); pinMode(CCW_PNP_PIN,OUTPUT); Serial.print("MOT_POWER: "); Serial.println(MOT_POWER); reset_motor(STOP); Serial.println(F("STARTING...")); } void loop(){ cMs = millis(); updateMotor(SEL_SENSE); // STOP | FORWARD | BACKWWARD if ((cMs-lstChanged)>3000UL) { lstChanged = cMs; if (SEL_SENSE == STOP) { updateMotor(CW); return; } if (SEL_SENSE == CW) { updateMotor(CCW); return; } if (SEL_SENSE == CCW) { //updateMotor(STOP); updateMotor(CW); return; } } } void reset_motor(uint8_t lastDIRECTION) { if (lastDIRECTION == STOP) return; digitalWrite(CW_NPN_PIN,NPN_OFF); digitalWrite(CW_PNP_PIN,PNP_OFF); digitalWrite(CCW_NPN_PIN,NPN_OFF); digitalWrite(CCW_PNP_PIN,PNP_OFF); min = 1023; max = 0; if (lastDIRECTION == CW) digitalWrite(CW_NPN_PIN,NPN_ON); if (lastDIRECTION == CCW) digitalWrite(CCW_NPN_PIN,NPN_ON); int rawADC; uint32_t mT1 = millis(); uint32_t mT2 = 0; rawADC = analogRead(A0); Serial.print(F("WAIT FOR STOP - ")); while (rawADC > STALL){ rawADC = analogRead(A0); } mT2 = (millis()-mT1); digitalWrite(CW_NPN_PIN,NPN_OFF); digitalWrite(CCW_NPN_PIN,NPN_OFF); digitalWrite(CW_PNP_PIN,PNP_OFF); digitalWrite(CCW_PNP_PIN,PNP_OFF); Serial.print(mT2); Serial.println(" mS"); delay(1000UL); } void updateMotor(uint8_t change_sense){ static uint8_t mode = 0; static uint8_t old_mode = mode; int rawADC = 0; if (change_sense != mode) { reset_motor(mode); Serial.println(); Serial.print(F("MOTOR CHANGED SENSE IS ")); Serial.println(SEL_SENSE_TXT[change_sense]); mode = change_sense; } switch (mode){ case STOP: digitalWrite(CW_NPN_PIN,NPN_OFF); digitalWrite(CW_PNP_PIN,PNP_OFF); digitalWrite(CCW_NPN_PIN,NPN_OFF); digitalWrite(CCW_PNP_PIN,PNP_OFF); mode = change_sense; old_mode = mode; SEL_SENSE = STOP; break; case CW: digitalWrite(CCW_NPN_PIN,NPN_OFF); // disable BACKWWARD digitalWrite(CCW_PNP_PIN,PNP_OFF); // disable BACKWWARD digitalWrite(CW_NPN_PIN,NPN_ON); //[-] mentain GND ON if (mode!=old_mode){ old_mode = mode; SEL_SENSE = CW; digitalWrite(CW_PNP_PIN,PNP_ON); // [+] boost spin motor before reading... delay(250UL); } digitalWrite(CW_PNP_PIN,PNP_OFF); // [+] cut for reading.. delay(5UL); rawADC = analogRead(A0); if (checkSTALL(rawADC) == true) { lstChanged = cMs; updateMotor(STOP); return; } digitalWrite(CW_PNP_PIN,PNP_ON); // [+] spin motor delay(MOT_POWER); Serial.print(F("CW ADC: ")); Serial.print(rawADC); if (rawADC > max) max = rawADC; if (rawADC < min) min = rawADC; Serial.print(F("\tmin:")); Serial.print(min); Serial.print(F("\tmax:")); Serial.print(max); Serial.print(F("\tdiff:")); Serial.println(abs(max-min)); break; case CCW: digitalWrite(CW_NPN_PIN,NPN_OFF); // disable FORWARD digitalWrite(CW_PNP_PIN,PNP_OFF); // disable FORWARD digitalWrite(CCW_NPN_PIN,NPN_ON); //[GND] mentain GND ON if (mode!=old_mode){ old_mode = mode; SEL_SENSE = CCW; digitalWrite(CCW_PNP_PIN,PNP_ON); // [+] boost spin motor before reading... delay(250UL); } digitalWrite(CCW_PNP_PIN,PNP_OFF); // [+] cut for reading.. delay(5UL); rawADC = analogRead(A0); if (checkSTALL(rawADC) == true) { lstChanged = cMs; updateMotor(STOP); return; } digitalWrite(CCW_PNP_PIN,PNP_ON); // [+] spin motor delay(MOT_POWER); Serial.print(F("CCW ADC: ")); Serial.print(rawADC); if (rawADC > max) max = rawADC; if (rawADC < min) min = rawADC; Serial.print(F("\tmin:")); Serial.print(min); Serial.print(F("\tmax:")); Serial.print(max); Serial.print(F("\taverage:")); Serial.println(abs(max-min)); break; default: mode = 0; break; }//end.sw } boolean checkSTALL(int rawADC){ boolean result = false; if (rawADC <= STALL) { result = true; Serial.println(F("--MOTOR STALL--")); } return result; } Editat Ianuarie 4, 2020 de Vizitator Link spre comentariu
UDAR Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 (editat) Nu văd nicio schimbare cu excepția eliminării diodelor . Arduino nu știu de loc totuși dacă am priceput eu bine ce ai scris acolo nu se va detecta niciodată starea de STALL - ar trebui să scadă prea mult tensiunea . PS Merg pe vorba ta că - cumva, nu știu cum - scade tensiunea A0 la STALL Editat Ianuarie 4, 2020 de UDAR Link spre comentariu
validae Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 (editat) Dacă nu ai rezistenţe de zecimi de Ohm măcar în serie cu motoraşul, trebuie o referinţă foarte precisă de tensiune ca să detecteze micile variaţii ale tensiunii la bornele motorului, în starea de mers normal şi cea de suprasarcină.Probabil că îţi scade chiar tensiunea de alimentare cu totul, din cauza mersului în suprasarcină.... Schema aia se putea desena ceva mai elegant decât ca un uriaş păianjen de trimiteri spre diverse borne, dar în fine, se înţelege ce vrea să fie.... Editat Ianuarie 4, 2020 de validae Link spre comentariu
Vizitator Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 se poate incerca, ce am postat. motorul din testele mele este un motoras din jucariile alea pentru odorizante in camera. Link spre comentariu
Vizitator Postat Ianuarie 4, 2020 Partajează Postat Ianuarie 4, 2020 (editat) Ideea este ca citirea se face in pauzele de alimentare, sincronizate de uC. Am incercat si cu tranzistor NPN legat la A0, si apoi citire digitala la D2, evident cu citire inversata in uC. Fara pull_up. Merge si asa. Editat Ianuarie 4, 2020 de Vizitator Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum