Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Mini generateur de pulse
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » mar. 17 avr. 2018 18:59 lien vers la Data-Sheet : Cliquez ici

bonsoir,

Dans le meme esprit que le generateur de pulse decrit dans la section asm,
je vous propose celui ci..


Mini_Pulse_Generateur_Sch.jpg


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, :sifflotte: un peu (mais pas tout)
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;

Capture.JPG


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 : 01010101 ==> F=1000x4=4000Hz




A suivre !
Open subject ...

:sifflotte:
Avec un PIC plus gros ..un vrai DDS

le code :
Mini_Pulse_Gene_5Hz_2500Hz_12F1840_8pas_180417.zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Mini generateur de pulse
ducran lapoigne
Avatar de l’utilisateur
Débutant
Débutant
Messages : 96
Enregistré en : septembre 2015

#2 Message par ducran lapoigne » ven. 20 avr. 2018 09:01 lien vers la Data-Sheet : Cliquez ici

bonjour,

merçi pour le partage, et ton site , impressionant ! une vraie référence

j' ai jeté un coup d' oeil en diagonale sur ton code, pour moi, impossible
de comprendre quelque chose sans ordinogramme (flow code)

faut aussi avouer que mes connaissances en c se limitent a l' utilisation basique d' un arduino
... et la aussi il me faut un flow code pour comprendre (ce doit être l' age )

mais je ne demande qu' a m' améliorer ...

++ sur le forum
antoine


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 38 invités