Meranie frekvencie
Príspevkov: 7
• Stránka 1 z 1
- Robo Ulbricht
- Príspevky: 75
- Registrovaný: Štv 04. Dec 2014 22:15:58
- Bydlisko: Banská Bystrica
Meranie frekvencie
Pomocou Arduina možno bez problémov merať pomerne presne frekvencie obdĺžnikových signálov. Dá sa merať od 0 Hz do 8 MHz. Na stránke https://sites.google.com/site/arduinoslovakia/meranie-pomocou-arduina/meranie-frekvencie je popis, ako takýto merač postaviť.
Prvá verzia bola len prevzatý program, ktorý vypisoval frekvenciu na sériovom porte. Druhá verzia bola postavená už podľa schémy, čisto z Arduina UNO, level shiftera a displeja Nokia 5110. Tam bol aj otestovaný celý program. Tretia verzia je popisovaná v článku. Je to v podstate len ATmega328P na veroboarde, napájaná na 5 V, ktorá pomocou level shiftera zobrazuje údaje na displeji, ktorý potrebuje 3,3 V.

Linky:
Prvá verzia bola len prevzatý program, ktorý vypisoval frekvenciu na sériovom porte. Druhá verzia bola postavená už podľa schémy, čisto z Arduina UNO, level shiftera a displeja Nokia 5110. Tam bol aj otestovaný celý program. Tretia verzia je popisovaná v článku. Je to v podstate len ATmega328P na veroboarde, napájaná na 5 V, ktorá pomocou level shiftera zobrazuje údaje na displeji, ktorý potrebuje 3,3 V.

Linky:
- Video - https://www.youtube.com/watch?v=6IOij73TGZw
Ovládanie Nokie - https://sites.google.com/site/arduinoslovakia/displeje/nokia-5110
Knižnica pre Nokia 5110 - https://sites.google.com/site/arduinoslovakia/displeje/nokia-5110/Nokia5110.zip?attredirects=0&d=1
Návod na postavenie - https://sites.google.com/site/arduinoslovakia/meranie-pomocou-arduina/meranie-frekvencie
Program - https://sites.google.com/site/arduinoslovakia/meranie-pomocou-arduina/meranie-frekvencie/frequency_counter_nokia.ino?attredirects=0&d=1
Re: Meranie frekvencie
Chválim web, takže nie som sám koho to napadlo
Len sa tam nedá komentovať...

blog.sitepoint.sk - zaujímavé riešenia okolo Arduina
- Robo Ulbricht
- Príspevky: 75
- Registrovaný: Štv 04. Dec 2014 22:15:58
- Bydlisko: Banská Bystrica
Re: Meranie frekvencie
Google usúdil, že nám musí stačiť, keď tam vieme ľahko vytvárať stránky a komentáre vypol úplne. 

Re: Meranie frekvencie
Pekná práca. Nad niečim takým som uvažoval, ale ešte som sa k tomu nedostal. Ty si to doviedol do úspešného konca. 
EDIT: Teraz pozerám, že tam máš celkom slušnú zbierku zaujímavých projektov.

EDIT: Teraz pozerám, že tam máš celkom slušnú zbierku zaujímavých projektov.
Re: Meranie frekvencie
p. Ulbricht super projekt 
Čo by som mal zmeniť ak by som chcel merať frekvenciu na pine D3 miesto pinu D5.
Ďakujem.

Čo by som mal zmeniť ak by som chcel merať frekvenciu na pine D3 miesto pinu D5.
Ďakujem.
Ďakujem za pomoc posjirka, Diego, Xeram a barado 

Re: Meranie frekvencie
Na stránke Nick Gammon http://www.gammon.com.au/forum/?id=11504
máme skript na meranie frekvencie pomocou pinu D2.
Trošku som skript upravil na 2*16 LCD cez i2c.
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <Wire.h>
volatile boolean first;
volatile boolean triggered;
volatile unsigned long overflowCount;
volatile unsigned long startTime;
volatile unsigned long finishTime;
void isr ()
{
unsigned int counter = TCNT1;
if (triggered)
return;
if (first)
{
startTime = (overflowCount << 16) + counter;
first = false;
return;
}
finishTime = (overflowCount << 16) + counter;
triggered = true;
detachInterrupt(0);
}
ISR (TIMER1_OVF_vect)
{
overflowCount++;
}
void prepareForInterrupts ()
{
EIFR = bit (INTF0);
first = true;
triggered = false;
attachInterrupt(0, isr, RISING);
}
void setup ()
{
lcd.init();
lcd.backlight();
Serial.begin(115200);
Serial.println("Frequency Counter");
TCCR1A = 0;
TCCR1B = 0;
TIMSK1 = bit (TOIE1);
TCNT1 = 0;
overflowCount = 0;
TCCR1B = bit (CS10);
prepareForInterrupts ();
}
void loop ()
{
unsigned long elapsedTime = finishTime - startTime;
float freq = F_CPU / float (elapsedTime);
lcd.setCursor(0,0);
lcd.print("Frekvencia ....");
lcd.setCursor(0,1);
lcd.print(freq);
lcd.print(" Hz ");
delay (500);
prepareForInterrupts ();
}
máme skript na meranie frekvencie pomocou pinu D2.
Trošku som skript upravil na 2*16 LCD cez i2c.
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <Wire.h>
volatile boolean first;
volatile boolean triggered;
volatile unsigned long overflowCount;
volatile unsigned long startTime;
volatile unsigned long finishTime;
void isr ()
{
unsigned int counter = TCNT1;
if (triggered)
return;
if (first)
{
startTime = (overflowCount << 16) + counter;
first = false;
return;
}
finishTime = (overflowCount << 16) + counter;
triggered = true;
detachInterrupt(0);
}
ISR (TIMER1_OVF_vect)
{
overflowCount++;
}
void prepareForInterrupts ()
{
EIFR = bit (INTF0);
first = true;
triggered = false;
attachInterrupt(0, isr, RISING);
}
void setup ()
{
lcd.init();
lcd.backlight();
Serial.begin(115200);
Serial.println("Frequency Counter");
TCCR1A = 0;
TCCR1B = 0;
TIMSK1 = bit (TOIE1);
TCNT1 = 0;
overflowCount = 0;
TCCR1B = bit (CS10);
prepareForInterrupts ();
}
void loop ()
{
unsigned long elapsedTime = finishTime - startTime;
float freq = F_CPU / float (elapsedTime);
lcd.setCursor(0,0);
lcd.print("Frekvencia ....");
lcd.setCursor(0,1);
lcd.print(freq);
lcd.print(" Hz ");
delay (500);
prepareForInterrupts ();
}
Ďakujem za pomoc posjirka, Diego, Xeram a barado 

- Robo Ulbricht
- Príspevky: 75
- Registrovaný: Štv 04. Dec 2014 22:15:58
- Bydlisko: Banská Bystrica
Re: Meranie frekvencie
kosice4 píše:p. Ulbricht super projekt
Čo by som mal zmeniť ak by som chcel merať frekvenciu na pine D3 miesto pinu D5.
Ďakujem.
Ten existujúci kód nie je na to vhodný. Pin D5 je T1 vstup pre Timer 1. Čo preložené do ľudskej reči znamená, že iba na tom pine vie ATmega328P používať externý digitálny signál ako hodinový, podľa ktorého to vlastne meria frekvenciu. Ešte je tu teoreticky D4, čo by mal byť T0 pre timer 0, ale ten je len 8 bitový čítač, takže by sa museli poupravovať prerušenia úplne inak.
Príspevkov: 7
• Stránka 1 z 1