maj: 27/12/2019
V.O. 13 octobre 2004
catégorie : application microcontroleur PIC
Generateur
BF Sinus utilisant :
PIC18Fx6K22 (Multiformes d'ondes)
Home Page ( Index )
Version 18F46K22
40Mhz (PLL) DAC ext 8 bits dialogue RS232 (en C18) 1Hz à
> 20000Hz Sinus,Triangle,Carre,Rectangle,Dent de scie
+ ...
Version 18F46K22
40Mhz DAC interne 5 bits , RS232 (en C18)
1Hz à > 20000Hz Sinus,Triangle,Carre,Rectangle,Dent
de scie + ...
Version
autonome 18F26K22 DAC5b interne Clock 40MHz
RS232 ( C18) 1Hz à > 20000Hz Sin,Tri,Car,Rect,Dent de
scie + potars...
Version
autonome 18F26K22 DAC5b interne Clock 40MHz
5 BP + LCD2X16 ( C18) 1Hz à > 20000Hz
et RS232.
Version autonome 18F26K22
DAC5b interne Clock 40MHz
SIMPLIFIEE avec bluetooth et interface Distant.
ICI
Version minimaliste de Test 18F26K22 et AD9850 sous MikroC 7.60 (27/12/2019)
Version
DDS avec 18F46K22 en C18 (domaine BF )
29/04/2012
L'usage de ce microcontroler (MCU) donne beaucoup de
souplesse, vu ses grandes capacités en RAM, en EEPROM et
en code FLASH
L'usage de la PLL sur l'horloge basée sur un Quartz de
10Mhz donne un temps de cycle de 4/40MHz => 100nS
4 tables de forme d'ondes sont en ROM et definies pour 1
periode de signal:
+ 1 table de travail en RAM*.
Apres optimisation
au regard de l'ASM generé par C18, detail via MPLAB IDE
-> "View" -> "Dissambly Listing"
pour localiser la boucle DDS
On peut mesurer que la boucle DDS est parcourue en
27 cycles machine pour une Horloge de 40MHz .
Reporter cette valeur dans le tableur pour calculer le
coefficient de calibration .
Detail via MPLAB IDE -> "View" -> "Dissambly
Listing" pour localiser la boucle DDS
Schema (Isis):
Une fois calibré, il suffit de taper au clavier la
frequence voulue sur 5 digits . 00001 à 40000. avec une
precision de 1/45 em de Hz
Quelques signaux obtenus
à 1000Hz :
SIGANUX BRUTS SANS AUCUN FILTRE !
![]() |
![]() |
![]() |
![]() |
sinus 1000Hz | Carre 1000 Hz | Triangle 1000Hz | Dent de scie 1000Hz |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Reverse Dent de Scie 1000Hz | Taux=1% 1000Hz | Taux =50% 1000 Hz | Taux=99% 1000Hz |
S=Sinus une periode est definie
dans une table de 256 valeurs contenant les amplitudes.
sinus de 0 à 2* PI
C=Carre
T=Triangle
D=Dent de scie. La descente est
sur 1/256 de la periode.
et une table de travail en RAM pour les signaux Dent de
scie Inverse et Rectangle à Rapport cyclique variable .
R Pour la fonction Reverse
dent de scie , la table originale est copiee à
l'envers dans la table de travail
X= Rapport cyclique
variable , l'entree analogique RA0 est utilisee
pour obtenir l'info de reglage
valeur 0 à 1024, recadrée sur 0-255 pour parcourir un
index dans la table SIGNAL de 256 valeur
Le taux varie de 1 (car 0 = pas de signal!) à 254 ( soit
99% du temps à 1) et affichage en % correspondant.
A chaque appui de X , la valeur du taux est raffraichie
et affichée en fonction dur reglage du potar sur RA0.
La frequence elle est celle fixee par la derniere valeur
envoyée via le terminal.,elle n'est pas modifie par le
Taux!
M= Marqueur , un signal est
placé au debut de la periode , de largeur 2/256, et +-48
points centre sur 48 pts en amplitude
pour utilisation sur voie B du scope : faciliter la
mesure de duree axe des temps X .
Je me sers du Terminal Vbray et affectation de valeurs
predefinies sur les touches
de fonctions
exemple de config : 18F46k22_DDS.tmf
L'amplitude du
signal en sortie bufferisé est de 0.87V efficae centre
sur une composante continue de 1.4V
Carre : amplitude de 0,06V à l'etat bas (0) , et à 2.8V
à l'etat haut (1). avec alim 5V du DAC558.
L'analyse
FFT est faite en envoyant le signal DDS , via un diviseur
de tension constitué par 6,8K et 390 ohms , sur l'entree
LINE de la carte SON
L' excellent Logiciel "Spectrum
Laboratory V1.82" est utilisé pour effectuer la
FFT , F sampling=96000 , sur 65536 => points resol=1.46Hz
*remarques
Tricks & Tips :
-Attention au
cadrage des messages en EEPROM et donc terminateur de
string=0
-Attention EEPROM de 1024 bytes sur ce µC, modif
subroutines EEPROM en consequence!
-Bizarre :
SIGNAL[0]=48; // <- ne marche pas ????
i=0; SIGNAL[i]=48; <- OK
-Attention au placement du tableau SIGNAL[256] en RAM ,
ne doit pas etre à cheval sur une page ! sinon effet de
bords !
-Attention à traiter les erreurs de COM UART
Source C18 : 18F46K22_DDS_STCXDRM_120430_1hz_40Khz_C18.c
Chargeur : 18F46K22_DDS_120430_STCXDRM_1hz_40Khz_C18.hex
On obtient d'assez
bons resultat jusqu'à 20000Hz , qui se deteriore ensuite
plus on monte en frequence ! normal!!!
Impossible de rivaliser avec un circuit DDS specialisé
pour les frequences au dela de 20Khz..
Mais au moins on a 4 formes d'ondes et d'autres
posibilites annexes! dans le DOMAINE B.F.
Interface
GUI sur tablette Archos via Bluetooth
developpement en
cours ..
A SUIVRE :
Reste
à rajouter un etage de puissance ! pour sortir en basse
impedance , quelques volts.
et peut-etre un
reglage de volume numerique ?
INTERFACE opérateur
avec tablette Archos 43it
Application sous RFO_Basic Android pour la partie grafique
et dialogue bluetooth avec PIC
Un module bluetooth
RN41 mikroelectronika est utilisé à la place du
convertisseur TTL/RS23 DS275
On a donc plus besoin de RS232, afficheur ou telecommande
pour piloter le Gene BF DDS
dommage
que le bluetooth n'est pas supporteé par le kit de
developpement android. => obligé d'utiliser l'Archos
en reel pour tester l'appli...
23/12/2013
ça c'etait
le passé,
maintenant il existe http://mougino.free.fr/RFO/BASICLauncher05.apk
appli à lancer sur
l'Archos Android et L'editeur SC1 http://www.scintilla.org sur le PC , qui via la touche F5
=>et via Wifi (SANS FIL) ,
lance le programme bas sous RFObasic de l'android !.
Gain de temps ENORME...
Variante
DDS avec 18F46K22 , usage du DAC interne 5 bits
Le PIC18F46K22 a la
particularité de contenir un DAC 5 bits avec
reference VDD ou 4.906V ou 2,048V ou 1,024V
d'ou cette variante pour eliminer le DAC558 8 bits
externe qui devient de moins en moins courant .
Le hardware est donc reduit* au seul microcontroller..+
interface RS232 (DS275 en Dip8)
Les resultats sont quand meme en dessous du DAC558 qui
est sur 8 bits et permet de mieux arrondir les formes ,
car 256 pas au lieu de 32 !
Mais cela peut etre suffisant pour quelques applications
ou tests.La reference de 4.096V est utilisée plutot que
VDD qui est moins stable..
*Par contre la sortie du DAC (RA2) necessitera de mettre
derriere un ampli buffer pour pouvoir l'utiliser sous
faible impedance.
Allure des signaux obtenus sur l'oscillo HAMEG 60Mhz (donc
sur Z=1Mohms // ~20pf) .
Les escaliers sont visibles à faible frequence et la
distorsion devient visible au dessus de 15Khz.
L'amplitude (1,3V eff) est constante de 1Hz
à 20000Hz à -0,4db pres , 36Khz à -1,2db (couplage via
C=100µF sur le multimetre Veff).
fichier source C18 : 18F46K22_DDS_STCXDRM_120705_ADC5b_C18.c
chargeur : 18F46K22_test_DAC5b.hex
Version autonome DDS avec 18F26K22 utilisant son
DAC5bits
Le PIC18F26K22 en DIP28 , contient aussi un DAC 5 bits
avec reference VDD ou 4.906V ou 2,048V ou 1,024V
au depart la
liaison interface 2T RS232 est conservée pour le developper des
modifications/ameliorations:
Version
TERMINAL RS232 :
Projet MC18 regroupant les dvers fichiers utilises
Rappel du mode de calcul consigne DDS => frequence
via le terminal VBRAY (RS232)
fichier macro : 18F26k22_DDS.tmf
Des frequences fixes sont affectées à des touches de fonctions,
mais à tout moment
on peut saisir n'importe quelle valeur au clavier, en respectant
le format sur 5 digits et terminé par Enter (CR)
ex: 15625<CR> pour 15625Hz ou 00008<CR> pour 8HZ
De meme on peut changer la forme d'onde :
SINUS,CARRE,TRIANGLE, Dent de SCIE, Reverse Dent de SCIE et *Rectangle..
Rajout touche de fonction Amplitude :
A chaque appui on change la reference du DAC5bits, soit 1,024 2,048
ou 4,096 volts
ainsi que 2 ampli OP Rail to Rail montes en suiveur. Apres le 1er
suiveur , un potar de reglage fin est inseré pour
reglage de 0 à Amplitude maxi selectionnée, Le 2em Ampli OP
permet une sortie basse impedance (Zs >= 750 ohms).
A suivre .. ampli de puissance avec alim symetrique +-12V pour
sortir quelques volts sur 50 Ohms mini.
Rajout touche de fonction Potar pour reglage
valeur consigne DDS
On ne peut pas utiliser directement la valeur Analogique 0-1024
points pour definir une frequence entre 1Hz et 40000Hz!
donc usage specifique d'un potar lineaire classique , course de
270° :
Potar au milieu (zone morte de 45 à 55%) Pas d'
evolution de consigne et Led Stop allumée
Potar en dessous de 45% ,
- Diminution de la consigne avec un pas variant
exponentionnellement avec l'angle du potar.
- Led Down allumée.
Potar en dessus de 55% ,
-Augmentation de la consigne avec un pas variant
exponentionnellement avec l'angle du potar.
-Led UP allumée
Affichag de la consigne rafraichit en permanence
Touche Valid: pour sortir du mode potar et donc
utiliser la derniere consigne reglee
Touche Taux : permet le mode specifique
Rectangle
Un potar de reglage taux , delivrant 0 à 1024 points / 4 soit 0
à 255, permet de
regler le rapport ON/OFF de la periode , entre 1% et 99%.
L'appui sur Taux permet une lecture du potar et donc rafraichit
le mode Rectangle
Schema :
TRicks
& Tips (Problemes rencontres :
MPLAB IDE ne
sauvegarde pas tout le contexte dans un projet..
J'ai perdu 2H00 à rechercher pourquoii je n'avais plus la meme
relation consigne DDS et Frequence obtenue
j'avais 819Hz au lieu des 1000Hz prevus.. une coche de trop dans
l'option Compilateur C18 : Integer Promotion !
ce qui mettait, apres decorticage de l'ASM géneré pour la
boucle DDS , 35 cycles au lieu de 27 cycles..
Apres decochage de l'option,tout rentre dans l'ordre : boucle DDS
tourne en 27 cycles soit 2,7µS
avec Q=10MHz et PLL 4x activée.
Adaptation
d'impedance:
Le double ampli OP rail to rail utilisé TLC27M2, n'a pas un slew
rate suffisant pour le mode Rectangle ou Carre.
D'autre part , le niveau bas de la sinusoide est un peu emoussé,
et on ne peut pas utiliser une charge de sortie
inferieure à 750 ohms, sinon grosse distorsion prtie negative de
la sinusoide
soluces possibles :
- Trouver d'autre ampli avec meilleur Slew Rate (V/µS) et
Rajouter un offset DC sur l'entree -
- Utiliser directement un ampli de puissance DC-100KHz avec Zs=50
ohms mini, avec alim symetrique +-12V.
Je pensais pouvoir utiliser -REF du DAC pour imposer un niveau
bas de 0,5V,
mais probleme de datasheet, ou imcomprehension de ma part ?
question posée sur le forum futura....
A noter que l'interface
2T RS232 convient tres bien pour cette appli (38400bauds)
et ne coute quasiment rien.
testé OK aussi avec un cordon Trendnet RS232-USB TU-89.
Version 18F26K22 DDS autonome
avec interfaces LCD 2x16 cars + clavier 5 boutons poussoirs et RS232
versus 17/03/2013
En plus des commandes possibles via le terminal RS232, l'ajout de
5 boutons poussoirs et d'un ecran LCD 2x16 car
permet une utilisation autonome.(sans PC!)
![]() |
par defaut, au lancement programme : mode Sinus, Consigne 1000Hz, Amplitude Maxi 2,048 V Deplacement dans le menu par BP droit ou BP Gauche SINUS CARRE TRIANGLE Dent de SCIE Reverse Dent de SCIE Rectangle sous -menus : Reglage TAUX 2 à 98% avec BP - + Reglage max DAC 1, 2, ou 4V avec BP + ou - Choix de Frequence 1 parmi 64 avec BP + ou - Regalge FIN de frequence à 1Hz pres BP + ou - Touche Validation pour chaque reglage ou mode. gamme F=1Hz à 45 000 Hz Amplitude reglable de 0% à 100% de la sortie DAC 100% pour 1,024 ou 2,048 ou 4,096V Commande AUSSI via un terminal RS232 ! |
![]() |
![]() |
Affichage sur 1 LCD 2x16 cars :
La Ligne 1 du haut sert au libellé du MENU
La ligne 2 du bas, à afficher ou modifier des valeurs
2 BP (BP4 Gauche , BP5 Droite ) pour se deplacer horizontalement dans le menu ,
comportant 10 items.
2 BP (BP1 Haut , BP2 Bas)
pour se deplacer à l'interieur du sous menu ou pour modifier une
valeur par + ou -
1 BP( BP3 Valid) pour
valider l'action (et retour à la boucle infinie DDS)
![]() |
![]() |
Platine recevant les 5 BP + le "OU" à diodes vers RB0 | BP4 Gauche , BP5 Droite , BP1 Haut , BP2 Bas , BP3 Valid |
Merci à C.BERNARD
pour l'etude du Circuit imprimé.
La boucle DDS etant une boucle sans fin ,On ne peut pas faire en
plus du pooling, gaspillage de temps!
pour tester un eventuel appui sur un BP.
Il faut donc traiter la sortie de boucle DDS par un Event :
Les 5 BP sont relies par un "OU" à diodes sur l'entree
RB0, interruptible.
Ce qui permet un traitement immediat des BP,en sortant de la
boucle infine DDS
( nota : la boucle DDS est de 27 cycles à 10MHz x 4(PLL) soit en
2,7µS).
De plus, la laison RS232 reste toujours operationelle , via L'interruption
sur arrivée d'un caractere sur l'UART.
qui, elle aussi, permet de sortir de la boucle DDS , et traiter
la commande clavier.
Les fonctionalites du menu , resumée ici :
GeneDDS_Chart_Menu_LCD.pdf
Partie DDS PIC18F
Documents :
Signaux obtenus
Liste du materiel
Schema ISIS : DDS_18F26K22_DAC5b_LCD_Touches_130314.DSN
Chargeur : 18F26K22_DDS_DAc5b_RS232_BP_RB0_130316.hex
macro terminal Vbray :18F26k22_DDS.tmf
![]() |
La sortie DAC n'est pas
exploitable directement, c'est pourquoi un ampli OP suiveur, rail
to rail, est connecté sur cette sortie
Il alimente un potar de 10K pour le reglage fin d'amplitude , sur
lequel un autre suiveur est connecté pour delivrer le signal
sous faible
impedance , la charge doit etre ici >=750 ohms pour ne pas
perturber le signal
Le Menu permet 3 niveaux de sortie maxi 100% : 1,024 cr à cr, 2,048V
cr à cr et 4,096V cr à Cr.
Test AD9850 DDS avec 18F26K22 (27 dec 2019)
programme compilé avec MikroC version 7.60
Fosc interne à 16 MHz
UART1 à 19200 bauds
Hardware :
Base et module alimentés sous 5V
utilisation des rangées de pins +5V,0V, SCL, SDA et RC5
Projet:
_18F26K22_AD9850_DDS_Test_MikroC.zip
PIC18F26K22_AD9850_DDS_test_2019.c
P18F26K22_Fosc_Interne_16MHz.cfgsch
visu terminal :
Test AD9850 avec PIC18F26K22 16MHz
Test en mode detaillé , envoi byte par byte
Init à 1Hz
Init à 1000Hz
Init à 5000Hz
Init à 20KHz
Init à 200KHz
Init à 1 MHz
Init à 1Hz
Envoi d'une consigne de frequence toute les 5 secondes
et tourne en boucle
Video de ce test:
18F26K22_AD9850_Test_191227.webm
Top Page
Retour Home Page (index)