Go Down

Topic: Pwm fastpwm duty timer,mi serve chiarezza (Read 150 times) previous topic - next topic

zonalimitatore

Ciao a tutti.
C'è qualche buon anima che riesca a spiegarmi questo mondo del pwm?Ho letto varie documentazioni in inglese,ma più leggo e piu scopro nuovi termini incasinandomi di più.

Partiamo dal fatto che ho scritto un programma che comanda 2 ventole (da 12v) con 2 lm35 individualmente,mostrando su LCD le temp rilevate. In base alla temperatura comanda le ventole (e da qui il pwm).

Essendo un carico ho messo un MOSFET alimentato a 12v per le ventole.

In pratica dal programma non posso farle partire normalmente dando il digitalwrite.Per farle girare al "minimo",devo andare a modificare il timer relativo al pin (a 31000hz) e poi dando il digitalwrite 8 la ventola parte,ma non come vorrei.
Infatti dando 8 di pwm escono 7v, e se imposto il digitalwrite a 7 non gira e "ronza".

Vorrei capire bene come funziona il tutto,e cosa/come impostare i parametri del titolo.Perchè secondo me mi sto incasinando troppo ed esiste una soluzione più semplice ed efficace.

Alla fine vorrei fare funzionare queste ventole da 4v a 12v usando 1-255. E capire tutti i parametri sopra

Maurotec

Quote
In pratica dal programma non posso farle partire normalmente dando il digitalwrite.Per farle girare al "minimo",devo andare a modificare il timer relativo al pin (a 31000hz) e poi dando il digitalwrite 8 la ventola parte,ma non come vorrei.
Infatti dando 8 di pwm escono 7v, e se imposto il digitalwrite a 7 non gira e "ronza".
Non è chiaro, confondi anche me così.
31000Hz??

digitalWrite non serve per il PWM, si usa analogWrite(pwmValue).

Poi c'è da vedere se le ventole sono adatte a lavorare in PWM. Esistono le ventole con pin PWM con le quali non serve il mosfet ma il solo pin.

Ciao.

speedyant

Concordo, serve chiarezza.

Comunque non tutte le ventole, specie quelle non "native pwm" non gradiscono l'avviamento a bassa tensione.

zonalimitatore

#3
Jun 16, 2019, 11:48 am Last Edit: Jun 16, 2019, 12:05 pm by zonalimitatore
Si. Forse non 31000 ma 30000.
Eccolo:
TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz

Ho sbagliato,intendevo analogWrite su pin digitale

Le ventole sono delle Sunon e hanno il connettore a 3 ( + - e il segnale tachimetrico)

speedyant

Allora sono "classiche" ventole da pc. Non partono sotto i 7 volt, devi "accenderle" a 12, poi riescono a funzionare anche con meno.

Ma il codice? Lo sketch?

zonalimitatore

Queste funzionano anche a 5v (intendo si accendono anche a 5v)
Code: [Select]
#include <hd44780.h>
#include <hd44780ioClass/hd44780_pinIO.h>
const int rs=3, en=8, db4=4, db5=5, db6=6, db7=7;       //pin lcd
hd44780_pinIO lcd(rs, en, db4, db5, db6, db7);          //pin lcd
const int LCD_COLS = 16;                                //colonne lcd
const int LCD_ROWS = 2;                                 //righe lcd
const float aref = 1.08;                                // riferimento volts interni (fra gnd e aref)
int tempx = A0;                                         //sensore asse x
int tempy = A1;                                         //sensore asse y
float valuex;                                           // legge il valore di x dell' LM35
float valuey;                                           // legge il valore di y dell' LM35
float constant;                                         // usato per calcolare la costante ed avere un valore della temp
float tempX;                                            // variabile usata per salvare il valore in gradi celsius di x
float tempY;                                            // variabile usata per salvare il valore in gradi celsius di y

void setup() {
  TCCR2B = (TCCR2B & B11111000) | B00000001;    //frequenza pwm 31372.55 Hz PIN11
  TCCR1B = (TCCR1B & B11111000) | B00000001;    //frequenza pwm 31372.55 Hz PIN10
  pinMode (10, OUTPUT); //fanx
  pinMode (11, OUTPUT); //fany
  analogReference(INTERNAL); // set the internal reference
  //Serial.begin(9600);
}

void loop() {
  valuex = analogRead(tempx);
  constant = aref / 1024;
  constant = 1 / (constant * 100);  // constant is 9.309
  tempX = valuex / constant ; // in this way you calculate the temperature in Celsius
  valuey = analogRead(tempy);
  constant = aref / 1024;
  constant = 1 / (constant * 100);  // constant is 9.309
  tempY = valuey / constant - 10; // in this way you calculate the temperature in Celsius
  lcd.setCursor(0,1);
  lcd.print(tempX);
  lcd.setCursor(10,1);
  lcd.print(tempY);
  delay(1000);
  lcd.begin(LCD_COLS, LCD_ROWS);                     
  lcd.setCursor(0, 0);
  lcd.print("TempX:    TempY:");
  lcd.setCursor(5,1);
  lcd.print("C");
  lcd.setCursor(15,1);
  lcd.print("C");
  if (tempX <= 39)                                  // INIZIO REGOLE ASSE X
  {
    analogWrite(10, 0);
  }
    if (tempX > 40)
  {
    analogWrite(10, 8);
  }
  if (tempX > 38)
  {
    analogWrite(10, 9);
  }
  if (tempX > 42)
  {
    analogWrite(10, 10);
  }
  if (tempX > 43)
  {
    analogWrite(10, 11);
  }
   if (tempX > 44)
  {
    analogWrite(10, 12);
  }
   if (tempX > 45)
  {
    analogWrite(10, 13);
  }
   if (tempX > 46)
  {
    analogWrite(10, 14);
  }
   if (tempX > 48)
  {
    analogWrite(10, 15);
  }
   if (tempX > 49)
  {
    analogWrite(10, 16);
  }
   if (tempX > 50)
  {
    analogWrite(10, 17);
  }
   if (tempX > 51)
  {
    analogWrite(10, 18);
  }
   if (tempX > 52)
  {
    analogWrite(10, 19);
  }
   if (tempX > 53)
  {
    analogWrite(10, 20);
  }
   if (tempX > 54)
  {
    analogWrite(10, 21);
  }
   if (tempX > 55)
  {
    analogWrite(10, 22);
  }
   if (tempX > 56)
  {
    analogWrite(10, 23);
  }
     if (tempX > 57)
  {
    analogWrite(10, 24);
  }
     if (tempX > 58)
  {
    analogWrite(10, 25);
  }
     if (tempX > 59)
  {
    analogWrite(10, 26);
  }
     if (tempX > 60)
  {
    analogWrite(10, 30);
  }
     if (tempX > 61)
  {
    analogWrite(10, 40);
  }
     if (tempX > 62)
  {
    analogWrite(10, 50);
  }
     if (tempX > 63)
  {
    analogWrite(10, 60);
  }   if (tempX > 64)
  {
    analogWrite(10, 62);
  }
     if (tempX > 65)
  {
    analogWrite(10, 80);
  }
     if (tempX > 66)
  {
    analogWrite(10, 90);
  }
     if (tempX > 67)
  {
    analogWrite(10, 100);
  }
     if (tempX > 68)
  {
    analogWrite(10, 110);
  }
     if (tempX > 69)
  {
    analogWrite(10, 120);
  }
     if (tempX > 70)
  {
    analogWrite(10, 250);
  }
    if (tempY <= 39)                        //INIZIO REGOLE ASSE Y
  {
    analogWrite(11, 0);
  }
    if (tempY > 40)
  {
    analogWrite(11, 8);
  }
  if (tempY > 38)
  {
    analogWrite(11, 9);
  }
  if (tempY > 42)
  {
    analogWrite(11, 10);
  }
  if (tempY > 43)
  {
    analogWrite(11, 11);
  }
   if (tempY > 44)
  {
    analogWrite(11, 12);
  }
   if (tempY > 45)
  {
    analogWrite(11, 13);
  }
   if (tempY > 46)
  {
    analogWrite(11, 14);
  }
   if (tempY > 48)
  {
    analogWrite(11, 15);
  }
   if (tempY > 49)
  {
    analogWrite(11, 16);
  }
   if (tempY > 50)
  {
    analogWrite(11, 17);
  }
   if (tempY > 51)
  {
    analogWrite(11, 18);
  }
   if (tempY > 52)
  {
    analogWrite(11, 19);
  }
   if (tempY > 53)
  {
    analogWrite(11, 20);
  }
   if (tempY > 54)
  {
    analogWrite(11, 21);
  }
   if (tempY > 55)
  {
    analogWrite(11, 22);
  }
   if (tempY > 56)
  {
    analogWrite(11, 23);
  }
     if (tempY > 57)
  {
    analogWrite(11, 24);
  }
     if (tempY > 58)
  {
    analogWrite(11, 25);
  }
     if (tempY > 59)
  {
    analogWrite(11, 26);
  }
     if (tempY > 60)
  {
    analogWrite(11, 30);
  }
     if (tempY > 61)
  {
    analogWrite(11, 40);
  }
     if (tempY > 62)
  {
    analogWrite(11, 50);
  }
     if (tempY > 63)
  {
    analogWrite(11, 60);
  }   if (tempY > 64)
  {
    analogWrite(11, 62);
  }
     if (tempY > 65)
  {
    analogWrite(11, 80);
  }
     if (tempY > 66)
  {
    analogWrite(11, 90);
  }
     if (tempY > 67)
  {
    analogWrite(11, 100);
  }
     if (tempY > 68)
  {
    analogWrite(11, 110);
  }
     if (tempY > 69)
  {
    analogWrite(11, 120);
  }
     if (tempY > 70)
  {
    analogWrite(11, 250);
  }

zonalimitatore

Nessuno sa a grandi linee com'è il funzionamento del fastpwm(serve una librearia?),softpwm,duty cycle,divisori,risoluzione,phase control,invertente e non?

gpb01

La maggior parte delle informazioni le trovi studiando il datasheet del ATmega328P ... poi dai una letta anche alle note che ti allego ...

Guglielmo

Search is Your friend ... or I am Your enemy !

zonalimitatore


Go Up