Je ne suis plus très actif sur le forum, en ce moment je bidouille plutôt dans les hautes fréquences. Hautes fréquences qui m'ont ramenées vers les PIC
La base d'un émetteur ondes-courtes (émission en code morse) c'est le pilote (ou VFO Variable Fréquency Oscillator). Bref, un tout simple générateur HF que je vais monter autour d'un DDS AD9850 piloté par un 18F4525 (parce que j'en avais dans le tiroir et qu'il me faut des pins pour un futur encodeur et LCD).
Pour construire un émetteur il suffit ensuite d'amplifier ce signal jusqu'à obtenir quelques watts HF et de pouvoir manipuler la porteuse qu'on enverra vers l'antenne.
La principale qualité d'un emetteur est sa stabilité en fréquence, or c'est précisémment tout le contraire que je veux obtenir, je voudrai construire un émetteur old scool tel les Paraset qui étaient parachutés aux maquisards par les alliés (para: parachute, set: appareil), ces fameux émetteurs clandestins cachés dans des valises que la gestapo recherchait avec tant d'ardeur avec ses wolkswagen gonio. Ce qui m'intéresse surtout c'est que ces émetteurs à tubes avaient un son bien caractéristique: au lieu de faire des tit tiiiit tit tiiiit bien stables il faisaient plutôt des twouit twouiiiiit twouit bien sympathiques, genre sur cette vidéo à partir de 2mn30. C'est ce qu'on appelle dans le langage des radios des pilotes montés sur roulettes.
C'est ce son que je voudrai retrouver pour que les copains de morse me reconnaissent dés que je met un pied sur la fréquence.
Présentement ce projet est la fois une réussite et une déception. Réussite parce que çà fonctionne trop bien et déception parce que c'est désespérément stable. Je pensais pouvoir relier mon manipulateur (qui commande une masse) sur une entrée du pic et tant que le manip est appuyé incrémenter progressivement la fréquence de quelques dizaines de hertz, provoquant ce twouit tant recherché et l'affaire était dans le sac.
Le couac c'est que l'AD9850 à un temps de latence entre chaque mot binaire appliqué, pas question de le faire dériver linéairement.
Je sens que je vais être obligé de repartir sur un pilote analogique et ce début de projet se terminera certainement en petit générateur HF d'atelier (qui ne me servira à rien vu que je suis déjà bien équipé de ce coté).
De mon coté je continue mes recherches sur le twouiiiiit .
--------------------------------------------------------------------- -=oO(£)Oo=- ---------------------------------------------------------------------
TUTO:
Plutôt que de réinventer la roue, pour ceux qui seraient intéressés par la programmation de l'AD9850 en assembleur j'ai fais un petit programme démo simple, à chacun de l'étoffer ensuite suivant les besoins. On peut envoyer le mot binaire en // ou en série, ici j'ai fais mes essais en // pour simplifier la lecture du programme démo.
Formule pour calculer le mot binaire en fonction de la fréquence voulue:
mot=(Fq choisie .2^32)/Fq DDS
Mon module AD9850 est cadencé à 125Mhz.
Exemple pour une fréquence de 7012Khz:
((7.012 . 2^32)/125)= 240930485 = 0x000E5C4EB5
C'est ce nombre hexa 0X 00 0E 5C 4E B5 qu'on va envoyer au module en 5 salves de 8 bits en partant du MSB.
Après l'envoi de chaque octet on fera un front montant sur W_CLK pour valider, et après le 5eme on validera la fréquence en effectuant un front montant sur Fq_ud.
Important: toujours mettre l'octet 5 ( MSB) à 0x00, il sert à des tests d'usine et en y mettant des valeurs aléatoires on risque de bloquer l'AD9850, se reporter au datasheet pour plus d'explications.
Chronologie:
init AD9850:
pin reset=0
pin Fq_ud=0
pin w_clk=0
envoi du mot binaire
chargement du mot5: 0x00
w_clk=1
w_clk=0
chargement du mot4: 0x0E
w_clk=1
w_clk=0
chargement du mot3: 0x5C
w_clk=1
w_clk=0
chargement du mot2: 0x4E
w_clk=1
w_clk=0
chargement du mot1: 0xB5
w_clk=1
w_clk=0
Validation du mot de 40 bits et génération de la fréquence
Fq_ud=1
Fq_ud=0
Ci-dessous la boucle se déroule sans fin pour des facilités de lecture, dans la vraie vie un seul réglage est suffisant pour générer la frq tant que l'AD9850 est sous tension.
Code : Tout sélectionner
;************************************************************************************************
; F6FCO - AD9850 ;
; ;
;********************************************************************************************** ;
Errorlevel-302
list p=18f4525
#include <p18f4525.inc>
CONFIG OSC = INTIO67 ; Oscillateur interne 8MHz
CONFIG IESO = OFF ; Délai au démarrage (ON/OFF)
CONFIG BOREN = OFF ; Reset si chute de tension (ON/OFF)
CONFIG BORV = 0 ; Tension de reset en 1/10ème Volts
CONFIG WDT = OFF ; Mise hors service du watchdog (ON/OFF)
CONFIG PBADEN = OFF ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
CONFIG LPT1OSC = OFF ; Timer1 configuré pour un fonctionnement plus puissant
CONFIG MCLRE = ON ; Mclr configuré comme entrée
CONFIG STVREN = ON ; Reset sur débordement de pile (ON/OFF)
CONFIG LVP = OFF ; Programmation basse tension autorisée (ON/OFF)
CONFIG XINST = OFF ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
CONFIG DEBUG = OFF ; Debugger hors service
CONFIG CP0 = OFF ; Code protection sur block 0 (ON/OFF)
CONFIG CP1 = OFF ; Code protection sur block 1 (ON/OFF)
CONFIG CP2 = OFF ; Code protection sur block 2 (ON/OFF)
CONFIG CPB = OFF ; Code protection sur bootblock (ON/OFF)
CONFIG CPD = OFF ; Code protection sur eeprom (ON/OFF)
CONFIG WRT0 = OFF ; Protection écriture block 0 (ON/OFF)
CONFIG WRT1 = OFF ; Protection écriture block 1 (ON/OFF)
CONFIG WRT2 = OFF ; Protection écriture block 2 (ON/OFF)
CONFIG WRTB = OFF ; Protection écriture bootblock (ON/OFF)
CONFIG WRTC = OFF ; Protection écriture configurations (ON/OFF)
CONFIG WRTD = OFF ; Protection écriture zone eeprom (ON/OFF)
CONFIG EBTR0 = OFF ; Protection lecture de table block 0 (ON/OFF)
CONFIG EBTR1 = OFF ; Protection lecture de table block 1 (ON/OFF)
CONFIG EBTR2 = OFF ; Protection lecture de table block 2 (ON/OFF)
CONFIG EBTRB = OFF ; Protection lecture de table bootblock (ON/OFF)
; ------------------------------------ #define
; D0 à D7 AD9850 sur port C
#define fq_ud LATB,0
#define w_clk LATB,1
#define raz LATB,2
; ------------------------------------
CBLOCK H'0'
Reg_1 :1
Reg_2 :1
Reg_3 :1
ENDC
ORG H'0'
; ------------------------------------
init
movlw B'01110011'
movwf OSCCON
movlw b'00000000'
movwf TRISC
movwf TRISD
movwf TRISB
; init AD9850
bcf raz
bcf fq_ud
bcf w_clk
; -----------------------------------
; calcul du mot hexa selon la fréquence voulue pour un AD9850 cadencé à 125Mhz
; mot = (Fq x 2^32)/Fq DDS
; exemple pour une fréquence de 7012khz:
; ((7.012 x 2^32)/125)= 240930485 --> 0x000E5C4EB5
main
; chargement des 5 octets en //
; chargement octet 5
movlw 0x00
movwf LATC
bsf w_clk
bcf w_clk
; chargement octet 4
movlw 0x0E
movwf LATC
bsf w_clk
bcf w_clk
; chargement octet 3
movlw 0x5C
movwf LATC
bsf w_clk
bcf w_clk
; chargement octet 2
movlw 0x4E
movwf LATC
bsf w_clk
bcf w_clk
; chargement octet 1
movlw 0xB5
movwf LATC
bsf w_clk
bcf w_clk
; validation fréquence
bsf fq_ud
bcf fq_ud
bra main
; ----------------------------------------
end
Montage sur ma platine de developpement:

Pour ce tutoriels, et 