Ciao a tutti sono Lello , e stavo mettendo in ordine in officina ed e comparso uno strumentino che serviva a far funzionare dei servomotori , in pratica un generatore PWM con frequenza variabile , ma mi ricorda anche un certo nervosismo per farlo andare ..... alimentatori potenziometri etc....
Avendo tra le mani una Arduino UNO , mi son messo a studiare ed ho messo giu un piccolo codice per simulare una PWM con duty e frequenza variabile .
Vi direte che cosa c e' di nuovo ?
Ce' di nuovo che non utilizzo i prescaler (perche non li so usare ) e chiedo venia e supporto .
int FREQ = A0;
int POTDUTY = A1;
int OUT = 11;
int FREQUENZA = 0;
int DUTYH = 0;
int DUTYL = 0;
int DUTY = 0;
void setup() {
// put your setup code here, to run once:
pinMode (OUT, OUTPUT);
}
void loop() {
//leggo i valori dei potenziometri FREQUENZA e DUTY :
// in realta leggono i valori del perido :
FREQUENZA = analogRead(FREQ);
DUTY = analogRead(POTDUTY);
//calcolo i valori dei ritardi da assegnare ai stati H e L :
DUTYH = FREQUENZA * (DUTY / 1023);
DUTYL = FREQUENZA * ((1023 - DUTY) / 1023);
digitalWrite (OUT ,HIGH);
delayMicroseconds (DUTYH);
digitalWrite (OUT ,LOW);
delayMicroseconds (DUTYL);
}
>lelo732000: come ti è già stato detto, ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post #1 (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie
Buona sera , non capisco se le operazioni matematiche che utilizzano i valori delle ( analogRead ) riportino un numero intero ((forzato - interpolato - arrotondato)) oppure ?
Perche' se fosse cosi , bisognerebbe mappare i valori di FREQUENZA e DUTY?
Poi a me servirebbe un range di controllo della frequenza di 30- 500 Hz , sarebbe opportuno usare la semplice delay al posto di delayMicroseconds ?
??
FREQUENZA = analogRead(FREQ); legge e ritorna un valore tra 0 e 1023... intero
DUTY = analogRead(POTDUTY); legge e ritorna un valore tra 0 e 1023... intero
DUTYH = FREQUENZA * (DUTY / 1023);
1023 = numero senza virgole quindi intero, DUTYH dichiarato int ... perciò il compilatore fa un calcolo tra interi.
Puoi forzare calcoli con le virgole se poni 1023.0, ma comunque DUTYH è un int.
DUTYH = FREQUENZA * (DUTY / 1023.0);
ed ovviamente , mettendo nel Delay il valore di DUTYH o DUTYL deve essere per forza intero .
mi domandavo quindi , se non uso le virgole , dopo il calcolo di DUTYH e L , mi restituisce un numero intero o cosa ?
intero, te l'ho scritto sopra. Al compilatore non frega nulla poi dove lo adoperi (nella delay)
Il calcolo tra interi è intero e inoltre metti il risultato in intero.
se DUTY é tra 0 e 1022
allora (DUTY / 1023) = 0
se DUTY é 1023
allora (DUTY / 1023) = 1
se DUTY é tra 1 e 1023
allora ((1023 - DUTY) / 1023) = 0
se DUTY é 0
allora ((1023 - DUTY) / 1023) = 1
DUTYH sará 0 o FREQUENZA (valore tra 0 e 1023)
DUTYL sará 0 o FREQUENZA (valore tra 0 e 1023)
con una percentuale variabile dei valori in funzione della posizione del potenziometro.
Grazie Uwe , mi hai salvato da una frustrante ((ma perche non funziona))
In realta' nella copia di bruttisima , del codice mettevo il map() delle due letture fino a 100 e poi mi ricavavo le porzioni di periodo con a percentuale ... forse andava meglio ?
Buona sera , mi chiedevo , se dichiarassi le variabili DUTYH DUTYL FREQUENZA e DUTY come float , corro il rischio che funzioni ? oppure non risolvo niente ?
lelo732000:
Buona sera , mi chiedevo , se dichiarassi le variabili DUTYH DUTYL FREQUENZA e DUTY come float , corro il rischio che funzioni ? oppure non risolvo niente ?
non risolvi niente, anzi ti crei problemi a causa della imprecisione dei float e perché delayMicroseconds() non accetta float
Grazie Doc . Ma la ricetrasmissione andrebbe bene solo per scopo ((verifica)) perché l attrezzo dovrebbe
essere privo di PC , magari tra una 90ina di post potrei metterci un LCD per verificare a frequenza ed il duty