Sari la conținut
ELFORUM - Forumul electronistilor

turometru pt motor electric


criss

Postări Recomandate

Buna,Doresc sa realizez un modul pt masurarea turatiei/minut unui motor electric (0-10.000rpm).Microcontrolerul va fi unul Attiny 2313 cu un quartz extern(pt a avea o precizie mai buna), iar limbaju C.Nu vreau sa-l utilizez doar pt afisare ci si pt controlul vitezei.rotatia arborelui va fi preluat de un senzor hall.Cu partea de numarare a impulsurilor nu ma descurc. Am incercat sa cateva coduri gasite pe net dar nici unul nu mi-a functionat pana acuma. puteti sa-mi dati un exemplu functional..Multumesc anticipat.

Link spre comentariu
  • Răspunsuri 19
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • criss

    8

  • srdjan

    6

  • catkiller

    3

  • nana

    2

Top autori în acest subiect

Cred ca a mai fost un post similar cu turatia motoarelorIn primul rand trebuie sa folosesti un pwm, senzorul hall e feedback-ul si trebuie sa faci un regulator de turatie Pi sau PIDFolosesti un timer extern(daca are attiny 2313) pe care il incrementezi cu impulsurile de la senzorul hall

Link spre comentariu

Folosesti un timer extern(daca are attiny 2313) pe care il incrementezi cu impulsurile de la senzorul hall

partea cu comanda motorului si afisajul pe LCD ma descurc, doar cea de numarare a impulsurilor. Daca te rog poti sa-mi dai un exemplu sau sa-mi explici cum sa procedez?si da la acel topic apartine doar ca acolo foloseam un motor de strergator de parbriz de joasa turatie(a si ramas asa) doar ca am mai avut nevoie de un motor de mai mare turatie (cred ca 6000rpm are...l-am primit si inca nu l-am incercat) doar ca vreau ca 'frecventiometrul' meu sa masoare pana la 1000rpm.pe undeva am citit ca nu este asa de bun quartzul ci cel intern este mult mai precis:

For a high resolution time measurement it is not good to use an external clock. Its better to use the systemclock for the timer. The external clock needs to be slower and you can get extra errors from syncronization of the external clock.

mie mi-ar conveni si mai mult cel intern deoarece in acest fel micsorez intreg ansamblul.parca de pe AVRfreaks am citit ... nu-mi mai amintesc. Multumesc.
Link spre comentariu

uite aici un calculator de prescalere. turometrul daca vrei sa ai precizie cu el tre sa iti calculezi prescalerul pe portiuni.

eu m-am jucat cu F_CPU de 20MHz si mi-au suras urmatoarele valori:

Frecventa / Timer (biti) / prescaler / eroare (%)

1Hz-2Hz / 16 / 1024 / 4

2-5 / 16 /256 / 1

5-10 / 16 / 64 / 0.4

10-40 / 16 / 64 / 0.3

40-306 / 16 / 8 / <0.1

307-10.000 / 16 / 1 / <0.1

 

http://www.et06.dk/atmega_timers/

http://winavr.scienceprog.com/avr-gcc-t ... inavr.html

 

LE: foloseste quartz extern deoarece oscilatorul intern fuge mult cu variatia tensiunii de alimentare si temperatura

 

mie sincer mi-ar place efectul sa vad cum sare la fiecare secunda frecventa pe un afisaj... eu as folosi un DS1307 pentru ora si data si pentru referinta de 1hz si as numara cate impulsuri am de la arbore intr-o secunda...

Link spre comentariu

Mai simplu e sa folosesti encodere optice cu semnale in coadratura. E drept ca sunt mai scumpe dar daca e pt o aplicatie pretentioasa se merita, pt ca sunt si foarte precise deoarece nu mai e nevoie sa folosesti timerele. Si folosesti doar intreruperile externe! Bafta acest mesaj ial in considerare doar daca vrei sa faci ceva profesional nu doar la nivel diy.

Link spre comentariu

Am facut din nou montajul cu un Atmega8 dar din pacate nu se compileaza codul.

../atm8rpm.c: In function '__vector_5':../atm8rpm.c:63: warning: implicit declaration of function 'sprintf'../atm8rpm.c:63: warning: pointer targets in passing argument 1 of 'sprintf' differ in signedness../atm8rpm.c:63: warning: format '%06u' expects type 'unsigned int', but argument 3 has type 'long unsigned int'../atm8rpm.c: In function 'main':../atm8rpm.c:87: warning: pointer targets in passing argument 1 of 'LCDstring' differ in signedness

Link spre comentariu

astea sunt doar warning-uri, e adevarat ca sunt cam urate dar codul s-a compilat daca astea sunt toate. e diferenta intre warning si error in sensul ca nu se compileaza daca exista eroare. daca exista doar atentionare inseamna ca ceva nu e ca la carte dar te lasa sa vezi ce-a iesit. daca te uiti pe pagina de unde ai luat codul vei vedea ca al doilea comentariu propune niste modificari ale codului datorita acelor warning-uri. incearca sa faci modificarile si tine-ne la curent cu ce se intampla.cu mentiunea ca unde zice sa mai pui un #include incerca sa spuna cred sa pui #include dar site-ul a sters numele librariei din cauza tag-urilor < si >totusi calea spre stdio.h poate difera in functie de cum sunt organizate librariile in proiectul/compilatorul tau la winavr cred ca e direct

Link spre comentariu

deloc nu m-am descurcat cu libraria aceasta pt lcd+ca era prea mare pt Attiny2313(momentan fac teste pe un Atmega8, 8Mhz oscilator intern) asa ca l-am inlocuit:

#include <avr\io.h>#include <avr/pgmspace.h>#include <util/delay.h>#include <avr/interrupt.h>#include "lcd.h"#include <stdio.h>#include<stdlib.h> #define RPM 60000000u#define ICP PINB0//timer overflow counteruint8_t ovs=0;uint32_t T;uint16_t PreviousTime, CurrentTime;uint8_t buffer[15];uint8_t calculate=0;//timer1 input capture interrupt service routineISR(TIMER1_CAPT_vect){if(calculate==0)    {       TCNT1=0;        calculate=1;    }    else if (calculate==1)            {            //Saving current timer value on falling edge            CurrentTime=ICR1;            calculate=2;            }        else if(calculate==2)            {            T=(uint32_t)CurrentTime;            //form string with RPM value            sprintf(buffer,"RPM: %06lu",RPM/T);            //output to LCD        lcd_gotoxy( 0, 0 );       lcd_puts(buffer);         //_delay_ms(50);        //    LCDstring(buffer, 15);            calculate=0;            }}int main(void){lcd_init(LCD_DISP_ON); /* initialize display, cursor off */lcd_clrscr(); /* clear the screen*/    lcd_home();    lcd_puts( "Count RPM" );//    LCDstring("Count RPM", 9);    PORTB|=1<<ICP;//pullup enable    DDRB&=~(1<<ICP);//ICR1 as input    TCNT1=0;// start counting from zero    TIMSK|=(1<<TICIE1);//|(1<<TOIE1);//enable input capture interrupts    TCCR1A=0;    TCCR1B|=(1<<CS11);//start with prescaller 8, rising edge ICP1    sei();    while(1)//loop      {    }    return 0;}
Aceasta imi dadea:

../atmega8test2.c:63: warning: pointer targets in passing argument 1 of 'sprintf' differ in signedness../atmega8test2.c:68: warning: pointer targets in passing argument 1 of 'lcd_puts' differ in signedness

Atasez libraria pt lcd: [attachment=0]lcd.zip[/attachment]
Link spre comentariu

din cate vad eu constanta RPM e declarata ca unsigned int (60...u) cred ca ar trebui sufix UL (unsigned long) pentru a fi pe 32biti asa cum este si T si e bine sa faci cast-ul(unit32_t)RPM/T in apelarea functiei sprintf. sincer sunt cam debusolat in ceea ce priveste token-urile functiei sprintf ca sa stiu ce date asteapta si cum le formateaza. daca nu-ti iese repejor folosind sprintf ai putea sa folosesti functia LTOA() (am scris cu litere mari sa nu faci confuzie intre L si I dar ea de fapt e cu litere mici)

char* ltoa (long int __val, char * __s, int __radix )Convert a long integer to a string.The function ltoa() converts the long integer value from val into an ASCII representation that will be stored under s. The caller is responsible for providing sufficient storage in s.Note: The minimal size of the buffer s depends on the choice of radix. For example, if the radix is 2 (binary), you need to supply a buffer with a minimal length of 8 * sizeof (long int) + 1 characters, i.e. one character for each bit plus one for the string terminator. Using a larger radix will require a smaller minimal buffer size.Warning: If the buffer is too small, you risk a buffer overflow.Conversion is done using the radix as base, which may be a number between 2 (binary conversion) and up to 36. If radix is greater than 10, the next digit after '9' will be the letter 'a'.If radix is 10 and val is negative, a minus sign will be prepended.The ltoa() function returns the pointer passed as s.

deci creezi un sir de caractere dupa care apelezi ltoa (valoarea_numerica, pointer_spre_sirul_de_caractere, baza_numerica)dupa apelare, sirul de caractere va contine numarul tau in baza in care ai specificat (2,8,10, 16) de unde in cazul acesta pe tine te intereseaza baza 10totusi cred ca sprintf e mai la indemana, incearca sa inlocuiesti %06lu cu %06l (de aici mi-a venit ideea desi fara sa am compilatorul la indemana nu sunt sigur de ceea ce spun)http://www.cs.mun.ca/~paul/cs4723/mater ... 35399f2a2a
Link spre comentariu

Incearca ce a spus srdjan sigur problema ta se trage de la casturi si de aia nu merge cum trebuie! Si eu m-am confruntat cu o problea de genu cu sprintf ca aveam u n double pe care il imparteam la un int si nu a vrut sa mearga in ruptu capului pana nu am facut conversia la toata operatia. Bafta in continuare, si ma bucur ca mai lucra careva in C nu doar in bascom.

Link spre comentariu

multumesc pt ajutor, inca am reusit sa il fac sa mearga calumea :(

 

    uint32_t R;   	lcd_gotoxy( 0, 1 );	R= RPM/T;	itoa(R, s, 10);	lcd_puts(s);

se compileaza si functioneaza, doar ca imi afiseaza valori de neinterpretat(nu am nici o alta sursa de a compara rezultatul) dar cand urc turatia motorului se duce pana la valoarea maxima de 1625, iar cand cobor turatia imi afiseaza o valoare de 726386 care teoretic este mai mare decat turatia maxima a motorului.iar dupa aceea dupa ce urc din nou turatia acele zecimale in + raman acolo ... nu se modifica dar acolo raman, parca ar fi generat de schimbarea valorilor din 7xxxxx in 7xxx dar displayul afiseaza si ultimele zecimale ramase de la valoarea turatiei anterioare 7xxxyy.

Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări