criss Postat Septembrie 13, 2010 Partajează Postat Septembrie 13, 2010 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
catkiller Postat Septembrie 14, 2010 Partajează Postat Septembrie 14, 2010 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
catkiller Postat Septembrie 14, 2010 Partajează Postat Septembrie 14, 2010 uite aiciviewtopic.php?f=37&t=65230 Link spre comentariu
criss Postat Septembrie 16, 2010 Autor Partajează Postat Septembrie 16, 2010 Folosesti un timer extern(daca are attiny 2313) pe care il incrementezi cu impulsurile de la senzorul hallpartea 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
srdjan Postat Septembrie 16, 2010 Partajează Postat Septembrie 16, 2010 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
catkiller Postat Septembrie 17, 2010 Partajează Postat Septembrie 17, 2010 Da, cel mai bine quart extern Link spre comentariu
criss Postat Septembrie 17, 2010 Autor Partajează Postat Septembrie 17, 2010 Multumesc, am incercat sa-l realizez dar nu mi-a functionat: are un fisier inclus ce ii pt Atmega 8 (#include ) avr/iomx8.h - definitions for ATmega48, ATmega88 and ATmega168Iar pe acesta am incercat sa-l realizez dar nici nu reusesc macar sa-l compilez: http://winavr.scienceprog.com/example-avr-projects/measuring-motor-speed-and-display-result-on-lcd.html Link spre comentariu
srdjan Postat Septembrie 17, 2010 Partajează Postat Septembrie 17, 2010 poti da ceva detalii despre problema? tu nu trebuie sa incluzi direct iom8.h. tu incluzi io.h care va include la randul lui harta registrilor de intrare/iesire Link spre comentariu
nana Postat Septembrie 18, 2010 Partajează Postat Septembrie 18, 2010 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
criss Postat Septembrie 22, 2010 Autor Partajează Postat Septembrie 22, 2010 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
srdjan Postat Septembrie 22, 2010 Partajează Postat Septembrie 22, 2010 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
criss Postat Septembrie 22, 2010 Autor Partajează Postat Septembrie 22, 2010 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 signednessAtasez libraria pt lcd: [attachment=0]lcd.zip[/attachment] Link spre comentariu
srdjan Postat Septembrie 23, 2010 Partajează Postat Septembrie 23, 2010 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
nana Postat Septembrie 23, 2010 Partajează Postat Septembrie 23, 2010 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
criss Postat Septembrie 24, 2010 Autor Partajează Postat Septembrie 24, 2010 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
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