salve a tutti, ho la necessità di regolare la velocità di rotazione di una ventola Alpine arctic 11 plus dotata di 4 pin (nero-rosso-giallo-blu). Ho provato ad usare il banale analogWrite(pin,valore), ma non c'è nessuna variazione della rotazione. Ho provato anche un codice che mi consentisse di regolare la frequenza del pwm, facendo dei tentativi da 21 a 30 khz come frequenza:
byte const OC1A_PIN = 9 ;
byte const OC1B_PIN = 10 ;
parola const PWM_FREQ_HZ = 20000 ; // Regola questo valore per regolare la frequenza
const parola TCNT1_TOP = 16000000 / ( 2 * PWM_FREQ_HZ );
void setup () {
pinMode ( OC1A_PIN , OUTPUT );
// Cancella i registri di controllo e conteggio Timer1
TCCR1A = 0 ;
TCCR1B = 0 ;
TCNT1 = 0 ;
// Imposta la configurazione del Timer1
// COM1A (1: 0) = 0b10 (Uscita A in aumento / set in diminuzione)
// COM1B (1: 0) = 0b00 (funzionamento normale uscita B)
// WGM (13:10) = 0b1010 (PWM corretto di fase)
// ICNC1 = 0b0 (cancellazione del rumore di cattura dell'ingresso disabilitato)
// ICES1 = 0b0 (Selezione del fronte di cattura dell'ingresso disabilitata)
// CS (12:10) = 0b001 (Input clock select = clock / 1)
TCCR1A | = ( 1 << COM1A1 ) | ( 1 << WGM11 );
TCCR1B | = ( 1 << WGM13 ) | ( 1 << CS10 );
ICR1 = TCNT1_TOP ;
}
void loop () {
setPwmDuty ( 0 );
ritardo ( 5000 );
setPwmDuty ( 25 ); // Modifica questo valore 0-100 per regolare il ciclo di lavoro
ritardo ( 5000 );
// setPwmDuty (50);
// ritardo (20000);
// setPwmDuty (75);
// ritardo (20000);
// setPwmDuty (100);
// ritardo (20000);
}
void setPwmDuty ( byte duty ) {
OCR1A = ( word ) ( duty * TCNT1_TOP ) / 100 ;
}
Ho collegato anche le masse assieme, ma non sono riuscito a far variare i giri. Ho provato a diverse tensioni pensando che magari il funzionamento sia differente in base alla tensione.Nulla... qualcuno mi aiuterebbe a venirne a capo??