Moderators: stojke369, pedja089, [eDo], trax, LAF
Black wrote:Treba sve![]()
,nece to ic bas tako zgodno.
Za mjerit okretaje četiriju osovina potrebno je koristit tajmere i direkno upravljanje registrima(portovima)
Ja ti mogu napisat program al tek tamo nekad sljedeći tjedan
/*
Program za mjerenje 4 fkrevencije koje ispisuje preko serijskog porta.
Na ulaze D2-D5 dovode se mjerni signali, na svaki pin moraš staviti jedan pull up otpornik.
U varijablama frekv, frekv1, frekv2 i frekv3 nalaze se frekvencije pojedinih signala.
Bilo bi dobro kad bi signali kasnili 90° fazno međusobno.
Probna verzija V1.0.0
*/
volatile unsigned long Prosli, Prosli1, Prosli2, Prosli3 ,Period, Period_us,Period1, Period1_us,Period2, Period2_us,Period3, Period3_us;
const byte ulaz = 2, ulaz1 = 3, ulaz2=4, ulaz3=5;
volatile byte br1 = 0, br2=0, trenutno_stanje=0, proslo_stanje=0, br=0,br3=0;
volatile byte zastavica1=0, zastavica2=0, zastavica3=0,zastavica=0;
float frekv=0, frekv1=0, frekv2=0, frekv3=0;
void pciSetup(byte pin)
{
*digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin)); // enable pin
PCIFR |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
PCICR |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
}
void resetiraj_timer1(){
TCCR1A = 0;
TCCR1B = 0;
TCCR1C = 0;
TIMSK1 = 0;
TCNT1 = 0;
}
void postavi_timer1(){
TCCR1B |= 0x02;
TIMSK1|= 1;
}
void setup(){
resetiraj_timer1();
postavi_timer1();
Serial.begin(9600);
pinMode(ulaz, INPUT);//Ulaz 0 na D0
pinMode(ulaz1, INPUT); //Ulaz 1 na D1
pinMode(ulaz2, INPUT); //Ulaz 2 na D2
pinMode(ulaz3, INPUT); //Ulaz 3 na D3
proslo_stanje = PIND;
pciSetup(ulaz);
pciSetup(ulaz1);
pciSetup(ulaz2);
pciSetup(ulaz3);
sei();
}
void loop(){
Period_us = Period/2;
Period2_us = Period2/2;
Period3_us = Period3/2;
Period1_us = Period1/2;
if(Period_us != 0) frekv = 1/Period_us;
if(Period1_us != 0) frekv = 1/Period1_us;
if(Period2_us != 0) frekv = 1/Period2_us;
if(Period3_us != 0) frekv = 1/Period3_us;
Serial.print("Frekvencije 1 - 4:");
Serial.print(frekv);
Serial.print("\t");
Serial.print(frekv1);
Serial.print("\t");
Serial.print(frekv2);
Serial.print("\t");
Serial.print(frekv3);
}
ISR(TIMER1_OVF_vect){//}
br++;
br1++;
br2++;
br3++;
if(br1>30){
br1=0;
frekv1 = 0;
}
if(br2>30){
br2=0;
frekv = 0;
}
if(br>30){
br=0;
frekv = 0;
}
if(br3>30){
br3=0;
frekv3 = 0;
}
}
ISR (PCINT2_vect) // handle pin change interrupt for D0 to D7 here
{
//D2-D5 = PORTD2 - PORTD5
trenutno_stanje = PIND;
trenutno_stanje =trenutno_stanje>>2; //makni prva dva bita
trenutno_stanje &=0x0F; //očisti gornja 4 bita
if(trenutno_stanje^proslo_stanje){ //Ispitaj jel doslo do promjene
//Doslo je do promjene
if(trenutno_stanje&0x01){ //Na prvom pinu D2
unsigned int trenutno = TCNT1;
if(zastavica==2){ // došlo je do druge promjene (za 1 period)
if(br){ //Ako je došlo do prelejva kod timera
Period = ((unsigned long)br*65535-Prosli) + trenutno;
br=0;
}
else{
Period = trenutno - Prosli;
}
zastavica1=0;
}
else{
zastavica++;
if(zastavica==1) Prosli = trenutno;
}
}
if(trenutno_stanje&0x02){ //Na drugom pinu D3
unsigned int trenutno = TCNT1;
if(zastavica1==1){ // došlo je do druge promjene (za 1 period)
if(br1)
{ //Ako je došlo do prelejva kod timera
Period1 = ((unsigned long)br1*65535-Prosli1) + trenutno;
br1=0;
}
else
{
Period1 = trenutno - Prosli1;
}
zastavica1=0;
}
else
{
zastavica1++;
if(zastavica1==1)Prosli1 = trenutno;
}
}
if(trenutno_stanje&0x04){ //Na trecem pinu D4
unsigned int trenutno = TCNT1;
if(zastavica2==2)
{ // došlo je do druge promjene (za 1 period)
if(br2)
{ //Ako je došlo do prelejva kod timera
Period2 = ((unsigned long)br2*65535-Prosli2) + trenutno;
br2=0;
}
else
{
Period2 = trenutno - Prosli2;
}
zastavica2=0;
}
else
{
zastavica2++;
if(zastavica2==1)Prosli2 = trenutno;
}
}
if(trenutno_stanje&0x08){ //Na cetvertom pinu D2
unsigned int trenutno = TCNT1;
if(zastavica3==2){ // došlo je do druge promjene (za 1 period)
if(br3)
{ //Ako je došlo do prelejva kod timera
Period3 = ((unsigned long)br3*65535-Prosli3) + trenutno;
br3=0;
}
else
{
Period3 = trenutno - Prosli3;
}
zastavica3=0;
}
else
{
zastavica3++;
if(zastavica3==1) Prosli3 = trenutno;
}
}
}
}
/*
Program za mjerenje 4 fkrevencije.
Na ulaze D2-D5 dovode se mjerni signali. Dodaje pullup na svaki od ulaza.
U varijablama frekv, frekv1, frekv2 i frekv3 nalaze se frekvencije pojedinih signala.
Bilo bi dobro kad bi signali kasnili 90° fazno međusobno.
Probna verzija V1.0.1
*/
volatile unsigned long Prosli, Prosli1, Prosli2, Prosli3 ,Period, Period_us,Period1, Period1_us,Period2, Period2_us,Period3, Period3_us;
const byte ulaz = 2, ulaz1 = 3, ulaz2=4, ulaz3=5;
volatile byte br1 = 0, br2=0, trenutno_stanje=0, proslo_stanje=0, br=0,br3=0;
volatile byte zastavica1=0, zastavica2=0, zastavica3=0,zastavica=0;
float frekv=0, frekv1=0, frekv2=0, frekv3=0;
volatile byte t1=0,t2=0,t3=0,t=0;
void pciSetup(byte pin)
{
*digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin)); // enable pin
PCIFR |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
PCICR |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
}
void resetiraj_timer1(){
TCCR1A = 0;
TCCR1B = 0;
TCCR1C = 0;
TIMSK1 = 0;
TCNT1 = 0;
}
void postavi_timer1(){
TCCR1B |= 0x02;
TIMSK1|= 1;
}
void setup(){
resetiraj_timer1();
postavi_timer1();
Serial.begin(9600);
pinMode(ulaz, INPUT);//Ulaz 0 na D0
pinMode(ulaz1, INPUT); //Ulaz 1 na D1
pinMode(ulaz2, INPUT); //Ulaz 2 na D2
pinMode(ulaz3, INPUT); //Ulaz 3 na D3
proslo_stanje = PIND;
pciSetup(ulaz);
pciSetup(ulaz1);
pciSetup(ulaz2);
pciSetup(ulaz3);
sei();
}
void loop(){
Period_us = Period/2;
Period2_us = Period2/2;
Period3_us = Period3/2;
Period1_us = Period1/2;
if(Period_us != 0) frekv = 1/Period_us;
if(Period1_us != 0) frekv = 1/Period1_us;
if(Period2_us != 0) frekv = 1/Period2_us;
if(Period3_us != 0) frekv = 1/Period3_us;
Serial.print("Frekvencije 1 - 4:");
Serial.print(frekv);
Serial.print("\t");
Serial.print(frekv1);
Serial.print("\t");
Serial.print(frekv2);
Serial.print("\t");
Serial.print(frekv3);
}
ISR(TIMER1_OVF_vect){//}
br++;
br1++;
br2++;
br3++;
if(br1>30){
br1=0;
frekv1 = 0;
}
if(br2>30){
br2=0;
frekv = 0;
}
if(br>30){
br=0;
frekv = 0;
}
if(br3>30){
br3=0;
frekv3 = 0;
}
}
ISR (PCINT2_vect) // handle pin change interrupt for D0 to D7 here
{
//D2-D5 = PORTD2 - PORTD5
trenutno_stanje = PIND;
trenutno_stanje =trenutno_stanje>>2; //makni prva dva bita
trenutno_stanje &=0x0F; //očisti gornja 4 bita
if(trenutno_stanje^proslo_stanje){ //Ispitaj jel doslo do promjene
//Doslo je do promjene
t = (trenutno_stanje^proslo_stanje)&0x01;
t1 = (trenutno_stanje^proslo_stanje)&0x02;
t2 = (trenutno_stanje^proslo_stanje)&0x04;
t3 = (trenutno_stanje^proslo_stanje)&0x08;
if(t!=(proslo_stanje&0x01)){ //Na prvom pinu D2
unsigned int trenutno = TCNT1;
if(zastavica==2){ // došlo je do druge promjene (za 1 period)
if(br){ //Ako je došlo do prelejva kod timera
Period = ((unsigned long)br*65535-Prosli) + trenutno;
br=0;
}
else{
Period = trenutno - Prosli;
}
zastavica1=0;
}
else{
zastavica++;
if(zastavica==1) Prosli = trenutno;
}
}
if(t!=(proslo_stanje&0x02)){ //Na drugom pinu D3
unsigned int trenutno = TCNT1;
if(zastavica1==1){ // došlo je do druge promjene (za 1 period)
if(br1)
{ //Ako je došlo do prelejva kod timera
Period1 = ((unsigned long)br1*65535-Prosli1) + trenutno;
br1=0;
}
else
{
Period1 = trenutno - Prosli1;
}
zastavica1=0;
}
else
{
zastavica1++;
if(zastavica1==1)Prosli1 = trenutno;
}
}
if(t!=(proslo_stanje&0x04)){ //Na trecem pinu D4
unsigned int trenutno = TCNT1;
if(zastavica2==2)
{ // došlo je do druge promjene (za 1 period)
if(br2)
{ //Ako je došlo do prelejva kod timera
Period2 = ((unsigned long)br2*65535-Prosli2) + trenutno;
br2=0;
}
else
{
Period2 = trenutno - Prosli2;
}
zastavica2=0;
}
else
{
zastavica2++;
if(zastavica2==1)Prosli2 = trenutno;
}
}
if(t!=(proslo_stanje&0x08)){ //Na cetvertom pinu D2
unsigned int trenutno = TCNT1;
if(zastavica3==2){ // došlo je do druge promjene (za 1 period)
if(br3)
{ //Ako je došlo do prelejva kod timera
Period3 = ((unsigned long)br3*65535-Prosli3) + trenutno;
br3=0;
}
else
{
Period3 = trenutno - Prosli3;
}
zastavica3=0;
}
else
{
zastavica3++;
if(zastavica3==1) Prosli3 = trenutno;
}
}
}
proslo_stanje = trenutno_stanje;
}
/*
Program za mjerenje 4 fkrevencije.
Na ulaze D2-D5 dovode se mjerni signali. Dodaje pullup na svaki od ulaza.
U varijablama frekv, frekv1, frekv2 i frekv3 nalaze se frekvencije pojedinih signala.
Bilo bi dobro kad bi signali kasnili 90° fazno međusobno.
Na računalu će se ispisivati frekvencija svakog ulaza.
Probna verzija V1.0.2
*/
volatile unsigned long Prosli, Prosli1, Prosli2, Prosli3 ,Period, Period_us,Period1, Period1_us,Period2, Period2_us,Period3, Period3_us;
const byte ulaz = 2, ulaz1 = 3, ulaz2=4, ulaz3=5;
volatile byte br1 = 0, br2=0, trenutno_stanje=0, proslo_stanje=0, br=0,br3=0;
volatile byte zastavica1=0, zastavica2=0, zastavica3=0,zastavica=0;
float frekv=0, frekv1=0, frekv2=0, frekv3=0;
volatile byte t1=0,t2=0,t3=0,t=0;
void pciSetup(byte pin)
{
*digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin)); // enable pin
PCIFR |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
PCICR |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
}
void resetiraj_timer1(){
TCCR1A = 0;
TCCR1B = 0;
TCCR1C = 0;
TIMSK1 = 0;
TCNT1 = 0;
}
void postavi_timer1(){
TCCR1B |= 0x02;
TIMSK1|= 1;
}
void setup(){
resetiraj_timer1();
postavi_timer1();
Serial.begin(9600);
pinMode(ulaz, INPUT);//Ulaz 0 na D2
pinMode(ulaz1, INPUT); //Ulaz 1 na D3
pinMode(ulaz2, INPUT); //Ulaz 2 na D4
pinMode(ulaz3, INPUT); //Ulaz 3 na D5
proslo_stanje = PIND;
pciSetup(ulaz);
pciSetup(ulaz1);
pciSetup(ulaz2);
pciSetup(ulaz3);
sei();
}
void loop(){
Period_us = Period/2;
Period2_us = Period2/2;
Period3_us = Period3/2;
Period1_us = Period1/2;
if(Period_us != 0) frekv = 1/Period_us;
if(Period1_us != 0) frekv = 1/Period1_us;
if(Period2_us != 0) frekv = 1/Period2_us;
if(Period3_us != 0) frekv = 1/Period3_us;
Serial.print("Frekvencije 1 - 4:");
Serial.print(frekv);
Serial.print("\t");
Serial.print(frekv1);
Serial.print("\t");
Serial.print(frekv2);
Serial.print("\t");
Serial.print(frekv3);
}
ISR(TIMER1_OVF_vect){//}
br++;
br1++;
br2++;
br3++;
if(br1>30){
br1=0;
frekv1 = 0;
}
if(br2>30){
br2=0;
frekv2 = 0;
}
if(br>30){
br=0;
frekv = 0;
}
if(br3>30){
br3=0;
frekv3 = 0;
}
}
ISR (PCINT2_vect) // handle pin change interrupt for D0 to D7 here
{
//D2-D5 = PORTD2 - PORTD5
trenutno_stanje = PIND;
trenutno_stanje =trenutno_stanje>>2; //makni prva dva bita
trenutno_stanje &=0x0F; //očisti gornja 4 bita
int pomocna=trenutno_stanje;
trenutno_stanje ^=proslo_stanje;
if(pomocna!=trenutno_stanje){ //Ispitaj jel doslo do promjene
//Doslo je do promjene
t = trenutno_stanje&0x01;
t1 = trenutno_stanje&0x02;
t2 = trenutno_stanje&0x04;
t3 = trenutno_stanje&0x08;
if(t!=(proslo_stanje&0x01)){ //Na prvom pinu D2
unsigned int trenutno = TCNT1;
if(zastavica==2){ // došlo je do druge promjene (za 1 period)
if(br){ //Ako je došlo do prelejva kod timera
Period = ((unsigned long)br*65535-Prosli) + trenutno;
br=0;
}
else{
Period = trenutno - Prosli;
}
zastavica1=0;
}
else{
zastavica++;
if(zastavica==1) Prosli = trenutno;
}
}
if(t1!=(proslo_stanje&0x02)){ //Na drugom pinu D3
unsigned int trenutno = TCNT1;
if(zastavica1==2){ // došlo je do druge promjene (za 1 period)
if(br1)
{ //Ako je došlo do prelejva kod timera
Period1 = ((unsigned long)br1*65535-Prosli1) + trenutno;
br1=0;
}
else
{
Period1 = trenutno - Prosli1;
}
zastavica1=0;
}
else
{
zastavica1++;
if(zastavica1==1)Prosli1 = trenutno;
}
}
if(t2!=(proslo_stanje&0x04)){ //Na trecem pinu D4
unsigned int trenutno = TCNT1;
if(zastavica2==2)
{ // došlo je do druge promjene (za 1 period)
if(br2)
{ //Ako je došlo do prelejva kod timera
Period2 = ((unsigned long)br2*65535-Prosli2) + trenutno;
br2=0;
}
else
{
Period2 = trenutno - Prosli2;
}
zastavica2=0;
}
else
{
zastavica2++;
if(zastavica2==1)Prosli2 = trenutno;
}
}
if(t3!=(proslo_stanje&0x08)){ //Na cetvertom pinu D2
unsigned int trenutno = TCNT1;
if(zastavica3==2){ // došlo je do druge promjene (za 1 period)
if(br3)
{ //Ako je došlo do prelejva kod timera
Period3 = ((unsigned long)br3*65535-Prosli3) + trenutno;
br3=0;
}
else
{
Period3 = trenutno - Prosli3;
}
zastavica3=0;
}
else
{
zastavica3++;
if(zastavica3==1) Prosli3 = trenutno;
}
}
}
proslo_stanje = pomocna;
}
Return to Elektronika za početnike
Users browsing this forum: No registered users and 3 guests