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.
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
Post a Comment