• 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 paczek 500kHz co 2kHz
#1
Witam wszystkich.

Jestem początkującym w Arduino i potrzebuje pomocy w rozwiązaniu problemu.

Chce zbudować generator generujący paczki o częstotliwości 500kHz co 2kHz

Poniżej zamieszczam kawałek kodu który napisałem.

Proszę o pomoc w poprawieniu błędów w kodzie gdyż nie uzyskuje paczek tylko cały czas emitowany jest sygnał około 500kHz.







#include <TimerOne.h> // biblioteka

//__________________________________________________________

void setup()

{

  pinMode(9, OUTPUT); // pin jako wyjście

}

//__________________________________________________________

void loop()

{

  Timer1.initialize(2); // przerwanie co 2us => 500kHz

  Timer1.pwm(9, 512); // współczynnik wypełnienia dla 512 => 50/50

  noInterrupts(); // wyłączenie przerwania

  delayMicroseconds(500); // przerwa na czas 500us => 2kHz

  interrupts(); // załączenie przerwania

  delayMicroseconds(500); // przerwa na czas 500us => 2kHz

}


Załączone pliki Miniatury
       
 
Odpowiedź
#2
To
Kod:
  Timer1.initialize(2); // przerwanie co 2us => 500kHz
  Timer1.pwm(9, 511); // współczynnik wypełnienia dla 512 => 50/50
Daj do setup(), po co inicjować funkcje pierdyliard razy na sekundę?

W loop() daj to
Kod:
  Timer1.stop();
  delayMicroseconds(500);
  Timer1.start();
  delayMicroseconds(500);

Oczywiście zdajesz sobie sprawę, że pisząc w taki sposób program (mam na myśli delaye ), to on nie będzie w stanie zrobić nic poza tym co powyżej napisano? Jeśli coś dopiszesz do loop(), to te czasy się rozjadą.
Można to zrobić lepiej.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
Jeżeli można to rozwiązać w lepszy sposób to proszę o pomoc w modyfikacji tego programu.
Generalnie ten program będzie miał jedno podstawowe zadanie generować sygnał radiowy do szukania przewodów w ścianach itp. Obecnie posługuje się analogowym układem takiego generatora ale rozjeżdża się w zależności od napięcia zasilającego i temperatury otoczenia.
Kolejną rzeczą jaką będę chciał zbudować będzie odbiornik radiowy dostrojony do generowanej częstotliwości, który będzie pokazywał moc sygnału czy w postaci wartościowej na wyświetlaczu LCD lub bargraf LED. Obecnie z powodzeniem używam zwykłego odbiornika radiowego.
 
Odpowiedź
#4
Przetestowałem modyfikacje kodu i działa.
Program nie zadziałał od pierwszego włączenia. Niedziałania kodu spowodowane było resetowaniem lub przerywaniem wykonywania programu komunikacją z komputerem (używam Arduino NANO). Gdy zauważyłem że lampka transmisji szeregowej mrugała dało mi to do myślenia i przepoiłem na zwykłą ładowarkę 5V. W tym momencie na pinie 9 zaczął być generowany sygnał, a nie jakieś zakłócenia.


Załączone pliki
.bmp   przebieg.bmp (Rozmiar: 3.15 MB / Pobrań: 4)
 
Odpowiedź
#5
Pobawiłem się Timerem1 i wyskrobałem taki kod:

Kod:
volatile int licznik = 0;

ISR(TIMER1_COMPA_vect)
{
licznik++;
if ((licznik > 125)&&(licznik < 250)) OCR1A = 0;
if (licznik > 250){
     OCR1A = 8;
     licznik = 0;
  }
}


void setup()

{
  pinMode(9, OUTPUT);
 
  TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11);
  TCCR1B = (1<<WGM13) | (1<<CS10);
  ICR1   = 16;  
  TIMSK1 = (1<<OCIE1A);
}

void loop()

{

}

To zadziała tylko na Atmega, więc na twoim Nano jak najbardziej.
Generowanie sygnału wykorzystuje Timer/Counter1 i przerwanie od porównania dla kanału A (więc tylko noga 9).

Rdzeń procesora nic nie robi, bo to są inne bebechy, więc możesz sobie w loop() obsługiwać wyświetlacz, jakiś odbiornik, czy co tam jeszcze chcesz.
Nie wiem czy wszystko dobrze policzyłem, więc mogą być jakieś delikatne odchyłki w parametrach tego przebiegu.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#6
Bardzo Dziękuje za cenną lekcje i napisanie kodu
Pozdrawiam
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości