HomeMade

Pełna wersja: Elektroniczne klucze CW w wykonaniu HM
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3
Witam,
(22-07-2009 10:22)sp9fkp napisał(a): [ -> ]Jedną z lepszych konstrukcji niezależnego klucza telegraficznego jest konstrukcja DL4YHF.
Opis tego klucza znajduje się na mojej stronie ( http://sp7dqr.waw.pl/downloads/keyer_dl4yhf.zip ). W pliku projekt płytki w Eagle oraz plik hex do PIC-a (nieco zmodyfikowany - przy nadawaniu z bufora nacisniecie manipulatora przerywa nadawanie bez generowania znaku).
Poniżej zdjęcie klucza.
Pozdrawiam,
Marek SP7DQR
Witam! Ja ze swojej strony chciałbym polecić elektroniczny klucz CW opublikowany w EdW. Nie chcę być złośliwy, ale to układ z czasów kiedy AVT nie leciało na masówkę. Układ rusza od pierwszego odpalenia (nawet jeśli zmontuje się go na płytce uniwersalnej, co widać na zdjęciach). Dwa układy scalone serii 4000 i dosłownie garść elektrodrobnicy. Wprowadzone przeze mnie modyfikacje to zamiana R3 i R4 na jeden opornik o stałej wartości (około 180k) oraz inne wartości R1 i R2 wynikające z zawartości szuflady. Sygnał pojawiający się na głośniku jest wystarczająco duży, aby wysterować głośnik 4W. Dlatego na wyjściu dodałem potencjometr, którym można ściszyć nieco nadawaną przez nas telegrafię.

[attachment=8344]

[attachment=8345]

[attachment=8346]

[attachment=8347]

[attachment=8348]
A gdybyś chciał do klucza dołączyć parę innych funkcji to może nada się się to:

Generator SI570

Mówiąc poważnie, układ może stanowić połowę małego przenośnego transceivera i posiada również funkcjonalność klucza elektronicznego. Prędkość można regulować w trakcie nadawania za pomocą 2 klawiszy.
L.J.
Koledzy, szukam rozwiązania wzmacniacza mcz do klucza elektronicznego zbudowanego na mikroprocesorze. Podsłuch chcę zrobić na głośniku bo buzzer odpada na samym starcie (nie ta jakość dźwięku). Założenie jest jedno - dźwięk musi być bardzo dobrej jakości. Dotychczasowe próby ze wzmacniaczem na jednym tranzystorze i próby "zmiękczenia" sygnału prostokątnego nie wypadły tak jak bym tego oczekiwał. Postanowiłem w końcu zrobić inny układ, tj. filtr PI i wzmacniacz na LM386, ale może ktoś z Was już rozpracował temat i z "prostokąta" zrobił, coś co można słuchać, nie raniąc przy tym uszu.
Wojtku, to nie jest prosta sprawa aby uzyskać dobry sygnał na podsłuchu cw. Przy Husarku sprawdziłem kilka rozwiązań i to co jest tam zastosowane wydaje mi się optymalne. Wzmacniacz LM386 do podsłuchu wystarczy. Proponuję skopiować układ generatora i kluczowania z Husarka. Układ ten ma kształtowanie zboczy impulsów sygnału z generatora. Zwróć uwagę aby generator na wyjściu miał sygnał sinusoidalny a częstotliwość ustawić w pobliżu 700Hz. Powodzenia, Janusz.
Tak podejrzewałem, że nie jest to proste. Tnx.
Bez przesady. Jest mnóstwo dobrych rozwiązań, gotowych do powielenia, choćby z fabrycznych transiwerów. Godnym polecenia jest też bardzo dobry układ z US5MSQ, sprawdzony w wielu urządzeniach. Możesz też spojrzeć na ten schemat. Sprawdziłem i mogę polecić.
Z chęcią poeksperymentuję i sprawdzę jaki sygnał wyjdzie po dwóch kształtujących wzmacniaczach operacyjnych połączonych z LM386. To rozwiązanie ma jeszcze tę zaletę, że mój Nanokeyer ma regulację F podsłuchu, więc ta opcja byłaby nadal "sprawna" (pomijając kwestię potrzeby tej opcji).
Piotrze, co myślisz o tym, żeby sprawę uprościć i "prostokąt" z mikroprocesora dołączyć do filtru LP na jednym wzmacniaczu operacyjnym (tak jak na schemacie) a potem to dołączyć do LM386 ?

Jeśli natomiast chodzi o układ zastosowany w Husarku, to dawno temu złożyłem go w tym trx-ie i potwierdzam, że jest znakomity. Nie pomyślałem tylko, że tak łatwo ten fragment Husarka można dokleić do tranzystora kluczującego wychodzącego z mikroprocesora Nanokeyera.
Problem dobrego kluczowania generatora to nie tylko pozbawiony harmonicznych sygnał ale, w szczególności, stabilna składowa stała i odpowiednio ukształtowane zbocza. Obawiam się, że Twój keyer ma spełniony tylko ten pierwszy warunek.
Witam.

Ostatnio w innym dziale prosiłem o pomoc przy prostym kluczu telegraficznym. Klucz już skończony i sprawdzony praktycznie - będzie wykorzystany w mojej Librze. Ponieważ miał być bardzo prosty został zrobiony na 8-nóżkowym ATTiny45 ze zmianą tempa potencjometrem. Wyjście PB3 przez 12kOhm steruje tranzystor kluczujący BC547B. Jest tylko jedna pamięć zapisana na stałe na etapie programowania, bo jakoś nie przywykłem wykorzystywać pamięci klucza. Ale bardzo łatwo można zwiększyć ilość pamięci. Poniżej kod dla chętnych do pobawienia się nim. Pewnie można prościej Shy, ale dopiero zaczynam zabawę w C/C++.
Pozdrawiam.

Kod:
// main.c
// Created on: 10 sty 2016
// Author: SP6RGB


//Klucz telegraficzny - wyjscie PB4 na wejście KEY TRX
//Podłaczenie klucza do PB0 (kropka) i PB1(kreska)
//Uruchomienie nadawania z pamieci PB3
//Regulacja tempa  potencjometrem podlaczonym do PB2
//Wykorzystany pomysł z nadawaniem z pamieci wg Simon Monk

#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <avr/pgmspace.h>

#define PIN_KROPKA  ( 1<<PB0 )              //Wejscie PB0jako przycisk kropek
#define PIN_KRESKA  ( 1<<PB1 )              //Wejscie PB1 jako przycisk kresek
#define PIN_PAMIEC     ( 1<<PB3 )                //Wyjscie do sterowania TXa
#define PIN_KEY      ( 1<<PB4 )                //Pamiec klucza

//Deklaracje funkcji

void kropkiNadawanie( uint16_t tempoF );
void kreskiNadawanie( uint16_t tempoF );
void zmienneDelay( uint16_t tempoF );
void nadajPamiec( void );
void znakNaMorse( char ch );
void nadajZnak( char* ktoryZnak );
void nadajKropkaLubKreska( char kropkaLubKreska );
uint16_t czytajTempo( void );

uint16_t  tempo = 80;                          //Zmienna do ustawiania tempa nadawania
                                            //Im wieksza tym wolniejsze nadawanie
char* litery[]  =                           //Deklaracja liter Morse'a
{
  ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..",    // A-I Tylko duze litery bo nadawanie z pamieci.
  ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.",  // J-R
  "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."          // S-Z
};
char* numery[] =                               //Deklaracja liczb Morse'a
{
  "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."
};
char* symbole[] = {"-..-.", "..--.."};      //Tylko dwa symbole "/" i "?" - wiecej sie nie uzywa, a nie sa po kolei ASCII jak dla liter i cyfr i nie mozna analogicznie wybierac
const char pamiec_P[] PROGMEM = "CQ CQ CQ DE SP6RGB SP6RGB SP6RGB CQ CQ CQ DE SP6RGB SP6RGB SP6RGB PSE K";

int main ( void )
{
  DDRB     &= ~(PIN_KROPKA | PIN_KRESKA | PIN_PAMIEC);        //Ustawienie wejsc
  DDRB     |=  PIN_KEY;                                       //Ustawienie wyjsc
  PORTB |= PIN_KROPKA | PIN_KRESKA | PIN_PAMIEC;          //Podciagniecie wejsc
  ADCSRA |= (1<<ADEN);                                    //Zalaczenie przetwornika ADC
  ADMUX  |= (1<<ADLAR)| (1<<MUX0);                        //Ustawienie prezentacji wyniku od lewej i wejscia PB2
  ADMUX &= ~((1<<REFS0)|(1<<REFS1) | (1<<REFS2));         //Napiecie odniesienia rowne Vcc

  while( 1 )
  {
      czytajTempo();
      if (!(PINB & PIN_KROPKA))        kropkiNadawanie( tempo );     //Nacisniety pin kropki to kropkiNadawanie
      if (!(PINB & PIN_KRESKA))        kreskiNadawanie( tempo );     //Nacisniety pin kreski to kreskiNadawanie
      if (!(PINB & PIN_PAMIEC))        nadajPamiec();                //Nacisniety pin pamiec to nadaj pamiec
  }
}

//Definicje funkcji

void kropkiNadawanie( uint16_t tempoF )
{
    PORTB |= PIN_KEY;                      //Zalaczenie sterowania TRX
    zmienneDelay( tempoF );             //na czas okreslony przez zmienna tempo
    PORTB &= ~PIN_KEY;
    zmienneDelay( tempoF );                //czas pomiedzy znakami równy kropce
}

void kreskiNadawanie( uint16_t tempoF )
{
    PORTB |= PIN_KEY;
    zmienneDelay( tempoF*3 );              //Kreska równa trzem kropkom
    PORTB &= ~PIN_KEY;
    zmienneDelay( tempoF );                //Przerwa miedzy kreskami rowna kropce
}

void zmienneDelay( uint16_t tempoF )
{
    while( tempoF-- )
    {
    _delay_us( 700 );
    }
}

uint16_t czytajTempo( void )        //uint16_t bo wynik jest mnozony przez 3 i przekracza uint8_t
{                                    //chociaz odczytujemy tylko 8 bitow z ADCH
    ADCSRA |= ( 1<<ADSC );            //Wyzwolenie jednorazowej konwersji
    while((ADCSRA & ( 1<<ADSC )));    //Oczekiwanie na koniec pomniaru
    tempo = ADCH + 1;                 //Wynik odczytwywany z rejestru ADCH plus 1 (zeby nie bylo 0)
    return tempo;
}

void nadajPamiec( void )                    //Funkcja wysylania danych z pamieci
{
   int dlugoscPamieci;                      //Zmienna lokalna do okreslenia dlugosci tablicy
   static char ch;                             //Zmienna lokalna statyczna do "wyjecia" znaku z tablicy
   dlugoscPamieci = __strlen_P( pamiec_P );     //Funkcja wbudowana __strlen_P zwraca dlugosc tabeli
   for(int i = 0; i < dlugoscPamieci; i++)
      {
        ch = (char)(pgm_read_byte(&pamiec_P[i]));//Wyodrebnienie z tabeli Memory* kolejnego znaku do wyslania znakowi do wyslania
        znakNaMorse( ch );                  //Funkcja przeksztalcajaca znak z tabeli "pamiec" w grupe "." i "-" do wyslania
      }
}

void znakNaMorse( char ch )                  //Funkcja do wybrania wlasciwej z tabeli litery lub cyfry
{

    if (ch >= 'A' && ch <= 'Z')              //Jezeli znak miesci sie pomiedzy A a Z to tabela litery
    {
      nadajZnak( litery[ch - 'A'] );         //Wywolanie funkcji wysylajacej wlasciwy znak. Znaki w tabeli opisane w kodzie ASCII podlegaja porownywaniu jak w operacjach
    }                                        //matematycznych. Kod ASCII(ch) - kod ASCII(A) da nam pozycje grupy w " " z tabeli llitery do wyslania. Np A-A=0 czyli pierwsza grupa z tablicy.
    else if ( ch >= '0' && ch <= '9' )       //Jezeli znak miesci sie pomiedzy 0 a 9 to tabela cyfry
    {
      nadajZnak(numery[ ch - '0'] );         //Tak samo jak dla liter
    }
    else if ( ch == '/' )
    {
      nadajZnak(symbole[0]);
    }
    else if( ch == '?' )
    {
      nadajZnak(symbole[1]);
    }
    else if ( ch == ' ' )                    //Jezeli pobrana zostala z tablicy pamiec_P spacja to generujemy przerwe miedzy slowami rowna dlugosci 4 kropek
    {
    zmienneDelay(tempo * 4);
    }
}

void nadajZnak( char *ktoryZnak )             //Z tabeli char* pobrana zostaje grupa znaków w " " z pozycji okreslonej przez funkcje znakNaMorse
{
  int i = 0;
  while( ktoryZnak[i] != NULL )               //Pobiera kropki i kreski, az natrafi na znak konca lancucha
  {
    nadajKropkaLubKreska( ktoryZnak[i] );     //Pobrana kropka lub kreska przekazana jest do funkcji generujacej kropki lub kreski
    i++;                                      //Kolejna kropka lub kreska, az do NULL
  }
  zmienneDelay( tempo * 3 );                  //Po NULL jest nowy znak i bedzie pobrana kolejna grupa kropek i kresek. Przerwa pomiedzy znakami rowna trzem kropkom
}

void nadajKropkaLubKreska( char kropkaLubKreska ) //Prosta funkcja identyfikujaca czy przekazano do niej kropke czy kreske i ja wysylajaca
{

  if ( kropkaLubKreska == '.' )
  {
    kropkiNadawanie( tempo );                    //Uzyte do generowania kropek i kresek te same funkcje co wyzej
  }
  else
  {
    kreskiNadawanie( tempo );
  }
}
Stron: 1 2 3
Przekierowanie