Attiny84 pwm un aiuto

Ciao a tutti e grazie fin da ora per l'aiuto, sto tentando ma purtroppo con poco risultato di fare un'accensione di due led in pwm con un attiny84, questo è il circuito vi allego anche lo sketch che ho fatto, ma non mi capisco con i piedini da dichiarare
Mi aiutate per favore, grazie

#define INGRESSO_DIGITALE_1 6
#define INGRESSO_DIGITALE_2 0
#define USCITA_PWM          10
#define USCITA_DIGITALE_1   8

int  stato_digitale = 0;
int  stato_PWM      = 0;
bool bWait          = false;

void setup()
{
  pinMode(INGRESSO_DIGITALE_1, INPUT);
  pinMode(USCITA_DIGITALE_1, OUTPUT);
  pinMode(INGRESSO_DIGITALE_2, INPUT);
  pinMode(USCITA_PWM, OUTPUT);
}

void loop()
{
  if (digitalRead(INGRESSO_DIGITALE_1) == HIGH)
  {
  switch (stato_digitale)
    {
      case 0:
        digitalWrite(USCITA_DIGITALE_1, HIGH);  // ON
        break;
      case 1:
        digitalWrite(USCITA_DIGITALE_1, LOW); // OFF
        break;
    }
    stato_digitale = (stato_digitale + 1) % 2;
  bWait = true;
  }

  if (digitalRead(INGRESSO_DIGITALE_2) == HIGH)
  {
    switch (stato_PWM)
    {
      case 0:
        analogWrite(USCITA_PWM, 255);  // 100%
        break;
      case 1:
        analogWrite(USCITA_PWM, 128);  // 50%
        break;
      case 2:
        analogWrite(USCITA_PWM, 0);    // 0%
        break;
    }
    stato_PWM = (stato_PWM + 1) % 3;
  bWait = true;
  }
  
  if ( bWait )
  {
      delay(500);  // Ritardo per evitare letture multiple di uno dei due pulsanti
    bWait = false;
  }
}

Solo alcuni pin possono essere usati per il PWM:

Avevo già letto ma avevo capito poco, se puoi essere più dettagliato e farmi capire se ci sono errori, provo correggere la breadboard dove ho il progetto, grazie

Magari questo ti può chiarire le idee:

... i pin con capacità di PWM sono quelli indicati con il segno ~ vicino al pin

Guglielmo

Grazie Guglielmo ma anche quello lo avevo già visto, infatti se guardi il circuito ho collegato il mosfet che mi serve in pwm al pin7 penso che vada bene, ma lo sketch che ho non va

Ma nello sketch viene indicato il 10, no?:

#define USCITA_PWM          10

Ciao a tutti spero nel vostro prezioso aiuto, ho fatto un passo in avanti sul mio progetto ma mi sono impiantato, non mi capisco, sono arrivato al punto che il pulsante che fa on/off funziona e anche il suo led, il pulsante che invece dovrebbe darmi una tensione variabile (in PVM) ogni pressione, se mi misuro con il tester mi da le tensioni impostate ogni pressioni, ma se aggiungo un carico non ho potenza, cosa sbaglio o cosa bisogna aggiungere, sarei grato di un aiuto reale, grazie

#include <Bounce2.h>
#define led1 7     //7 pin fisico 6 PWMB
#define led2 8     //8 pin fisico 5 PWMA
#define button1 9  //9 pin fisico 3
#define button2 10 //10 pin fisico 2
#define buzzer 5    //5 pin fisico 8 PWM1B
#define ADC A2     //A2 pin fisico 11

//const int led1 = 7;
//const int button1 = 9;
int led1_state = 0;
bool changed_led_state = false;
//const int led2 = 8;
//const int button2 = 10;
int led2_state = LOW;

float highVoltage = 12.40;    // Per impostare la tensione piu alta (dovrebbe essere 12.5)
float lowVoltage = 10.80;     // Per impostare la tensione piu basse (dovrebbe essere 11)
float maxVoltage = 14.45;     // Per impostare la tensione in entrata dalla batteria

Bounce debouncer2;
Bounce debouncer1;

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(button1, INPUT_PULLUP);
  debouncer1.attach(button1);
  debouncer1.interval(5);
  pinMode(led2, OUTPUT);
  pinMode(button2, INPUT_PULLUP);
  debouncer2.attach(button2);
  debouncer2.interval(10);
  pinMode(buzzer, OUTPUT);
  digitalWrite(buzzer, LOW);
}

void loop() {
  debouncer1.update();
  if (debouncer1.fell()){
    changed_led_state = true;
    if(led1_state == 0){led1_state = 1;}
    else if(led1_state == 1){led1_state = 2;}
    else{led1_state = 0;}
  }

  if(led1_state == 0){
    if(changed_led_state){
      changed_led_state = false;
    }
    analogWrite(led1, 0);  
  }else if(led1_state == 1){
    if(changed_led_state){
      digitalWrite(buzzer, HIGH);
      delay(1300);
      digitalWrite(buzzer, LOW);
      changed_led_state = false;
    }    
    analogWrite(led1, round(highVoltage*255/maxVoltage));
  }else{
    if(changed_led_state){
      digitalWrite(buzzer, HIGH);
      delay(1300);
      digitalWrite(buzzer, LOW);
      delay(800);
      digitalWrite(buzzer, HIGH);
      delay(1300);
      digitalWrite(buzzer, LOW);
      changed_led_state = false;
    } 
    analogWrite(led1, round(lowVoltage*255/maxVoltage));
  }


  debouncer2.update();
  if (debouncer2.fell())
    led2_state = !led2_state;

  digitalWrite(led2, led2_state);
}

Un carico?... Che carico? Le uscite del microcontrollore possono fornire poche decine di milliampere e la tensione non rimane costante, come si vede nel datasheet: alimentato a 5V, la tensione d'uscita scende a 4,5V con 20mA di assorbimento.

sulle uscite ho montato dei mosfet

Nessuno sa o ha voglia di dare una mano, grazie

... mmm ... mi sa che dovresti mette lo schema dei collegamenti ed indicare bene i carichi :roll_eyes:

Guglielmo

circuito.pdf (34.6 KB)
Il carico massimo sul mosfet che va in pwm è di 140w, devo regolare un indumento riscaldante

Non credo sia influente, comunque R1 ed R2 le ho sempre viste da 100 kΩ e ...
non so, ma quei MOSFET non mi sembrando tanto adatti per essere pilotati a 5V ... da datasheet, il valore di RDS(on) è si di 0.028Ω, ma con una V GS di 10V che, con ATtiny non avrai mai.

Prova a cercare dei MOSFET che vengono proprio classificati "logic level", che sono fatti per essere pilotati con livelli di tensione pari ai livelli logici delle MCU ...

Guglielmo

IRFZ44?
Ti serve un driver per i mosfet. Anche nel caso in cui usassi IRLZ44.

Ho trovato gli FDP6030BL/FDB6030BL ... hanno una R DS(on) di 0.024Ω con una VGS di 4.5V e sono espressamente dichiarati "logic level" e le curve di fig. 3, pag. 3, danno correnti di tutto riguardo con VGS dai 3V ai 4.5V ... :roll_eyes:

Guglielmo

Ho cercato il mosfet che mi hai consigliato, ma faccio fatica a trovarlo e mi da anche obsoleto in certi siti, hai anche qualche altro, grazie

Chiediamo aiuto al "mago" di queste cose ... @Etemenanki ... leggendo la discussione, che MOSFET logic-levl consigli?

Intanto, @lidas ... quale è realmente la corrente massima, in A, che devi regolare? Perché io ho cercato cose che arrivano anche a 40A, ma con correnti inferiori la scelta è più ampia.

Guglielmo

Io nello stroboscopio ho usato un IRLZ44N dei 10 che acquistai da Aliexpress nel 2021 e commuta bene i 48V sul LED con 3A attraverso 3,9 Ohm:
https://it.aliexpress.com/item/4000222189172.html

Dal datasheet:
25mOhm con Vgs=5V, Id=25A
35mOhm con Vgs=4V, Id=21A

Ma hai visto di cosa parla lui ?

... SE lavora a 12V abbiamo in ballo circa 12A ... aspettiamo la risposta dell'OP sulle correnti massime prima di suggerire MOSFET :roll_eyes:

Guglielmo

Giusto dovrebbe avere in uscita due selezioni di voltaggio 12v e 11v per poter pilotare sempre max 140w (dovrei a avere la possibilità di scaldare più o meno un indumento termico, per farvi capire, che se lo metto completo assorbe 140w se solo una parte assorbe meno)