Dans le meme esprit que le generateur de pulse decrit dans la section asm,
je vous propose celui ci..
Les ingredients :
un petit MCU DIP8 12F1840
qui tourne à 32MHz
une liaison UART (Ecran/Clavier) ou mieux ,via BlueTooth HC06 -> Blueterminal Android
entree analogique si choix : usage du potar
Sortie sur RA2 (possible de rajouter un ampli Transistor MOSFET A302 pour abaisser l'impedance de sortie)
je voulais au depart partir sur un mini DDS, car ce PIC a une sortie analogique 5 bits
mais il n'a pas assez de ROM et RAM ...!
dans le code: choix de programmation (voir #define SOFT_PATTERN)
* Avec un potar pour regler le duty cycle de 12,5% à 87% en 7 pas ..
validé par envoi du caractere 'U' (comme Update)
Nota: On pourait aussi utiliser une entree (Bouton poussoir pour valider la position du potar)
*Avec Pattern 8 bits , via commande "Pxxxxxxxx<CR>"
on peut alors envoyer n'importe quelle paterne
par defaut celle ci est initialisée 11110000 => signal Carré
pour inverser le signe P00001111<CR>
pour doubler la frequence P00110011<CR>
pour quadrupler la frequence P01010101<CR>
envoi de Fxxxx<CR> frequence definie sur 4 digits , mais limitée au domaine
5HZ .. 2500 HZ soit la syntaxe de commande F0005<CR> .. F2500<CR>
Cette frequence est definie pour un signal carré (avec Pattern=11110000)
La periode est issu d'un calcul T=1/F
La saisie de frequence est alors transformée en flottant, pour obtenir le nombre de µS correspondant
T= 1.000 000 / F
Le timer 1 est utilisé avec une bonne dynamique sur 16 bits : 65535 pas
mais le signal de sortie transite par un table de BIT
pourquoi une table ..plus rapide que des decalage (en C) ,
( à revoir le principe , mais en ASM ! on ferait plutot un decalage de bit ..qui tombe dans le Carry ..test Carry ..)
un signal de base est donc ecrit en 8 passes ..
ce qui donne la formule
K1= (unsigned int) (1000000.0/(FConsFreq*8));
et un correctif ponderateur qui arrange un peu les frequences hautes,
K1=K1-(ConsFreq/500) ;
K1 en µS
Le Timer1 est alors inialisé avec cette valeur L1=65536-K1
T1H= L1 >>8;
T1L= L1 & 0x000000FF;
Une boucle fermé explore donc la table de 8 valeurs ( bits) avec un interval temporel
issu du timer1. On n'utilise pas d'interruption, mais un pooling sur le bit TMR1IF
La boucle surveille aussi la variable c1 , qui reste à zero, tant qu'on ne recoit pas de caractere sur l'UART
L'UART est traitée en interruption .. sans interference avec le Timer1, car TMR1IE=0;
Malheureusement les quelques instruction situées dans la boucle ..mangent des µS !
Ce qui fait le manque de precision entre Consigne et Mesure .
On est pourtant à FOSC=32MHz .. cycle de 125nS
A chaque tour de boucle, on peut donc en sortir si on a envoyé une commande clavier
et modifier soit la frequence, soit la Pattern (ou les 2 avec Pattern!)
il y a donc ces limitations de precision dus à la non linerarité de reponse d'une telle fonction.
Neamoins, avec un petit correctif (surement ameliorable !!)
j'obtiens la relation suivante entre CONSIGNE ( emise par le clavier ) et mesure Oscillo Tektronix
Saisie Freq OK
F =1000.0Hz
Période 8 pas ,en µS : 123
Delay Timer1 = 65413
Saisie Pattern : 01010101F=1000x4=4000Hz
A suivre !
Open subject ...
Avec un PIC plus gros ..un vrai DDS
le code :

