----EDIT---- Vedere --> Pag.3 Post #22
Buongiorno a tutti,
sono Stefano, piacere.
le mie conoscenze di arduino sono per lo più didattiche e non avendo mai affrontato il problema dei Timer sono di fronte a un problema con la costruzione di un sistema di simulazione di una ruota fonica e due sensori.
lo scopo del progetto è questo:
- tramite il nostro Arduino simulare un Motore che possa variare la sua velocità dalla frequenza di 1 Hz a 4 kHz. per la lettura della velocità del motore si utilizza (nella pratica) una ruota fonica e dei sensori(vedi foto allegata) il tutto poi dovrà essere mostrato in un display LCD 20x4 dove tramite un menù si potranno variare anche alcuni parametri come n° denti, diametro ruota.
- le variabili in gioco sono quindi:
- frequenza (1 Hz - 4 kHz)
- n° denti
- diametro ruota
- numero sensori (tengo fisso a due)
- duty-cycle (l'ideale è compreso tra il 60% e l'80%)
- sfasamento tra i sensori
fin'ora ho scritto questo codice:
#include <PWM.h>
int out_1 = 3; // il pin frequenza 1
int out_2 = 9; // il pin frequenza 2
int in_1=2; // il pin per passare tra la regolazione fine e i 4 kHz
int k=100; // numero di passi
float period; // periodo in microsecondi
float passo=0; // valore in microsecondi per il passo
int cnt_1=0; // contatore per la prima forma d'onda
int cnt_2=0; // contatore per la seconda forma d'onda
int dtyValue; // valore del dutycycle in percentuale
int frqLowValue, frqLowValue_new; // valore frequenza da potenziometro
int dly, dly_new; // valore di sfasamento tra i due segnali
int aggCount = 0; // contatore per rallentare il ricalcolaParametri
int frequency, frequency2; // le due frequenze dei segnali a 4 kHz
void setup()
{
InitTimersSafe(); //inizializza il valore dei timer
pinMode(2,INPUT); // imposta il PIN 2 come ingresso
pinMode(3,OUTPUT); // imposta il PIN 3 come uscita
pinMode(9, OUTPUT); // imposta il PIN 9 come uscita
dly = map(analogRead(A3),0,1023,0,99)*k/100; // valore dello sfasamento tra i due segnali
frqLowValue= map(analogRead(A2),0,1023, 4000, 1); // valore della frequenza bassa
cnt_2=100-dly*k/100; // imposta il contatore 2 allo stato
}
void ricalcolaParam()
{
dtyValue= (map(analogRead(A1), 0, 1023, 1, 99))*k/100; //valore duty-cycle
frqLowValue_new= map(analogRead(A2),0,1023, 4000, 1); //valore della frequenza bassa
dly_new = map(analogRead(A3),0,1023,0,99)*k/100; //valore del delay di sfasamento
if (dly_new!=dly)
{
dly=dly_new;
cnt_1=0;
cnt_2=100-dly;
digitalWrite(out_2, LOW);
}
if (frqLowValue_new!= frqLowValue)
{
frqLowValue=frqLowValue_new;
period= (float)(1000000/frqLowValue); //periodo in microsecondi
passo= (float)period/k; //passo in microsecondi
}
}
void loop()
{
if(digitalRead(in_1)==HIGH)
{
frequency = SetPinFrequencySafe(out_1, 4000); // frequenza 1 impostata a 4 kHz
pwmWrite(out_1 , 240); // imposto il dutycycle all'95 % circa
frequency2 = SetPinFrequencySafe(out_2, 4000); // frequenza 2 impostata a 4 kHz
pwmWrite(out_2 , 240); // imposto il dutycycle all'95 % circa
}
else
{
if(cnt_1==0)
{
aggCount++; //aggCount: contatore per rallentare l'acquisizione dei parametri
}
if (aggCount == 50) //ogni periodi ricalcola il parametro
{
ricalcolaParam();
aggCount = 0;
}
if (cnt_1<dtyValue)
{
digitalWrite(out_1, HIGH);
}
if (cnt_1>=dtyValue)
{
digitalWrite(out_1,LOW);
}
if (cnt_2<dtyValue)
{
digitalWrite(out_2,HIGH);
}
if (cnt_2>=dtyValue )
{
digitalWrite(out_2, LOW);
}
cnt_1=(cnt_1+1)%k;
cnt_2=(cnt_2+1)%k;
delayMicroseconds(passo);
}
}
Con questo codice sono riuscito a creare questa situazione:
- variazione da circa 1 Hz a 200 Hz tramite regolazione Fine con variazione del dutycycle e dello sfasamento tra le due onde quadre.
- tramite uno Ingresso abilito la regolazione fine oppure la frequenza fissa di 4 kHz.
ora io vorrei invece riuscire a sfasare i due segnali ad alta frequenza e poter variare cosicchè da poter variare il duty dal 60 all'80%(ora fisso al 95%). inoltre inserire la dipendenza dal diametro della ruota e numero di denti.
tramite la funzione SetPinFrequencySafe ho visto che posso impostare una frequenza e questa farla variabile però se le vado a variare durante il Loop i due segnali si sfasano in modo variabile e mai fisso.
tramite invece pwmWrite si varia il duty (che accetta valori da 0 a 255 )
ho provato a leggere e capire il funzionamento dei Timer per farlo tutto tramite i prescaler ecc ecc..ma da quel poco che ho capito è che se utilizzo uno timer esempio Timer1 le due forme d'onda sono in quadratura di fase. io ora vedo con l'oscilloscopio che a 4 kHz le due onde sono sfasate di 19 microsecondi.
Come vedete ci sono molte idee ma confuse.
qualcuno riesce a darmi una manina?
grazie