conseil oscillateur programmable

Bonjour à tous

Mon projet: la réalisation d'un pseudo four induction.

Pour mener à bien mon projet, le système serai géré par une UNO qui peut contrôler la température, la fréquence dans l'inducteur, l'affichage et les entrées des paramètres utilisateur.

Mais pour ce, j'ai besoin de vos lumières pour trouver un oscillateur programmable.
J'ai trouvé plusieurs cartes, à base de LTC6904 ou DS1077, qui peuvent attendre respectivement 68 et 133MHz. Certes, qui peut le plus peut le moins, mais je n'ai pas besoin d'aller jusqu'à ces hautes fréquences, d'autant que plus l'amplitude de la gamme de fréquence est élevée, moins le choix de la fréquence dans la gamme que je vais utiliser sera élevé.

Est-ce que quelqu'un pourrai donc m'aiguiller pour trouver un oscillateur programmable qui couvre la bande 1kHz à 150kHz environ, et qui me permettrai d'optimiser des pas en fréquences assez rapprochés pour optimiser le rendement et la puissance dissipée?

Merci par avance pour vos idées...
cordialement
Laurent

Kanguru:
Est-ce que quelqu'un pourrai donc m'aiguiller pour trouver un oscillateur programmable qui couvre la bande 1kHz à 150kHz environ, et qui me permettrai d'optimiser des pas en fréquences assez rapprochés pour optimiser le rendement et la puissance dissipée?

bonjour
quelle forme d'onde de sortie ? (carré,sinus,triangle,autres ? )
quelle puissance de sortie ?
tu cherche un pilote ou de la puissance ?

bonjour Artouste

je me contenterai d'un signal carré pour attaquer des optos qui piloteront des IGBT.
C'est le driver qui m'intéresse, il doit pouvoir changer de fréquence, puisque le gain de la puissance dépendent de l'inducteur et des capas associées.

A+

Laurent

Bonjour,

Avec un timer de l’ATmega.

hello pourquoi ne pas générer un signal PWM à 50% ?

//generation d'un signal carre ( pwm à 50% )
const int sortie_PWM = 3;    // pin avec signal PWM
void setup()
{
  pinMode(sortie_PWM, OUTPUT);
  digitalWrite(sortie_PWM, LOW);
  TCCR2A = 0x23;
  //**************************************************************************
  //___________________si besoin de changer la fréquence______________________
  
  //TCCR2B = 0x0C;//presc = /1024 avec OCR2A = 249 =>    au frequence metre 999.53hz
  //TCCR2B = 0x09;//presc = /1024 avec OCR2A = 200 =>    au frequence metre 105.910hz
  //TCCR2B = 0x09;//presc = /1024 avec OCR2A = 130 =>    au frequence metre 122.000hz
  //TCCR2B = 0x09;//presc = /1024 avec OCR2A = 125 =>    au frequence metre 127.000hz
  //TCCR2B = 0x09;//presc = /1024 avec OCR2A = 110 =>    au frequence metre 144.076hz
  //TCCR2B = 0x09;//presc = /1024 avec OCR2A = 105 =>    au frequence metre 150.872hz
  //TCCR2B = 0x09;//presc = /1024 avec OCR2A = 100 =>    au frequence metre 158.341hz
  //TCCR2B = 0x09;//presc = /1024 avec OCR2A = 95 =>    au frequence metre 166.584hz
  //TCCR2B = 0x09;//presc = /1024 avec OCR2A = 90 =>    au frequence metre 175.741hz
  //TCCR2B = 0x09;//presc = /1024 avec OCR2A = 70 =>    au frequence metre 225.246hz
  TCCR2B = 0x09;//presc = /1024 avec OCR2A = 60 =>    au frequence metre 262.172hz
// mettre dans OCR2A la valeur lue ........ci dessus 
  OCR2A = 105;//permet de regler une fréquence précise dans la gamme de TCCR2B
  pinMode(sortie_PWM, OUTPUT);//autorise la sortie PWM sur D3
  OCR2B = 52;//permet de regler le % dans la periode. ex:OCR2B = OCR2A/2 = 50%= signal carre
  //***************************************************************************
}

void loop()
{
  }

Parce qu’avec un timer en mode CTC il y a plus de possibilités qu’en mode PWM :

  • Choix du pré-scaleur du timer
  • Choix du paramètre OCRxA qui peut être sur 8 ou 16 bits selon le timer

Et que le mode CTC donne nativement un rapport cyclique 50/50 avec une fréquence qui peut aller de 0,12 Hz à 8MHz

graphe_freq_Tx.png

On voit que, pour obtenir 150 kHz, on peut utiliser N=1 ou N=8 mais qu’avec N= 1 la valeur de OCRxA sera voisine de 100 contre environ 10 avec N= 8 et donc le pas entre deux fréquences sera plus faible, donc meilleur, avec N= 1.

salut, et déjà un grand merci pour vos réponses... :slight_smile:

j'avais pensé au timer, quand j'ai commencé à investiguer, mais je n'avais pas retenu cette solution, par manque de connaissance. Donc, je peux poser ma question :confused: , est-ce que le timer reste permanent si le code exécute d'autres choses, comme la gestion de l'afficheur, des boutons sur des interruptions...?

Je partais sur la solution d'un oscillateur programmable externe, parce que une fois qu'il a ses instructions, la carte UNO peut continuer à gérer le reste.

Kanguru:
salut, et déjà un grand merci pour vos réponses... :slight_smile:

j'avais pensé au timer, quand j'ai commencé à investiguer, mais je n'avais pas retenu cette solution, par manque de connaissance. Donc, je peux poser ma question :confused: , est-ce que le timer reste permanent si le code exécute d'autres choses, comme la gestion de l'afficheur, des boutons sur des interruptions...?

Je partais sur la solution d'un oscillateur programmable externe, parce que une fois qu'il a ses instructions, la carte UNO peut continuer à gérer le reste.

en jouant avec les registres c'est faisable si tu n'exige pas une resolution au Hz prés
Si je ne me suis pas planté avec un MCU à 16 MHz la resolution de depart pour Fmax 150 KHz est d'~ 1.4 KHz (ça s'ameliore avec l'augmentation de la periode)
tu souhaite travailler sur quelle amplitude F (on connais Fmax , mais pas Fmin )

merci Artouste
je vais tenter comme ça pour voir à l'oscillo. J'espère que l'oscillation ne sera pas affectée pendant les autres opérations du contrôleur.

A+ et encore merci à vous.

Kanguru:
merci Artouste
je vais tenter comme ça pour voir à l'oscillo. J'espère que l'oscillation ne sera pas affectée pendant les autres opérations du contrôleur.

A+ et encore merci à vous.

ce n'est peut etre pas la solution la plus efficace , tu n'a pas repondu à la question
Fmin ?

J'espère que l'oscillation ne sera pas affectée pendant les autres opérations du contrôleur.

Les timers sont des morceaux d'électronique pure qui vivent leur propre vie à coté de la partie programme.
Le timer communique avec le programme par l'intermédiaire de registres.
Si tu le lui demande le timer peut interagir avec le programme par des interruptions, mais si tu ne lui demande rien il ne fera rien.
Dans la solution qu'on te propose il faudra dans le programme configurer des registres du timer et autoriser le timer à prendre le contrôle d'une pin spéciale pour la délivrance de la fréquence cherchée.
Une fois cette opération faite le timer mènera sa vie indépendamment du reste du micro.

68tjs:
Dans la solution qu'on te propose il faudra dans le programme configurer des registres du timer et autoriser le timer à prendre le contrôle d'une pin spéciale pour la délivrance de la fréquence cherchée.
Une fois cette opération faite le timer mènera sa vie indépendamment du reste du micro.

bonsoir 68tjs
d'ailleurs c'est quoi la meilleure methode (code minimal) pour faire cracher du 0/1 sur un pin arduino à la Fmax possible ?
soit prescaler à 1 (pas de prescaler) diviseur à 1 ?
j'ai regardé rapidement, mais j'ai l'impression que je talonne loin du MHz justement à cause de la gestion du pin de sortie.

ok, je vais tester de mettre en place un timer... quand le temps me sera accordé ici .
pour les fréquences, Artouste, je ne les ai pas encore, je ne connais pas la valeur de l'inducteur. Il me faut tout mettre en place, et voir tout ça en jouant sur la vitesse du timer.

merci encore et bonne soirée à tous. :slight_smile:

bonsoir 68tjs
d'ailleurs c'est quoi la meilleure methode (code minimal) pour faire cracher du 0/1 sur un pin arduino à la Fmax possible ?
soit prescaler à 1 (pas de prescaler) diviseur à 1 ?
j'ai regardé rapidement, mais j'ai l'impression que je talonne loin du MHz justement à cause de la gestion du pin de sortie.

Mode CTC
Préscaleur = 1 -> lance le timer
Prise de contôle directe de OCxA ou OCxB par le timer --> surtout pas digitalMachin oumême d'action sur les registres DDRx et PORTx

La formule est (pas inventée mais trouvé dans la datasheet)


En téléchargeant la PJ c'est plus lisible : pas trouvé comment on peut agrandir une image.
Donc OCRxA = 0 pour avoir Fsyst/2

68tjs:
Mode CTC
Préscaleur = 1 → lance le timer
Prise de contôle directe de OCxA ou OCxB par le timer → surtout pas digitalMachin oumême d’action sur les registres DDRx et PORTx

La formule est (pas inventée mais trouvé dans la datasheet)

mode_CTC.png
En téléchargeant la PJ c’est plus lisible : pas trouvé comment on peut agrandir une image.
Donc OCRxA = 0 pour avoir Fsyst/2

ok , ça j’avais vu/compris
mais en appli reelle (avec soft mini) je recupere comment les 0/1 alternant à fmax possible sur un pin en sortie ?
je suis loin du fsyst/2 (mais j’ai fait du survol)

pour dire les choses plus simplement , avec quel code mini je recupere à l’oscillo par exemple sur le pin 2 (ou tout autre) d’un uno(16MHz) mes creneaux à 8 MHz (voir meme à 4)

Re
Je ne suis pas encore revenu vers mon exil hivernal donc je n’ai pas toute ma doc.
Pour un exemple il faudra attendre (dans la mesure ou je retrouve dans mon…points… …de… .suspension)

par exemple sur le pin 2

Grosse erreur ! Tu ne peut pas choisir ta pin de sortie elle est imposé par le hardware.
A ce que j’ai vu les STM32 ont d’énormes possibilités de re-routage mais pas les avr.

Ce sont les sorties (Atmega328p):
OC0A OC0B OC1A OC1B OC2A OC2B
Atmel PD6 PD5 PB1 PB2 PB3 PD3
Arduino D6 D5 D9 D10 D11 D3

J’ai quand même avec moi une “œuvre inachevée” parmi de nombreuses autres (la date c’est la date d’impression du pdf, la dernière mise à jour date de largement plus d’un an) je la mets en PJ.
tu devrais trouver ton bonheur au paragraphe 6.

timers_compteurs.pdf (431 KB)

68tjs:
Re
Je ne suis pas encore revenu vers mon exil hivernal donc je n'ai pas toute ma doc.
Pour un exemple il faudra attendre (dans la mesure ou je retrouve dans mon...points.. ..de... .suspension)
Grosse erreur ! Tu ne peut pas choisir ta pin de sortie elle est imposé par le hardware.
A ce que j'ai vu les STM32 ont d'énormes possibilités de re-routage mais pas les avr.

Ce sont les sorties (Atmega328p):
OC0A OC0B OC1A OC1B OC2A OC2B
Atmel PD6 PD5 PB1 PB2 PB3 PD3
Arduino D6 D5 D9 D10 D11 D3

J'ai quand même avec moi une "œuvre inachevée" parmi de nombreuses autres (la date c'est la date d'impression du pdf, la dernière mise à jour date de largement plus d'un an) je la mets en PJ.
tu devrait trouver ton bonheur au paragraphe 6.

ok merci
je lirais/testerais demain
donc affecter un pin pwm capable

donc affecter un pin pwm capable

Oui et non

  1. Pourquoi mettre la PWM en avant ?
  2. Grossièrement les couples de pins affectées aux timers ont les mêmes possibilités.
    Finement j'ai des doutes : la partie A n'a pas exactement les mêmes fonctionnalités que la partie B et les sorties OCxB ne sont pas toujours disponibles selon les configurations avancées de la PWM. Donc je reste prudent.

68tjs:
Oui et non

  1. Pourquoi mettre la PWM en avant ?
  2. Grossièrement les couples de pins affectées aux timers ont les mêmes possibilités.
    Finement j'ai des doutes : la partie A n'a pas exactement les mêmes fonctionnalités que la partie B et les sorties OCxB ne sont pas toujours disponibles selon les configurations avancées de la PWM. Donc je reste prudent.

te casse pas la tête , en ce qui me concerne , c'est juste "pour jouer" :grin:
le challenge est simple :
code mini sous environnement arduino avec un uno pour voir sur un pin bien choisi de l'activité à F/2 (8MHz)
Apres ... ça se derive 8)

Quelle dérive ?
En fréquence ce sera la dérive du résonateur. Tient sur ebay on trouve actuellement des compatibles UNO avec un vrai quartz, un regul 3.3V en sot223 pour environ 3 à 4€.. On dirait que depuis la scission des arduinos les chinois ont pris de l'autonomie. Ils ne cherchent plus à copier jusqu'au logo, ils proposent maintenant les cartes sous leur nom et font preuve d'imagination.