Go Down

Topic: getting pwm from attiny85 (Read 28 times) previous topic - next topic

joerack

as the topic says, I've written this little program for my school project.
I'm as the code says, arduino should output 3 signals coming out from my A3 pwm output: 0, 123, 255
unfortunately, the code only works then the value is over 150, and the output is always 4.98V

it seems as pwm is outputting as a digital instead of analog
please help

Code: [Select]
#include <TinyLiquidCrystal_I2C.h>    //I2C adattato per attiny85, pilota il display
#include <TinyWireM.h>           // Wire adattato per attiny85

int pin_temp = A2; //Pin di collegamento del piedino Vout del sensore di temperatura
float temp = 0;     //Variabile in cui verrà memorizzata la temperatura rilevata
int tip120PIN = A3;    //Variabile assegnata al transistor
LiquidCrystal_I2C lcd(0x3F,16,2);    //Inizializzazione standard piattaforma I2C
int pinSensorPIR = 1;      //Assegnando le variabili
int pinLed = 5;    //Led lampeggiante per illuminare il garage
int valorSensorPIR = 0;     //Imposto un valore basso al sensore PIR

void setup()

{

  lcd.init();    //Impostazione del display LCD
  lcd.backlight();
  lcd.setCursor(0, 0);     //Sposto il cursore sulla prima riga (riga 0) e sulla prima colonna
  lcd.print("Temperatura:");    //Stampo il messaggio 'Temperatura:' sulla prima riga

  analogReference(INTERNAL);
 
  //Definisco i pin come input e output

  pinMode(pinSensorPIR,INPUT);
  pinMode(pinLed,OUTPUT);
  pinMode(pin_temp,INPUT);
  pinMode(tip120PIN,OUTPUT);
  delay(6000);
}
 
void loop() { 
//Calcolo temperatura
temp = 0;
for (int i = 0; i < 5; i++) { //Esegue l'istruzione successiva 5 volte
temp += (analogRead(pin_temp) / 9.31); //Calcola la temperatura e la somma alla variabile 'temp'
}
temp /= 5; //Calcola la media matematica dei valori di temperatura

if (temp <30) {
 analogWrite(tip120PIN,0);
 lcd.setCursor(1, 1);   
 lcd.print("Duty cycle  0% ");
}  else if ((temp >=29) && (temp <35))
{  analogWrite(tip120PIN,123);
  lcd.setCursor(1, 1);   
 lcd.print("Duty cycle 50% ");
} else {
  analogWrite(tip120PIN,250);
  lcd.setCursor(1, 1);   
 lcd.print("Duty cycle 100%");
}
 
/*Visualizzo la temperatura sul display LCD =============================================*/
lcd.setCursor(12, 0); //Sposto il cursore sulla prima colonna e sulla seconda riga
lcd.print(temp); //Stampo sul display LCD la temperatura
lcd.print(" C"); //Stampo uno spazio e il carattere 'C' sul display
/*===========================================*/
delay(1000); //Ritardo di un secondo (può essere modificato)
  //Leggo il valore del sensore PIR, che può assumere 1 o 2 valori
  //1 quando rileva movimento e 0 quando non c'è movimento.
  valorSensorPIR = digitalRead(pinSensorPIR);
   

   
  //Verificando l'occorrenza di movimento
  if (valorSensorPIR == 1) {
    accendi();
  } else {
    spegni();
  }   
}
 
void accendi() {
  digitalWrite(pinLed, HIGH);  //accendo il led
   
   
  delay(6000); //Tempo in cui il led rimane acceso
   
  spegni();
  delay(2000);
}
 
void spegni() {
  digitalWrite(pinLed, LOW); //Spengo il led
   
}

joerack

I think I've solved it... I had attached the transistor to a non pwm port

DrAzzy

That'd do it.

The ATTiny85 is capable of three PWM channels, on pins 0 (PB0), 1 (PB1) and 4 (PB4) - however, some ATTiny cores do not know how to configure timer1 (it's a bizzaro timer), and only offer PWM on pins 0 and 1. My core (link in sig) does support the third PWM channel, and takes full advantage of timer1 for tone().
ATtiny core for 841+1634+828 and x313/x4/x5/x61/x7/x8 series Board Manager:
http://drazzy.com/package_drazzy.com_index.json
ATtiny breakouts (some assembled), mosfets and awesome prototyping board in my store http://tindie.com/stores/DrAzzy

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy