Generateur de fréquences


bonjour,

voici un générateur de fréquence de 30hz à 8mhz qui se pilote par deux boutons poussoir et un potentiomètre de 1k il peut être piloté par la liaison série, et dispose d'un afficheur deux lignes.

en espérant que sa peut aider pour un projet.
code: [select]

#include <liquidcrystal.h>
int prescaler=0;
int presc=0;
int pcpresk;
int plus=0;
int moin=0;
int plusa=0;
int moina=0;
float frekpc=0;
unsigned long frek=0;
unsigned long freq=0;
unsigned long foc=0;
liquidcrystal lcd(12, 10, 5, 4, 3, 2);

void setup()
{
  serial.begin(9600);
  lcd.begin(16, 2);
  pinmode(11, output); //sortie fréquence
  pinmode(9, output);  //bouton poussoir
  pinmode(8, output); //bouton poussoir
 
  //configuration timer
  //mise à zéro des registres
  tccr2b = 0;
  tccr2a = 0;
 
  tccr2a = ( 1<<wgm21/*ctc mode*/ | 1<<com2a0 /*toggle mode*/  );
  tccr2b = (  1<<cs20   |  1<<cs22 |  1<<cs21 /* prescaler */);
  //valeur compter dans tcnt2

 
  //autorisation d'interruption
   assr &= ~(1 << as2);        // horloge interne timer/counter2
   serial.println("pour passer en mode commande pc");
   serial.println("définir une fréquence en hz et finir par un .");

}
 
/***génération de fréquence par potentiomètre***/

void loop()
{
  tccr2a = ( 1<<wgm21/*ctc mode*/ | 1<<com2a0 /*toggle mode*/  );
  int ocr2 = analogread(a0);  //lecture du potentiomètre
  ocr2=ocr2/4;                //résultat sur 1024 /4 pour 256
  ocr2a=ocr2;
 
  plus = digitalread(8);    //lecture du bouton poussoir

  if(plus !=plusa ){      //si changement d'état

    if(plus == high ){   
       
      prescaler++;        //sélection du prescaler suivant
    }

    plusa = plus;        //mise à zéro du changement d'état

  }

  if(prescaler > 6 ){        //maximum à ne pas dépasser
  prescaler = 6 ;
}

  moin = digitalread(9);    //lecture du bouton poussoir
 
  if(moin !=moina ){        //si changement d'état
     
      if(moin == high ){  //et si passage un
       
      prescaler--;          //sélection du prescaler précédant
     
       }
       
     moina = moin;      //mise à zéro du changement d'état
  }
 
 
if(prescaler < 0 ){        //minimum à ne pas dépasser
  prescaler = 0 ;
}

  switch (prescaler) //sélection du prescaler
  {
  case 0:
  tccr2b = (  1<<cs20   |  1<<cs22 |  1<<cs21 );
  presc = 1024;            //valeur du prescaler
  break;
 
  case 1:
  tccr2b = (   1<<cs22 |  1<<cs21 );
  presc = 256;            //valeur du prescaler
  break;
 
  case 2:
  tccr2b = (  1<<cs20   |  1<<cs22  );
  presc = 128;              //valeur du prescaler
  break;
 
  case 3:
  tccr2b = ( 1<<cs22  );
  presc = 64;              //valeur du prescaler
  break;
 
  case 4:
  tccr2b = (  1<<cs20   |  1<<cs21  );
  presc = 32;              //valeur du prescaler
  break;
 
  case 5:
  tccr2b = (  1<<cs21  );
  presc = 8;              //valeur du prescaler
  break;
 
  case 6:
  tccr2b = (  1<<cs20  );
  presc = 1;          //valeur du prescaler
  break;
   
  }
/***foc= fcryst/(2*prescaler*(1+ocr)***/
  ocr2=ocr2+1;      //préparation au calcul de fréquence ci dessus

  foc=long(ocr2)*long(presc)*2;    //changement de type de variable et multiplication

  freq=16000000/foc;      //division de la fréquence du cristal

  aff();             //affichage sur l'écran lcd

  delay(2);                        //petit délai pour la mesure analogique par sécurité
   
   if (serial.available() > 0) {
     pcc(); 
  }
}
 
/***affichage lcd***/

void aff(){
  lcd.print("frequence");
  lcd.setcursor(0, 1);
  lcd.print(freq);
  lcd.print("hz            ");
}

code: [select]
/***sélection de fréquence par liaison série***/
void pcc(){
  int fin= 0;
  int j =8;
  int calc = 0;
  int tab;
  int tab;
  int x;
  int selection = 0;
  int bp2=0;
  unsigned long u=1;
  do{
  frek = 0;     
  serial.println("définir une fréquence et finir par un .");
  byte tableau[11] = {};        //tableau ou je vais mettre les valeurs
     
do
     {        //remplissage du tableau
                 
             if (serial.available() > 0) { //si des données entrantes sont présentes

               tableau[j]= serial.read();  //remplissage du tableau
               calc++;                      //incrémentation du nombre de case utilisées
                                     
                       if (tableau[j]== '.') {                //sortie si on reçois le point
                                             j=0;
                                             }
                                           
                                           j--;
                                           }
                 
              }while(j>0);
             
              do{                                 
             
              tab=calc-1;      //ordre de passage
              tab = tab-1;      //nombre de passage
             
              while(tab>0) {
                            u=u*10;          //mise à niveau des centaines dizaines unités
                            tab--;
                            }
             
           
                 j=8;          //on commence à l'emplacement 7 du tableau ou se trouve la première donnée (et non pas 0)
                              //création de la valeur
                             
              do                {

                                frek = frek+(tableau[j]-48)*u;  //calcul de la fréquence, le -48 car il garde la désignation ascii
                                u=u/10;                          //toujours les centaines dizaines unités
                                j--;
                                tab--;
                                }while(tab>0);
                 serial.println(frek);
             
              }while(fin>0);   
             
          //configuration timer
            //mise à zéros des registres
            tccr2b = 0;
            tccr2a = 0;
           
           
            if(frek > 0 && frek <= 400){
              selection=1;
            }
            else if (frek > 400 && frek <= 1500){
              selection=2;
            }
            else if (frek > 1500 && frek <= 3000){
              selection=3;
            }
            else if (frek > 3000 && frek <= 6000){
              selection=4;
            }
            else if (frek > 6000 && frek <= 13000){
              selection=5;
            }
            else if (frek > 13000 && frek <= 50000){
              selection=6;
            }
            else if (frek > 50000 && frek <= 8000000){
              selection=7;
            }
switch (selection) { //foc= fcryst/(2*prescaler*(1+ocr)     calcul appliquer
                //1+0cr = fcryst/(foc*presc)
                //ocr+1
                //ocr-1=(foc*presc*2)/fcryst

              case (1):
              //première plage de sélection
                                  tccr2b = ( 1<<cs22 | 1<<cs21 | 1<<cs20 /* prescaler  111 1024*/);
                                  pcpresk=1024;
                                  pccpr();
                                  break;

              case (2):         
                                 
                                 tccr2b = ( 1<<cs22 | 1<<cs21 /* prescaler  110 256*/);
                                 pcpresk=256;
                                 pccpr();
                                  break;
              case (3):         
                                 
                                 tccr2b = ( 1<<cs22 | 1<<cs20 /* prescaler  101 128*/);
                                 pcpresk=128;
                                 pccpr();
                                  break;
              case (4):         
                                 
                                 tccr2b = ( 1<<cs22  /* prescaler  100 64*/);
                                 pcpresk=64;
                                 pccpr();
                                  break;
              case (5):         
                                 
                                 tccr2b = ( 1<<cs21 | 1<<cs20 /* prescaler  011 32*/);
                                 pcpresk=32;
                                 pccpr();
                                  break;   
              case (6):         
                                 
                                 tccr2b = ( 1<<cs21 /* prescaler  010 8*/);
                                 pcpresk=8;
                                 pccpr();
                                  break;
              case (7):         
                                 
                                 tccr2b = ( 1<<cs20 /* prescaler  001 1*/);
                                 pcpresk=1;
                                 pccpr();
                                  break;                           
            }
           
serial.println("pour sortir du mode commande pc");           
serial.println("envoyer un . en appuyant sur les 2"); 
serial.println("bouton poussoir ou"); 
plus = digitalread(8);    //lecture du bouton poussoir
moin = digitalread(9);    //lecture du bouton poussoir

    if(plus == high && moin == high ){    //si les deux sont haut retour au mode manuel
     bp2 = 1;
    }   
  }while(bp2 != 1);
 
}
 

/***calcul de l'ocr***/       

/***********calcul de l'ocr*************/       

void pccpr(){
  int ocr2;
  tccr2a = ( 1<<wgm21/*ctc mode*/ | 1<<com2a0 /*toggle mode*/  );
  frekpc = (frek*pcpresk*2);
  frekpc = 16000000/frekpc;                               
  frekpc = --frekpc;
  ocr2a=frekpc;                              //calcul de l'ocr
 
  ocr2=ocr2a;
  ocr2=ocr2+1;                              //préparation au calcul de frequence
  foc=long(ocr2)*long(pcpresk)*2;    //changement de type de variable et multiplication
  freq=16000000/foc; 
  aff();                                           //afichage sur l'ecran lcd
 
  pcc();                         //retour à  la detection
 
}


avec un petit schéma


Arduino Forum > International > Français > Réalisations et Projets Finis (Moderators: jfs, Snootlab) > Generateur de fréquences


arduino

Comments

Popular posts from this blog

Thread: PKI Client 5.00 install (for eToken Pro)

ATmega2560-Arduino Pin Mapping

listen to event