• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Generator sygnału prostokątnego - Arduino Uno
#1
Witam,

Jestem początkującym użytkownikiem Arduino i jest to mój pierwszy post na forum. Przy użyciu Arduino Uno chciałbym stworzyć generator impulsów prostokątnych o zmiennej częstotliwości (regulacja przy użyciu potencjometru, maksymalna częstotliwość ok. 1kHz). Sygnał ten ma być dalej przekazywany do innego mikrokontrolera który będzie zliczał i przetwarzał impulsy.

Chciałbym prosić o porady w kwestii budowy tego typu generatora oraz napisania odpowiedniego programu.
Z góry dziękuję za każdą pomoc.
 
Odpowiedź
#2
Do generacji sygnału wykorzystaj bibliotekę TomerOne. Przykład: http://forum.arduinopolska.com/watek-prz...e-poradnik
Sygnał z potencjometru wprowadź na wejście analogowe. Przykład: http://forbot.pl/blog/artykuly/programow...adc-id3819
Aby częstotliwość nie "zmieniała się sama" zastosuj histerezę. Po wykryciu zmiany wartości potencjometru  zmień częstotliwość przerwań za pomocą funkcji Timer1.setPeriod(czas).
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
Dziękuję za podpowiedź. Bazując na powyższych informacjach zbudowałem układ z przykładu z potencjometrem oraz napisałem program:

Kod:
#include "TimerOne.h"

int odczytanaWartosc = 0;//Odczytana wartość z ADC
float czestotliwosc = 0;//Wartość przeliczona na częstotliwość w Hz

void setup() {
  pinMode(10, OUTPUT);
  Timer1.initialize(1/(2*czestotliwosc));         // initialize timer1
  Timer1.pwm(9, 512);                // setup pwm on pin 9, 50% duty cycle
  Timer1.attachInterrupt(Przerwanie);  // attaches Przerwanie() as a timer overflow interrupt
}

void Przerwanie()
{
  digitalWrite(10, digitalRead(10) ^ 1);
}

void loop() {
  odczytanaWartosc = analogRead(A0);//Odczytujemy wartość napięcia
  czestotliwosc = odczytanaWartosc * (800.0/1023.0); //Przeliczenie wartości na czestotliwosc (maksymalnie 800 Hz)

}

Wydaje mi się że dzięki temu na pinie 10 będą pojawiać się impulsy o częstotliwości zadanej na potencjometrze. Prosiłbym jednak o sprawdzenie czy coś takiego ma w ogóle prawo zadziałać, a jeśli nie to co trzeba poprawić.
 
Odpowiedź
#4
Wykonałem nieco inny program gdyż nie byłem w stanie doprowadzić wcześniejszej wersji do działania:

Kod:
int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC
float f=0;

void setup() {
  pinMode(2, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  odczytanaWartosc = analogRead(A0);//Odczytanie wartości z ADC
  f = odczytanaWartosc * (800.0/1023.0);
  Serial.println(f);
  digitalWrite(2, HIGH);
  delay((1/f)*500);
  digitalWrite(2, LOW);
  delay((1/f)*500);
  
}

Wydaje mi się że ta wersja działa, tzn. przy niskich częstotliwościach dioda miga z odpowiednimi odstępami czasu. Mam jednak inny problem. Chciałbym aby drugi mikrokontroler odbierał i zliczał wygenerowane impulsy. Nie do końca wiem jak połączyć oba urządzenia (czy wystarczające będzie tu zwyczajne połączenie kabelkiem pinu 2 generatora z odpowiednim pinem drugiego mikrokontrolera?) oraz jaki program zapisać.
Będę wdzięczny za każdą pomoc.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości