Non so se son matto ........ AIUTO

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);
}

PWM.ino (624 Bytes)

ciao...ti consiglio di modificare i tuoi post inserendo il codice nei tag code...pulsante </> sopra le faccine

Grazie , stavo per andare al manicomio :o

>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 :slight_smile:

Guglielmo

Per cosa serve variare la frequenza da teorici ca 1MHz a ca 1kHz

DUTYH = FREQUENZA * (DUTY / 1023);
DUTYL = FREQUENZA * ((1023 - DUTY) / 1023);

DUTYH sará quasi sempre 0 e DUTYL pure. Solo quando DUTY = 1023 o =0 é diverso.

Ciao Uwe

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.

quindi dovrebbe funzionare , domani provo

grazie un milione

lelo732000:
quindi dovrebbe funzionare , domani provo

grazie un milione

Fai un po i conti.

DUTYH = FREQUENZA * (DUTY / 1023);
DUTYL = FREQUENZA * ((1023 - DUTY) / 1023);

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.

Ciao Uwe

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

Ciao Uwe

Ma allora non c è soluzione ???

Nemmeno tenendo dutyh e dutyl interi ?

Non me la date una mano .... o almeno un neurone ?

Grazie UWE

E se invece dichiarassi una variabile x e ricavo la lettura del duty in percentuale in questo modo

X=((DUTY*100)/1023) dovrei avere una percentuale di DUTY giusto ? ed ovviamente DUTY deve avere un valore di minimo 11 e mi sta bene !

ora otterrei valori della variabile X compresi tra min 1.07 e 100

Quindi per il calcolo in interi da 1 a 100 , giusto ?

e poi per avere i delay potrei formulare ???

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

Di certo :confused:

Volevo dirti che FREQUENZA era solo per non confondermi le idee , è chiaro che si tratta di periodi quindi di tempo

secondo me da mappare tra 250 e 30.000 microsecondi

Scusami non avevo svolto la tendina del codice

era il mio timido intento ....

provo a scrivere qualcosa di piu sensato