Advertisement
TolentinoCotesta

Dimmer_Pot

Apr 26th, 2018
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.82 KB | None | 0 0
  1. // modo LINEARE: variazioni sempre uguali per ogni step (prova a valutare la differenza commentando uno dei due metodi)  
  2. /*
  3.   Con 50HZ di frequenza abbiamo che il periodo dura 20ms, quindi avrò un passaggio èper lo zero ogni 10mS -> 10000uS
  4.   Il ritardo per attivare il TRIAC dovrà quindi essere compreso tra 0 e 10000uS; 0uS passa tutta la sinusoide quindi max potenza al carico
  5.   Siccome ho deciso di avere la regolazione in 100 passi discreti e 10uS di delay ci saranno sempre per attivare il TRIAC
  6.   ho che ogni STEP deve corrispondere ad una variazione in uS di (10000uS -10uS) / 100 = 99.9 uS
  7. */
  8.  
  9. // modo PSEUDO-LOGARITMICO: variazioni diverse per ogni step secondo la curva simil CIE1931    
  10. /*
  11.   Secondo la curva CIE1931 la Luminosità (in inglese brightness: cioè la luce "percepita" nel range 0%-100% )
  12.   dipende dalla Luminanza (in inglese luminance: grandezza misurabile, cioè quella che andiamo ad impostare noi)
  13.   secondo le seguenti formule:
  14.  
  15.   Brightness = 116 * Luminance ^ (1/3) - 16         for luminance levels above 0.008856
  16.   Brightness = 902.3 * Luminance                    for luminance levels at or below 0.008856
  17.  
  18.   Nella formula la luminanza varia nel range 0-1 ed in tutti gli esempi che si trovano online
  19.   viene ricavata ed usata la formula inversa per determinare Luminance in funzione di Brightness
  20.   (solitamente gli esempi fanno riferimento al classico led di esempio da accendere con la tecnica PWM)
  21.  
  22.   Nel nostro caso invece, siccome di fatto dobbiamo impostare quanto tempo rimane spento il TRIAC,
  23.   se facciamo la stessa cosa avremmo un funzionamento con un andamento al contrario di come dovrebbe essere
  24.  
  25.   Questa variazione dovrebbe essere quindi simil-logaritmica
  26.  
  27.   Purtroppo, visti i limiti di risorse di Arduino usare formule con potenze, logaritimi etc etc non è il massimo.
  28.   E' più conveniente usare una tabella di lookup predefinita di valori calcolati in precedenza
  29.   (Io ad esempio ho usato uno script python per creare l'array)
  30.  
  31. */
  32.  
  33.  
  34. // Tabella generata con lo script python  https://pastebin.com/dHML7NMu
  35. // Per testarlo si può usare anche il tool online https://www.jdoodle.com/python-programming-online#
  36.  
  37. // CIE1931 correction table
  38. // Automatically generated
  39. const unsigned int cie_table[] = {
  40.     0,    256,  508,  755,  998,  1237, 1471, 1702, 1928, 2150,
  41.     2367, 2581, 2791, 2996, 3198, 3396, 3590, 3780, 3966, 4149,
  42.     4328, 4503, 4674, 4842, 5006, 5167, 5324, 5478, 5628, 5775,
  43.     5919, 6059, 6197, 6330, 6461, 6589, 6713, 6834, 6953, 7068,
  44.     7180, 7290, 7396, 7500, 7601, 7699, 7795, 7887, 7978, 8065,
  45.     8150, 8232, 8312, 8390, 8465, 8537, 8608, 8676, 8741, 8805,
  46.     8866, 8925, 8982, 9037, 9090, 9141, 9190, 9237, 9282, 9326,
  47.     9367, 9407, 9445, 9481, 9516, 9549, 9580, 9610, 9639, 9666,
  48.     9691, 9716, 9738, 9760, 9780, 9799, 9817, 9834, 9850, 9864,
  49.     9878, 9890, 9901, 9912, 9924, 9935, 9946, 9957, 9968, 9979,
  50.     9990
  51. };
  52.  
  53. const int AC_LOAD = 3;    // Output to Opto Triac pin
  54. const int ZERO_CROSS = 2;
  55.  
  56. #define STEP 99.9
  57. #define TRIAC_DELAY 10
  58. unsigned int dimtime = 0;
  59.  
  60. // Dimming level (0-100%)  0 = OFF, 100 = ON
  61. unsigned int dimlevel = 0;
  62. unsigned int dimlevel_old = 0;
  63.  
  64.  
  65. void setup(){  
  66.   Serial.begin(115200);
  67.   pinMode(AC_LOAD, OUTPUT);           // Set AC Load pin as output    
  68.   pinMode(ZERO_CROSS, INPUT_PULLUP);
  69.   attachInterrupt(digitalPinToInterrupt(ZERO_CROSS), zero_crosss_int, RISING);
  70. }
  71.  
  72. //the interrupt function must take no parameters and return nothing
  73. void zero_crosss_int(){        
  74.   delayMicroseconds(dimtime);     // Aspetta il tempo impostato prima di attivare il TRIAC
  75.   digitalWrite(AC_LOAD, HIGH);    // Attivazione TRIAC
  76.   delayMicroseconds(TRIAC_DELAY); // E' necessario mantenere per un po' alta l'uscita per far funzionare il TRIAC
  77.   digitalWrite(AC_LOAD, LOW);     // Resetta l'uscita
  78. }
  79.  
  80.  
  81. void loop()  {
  82.   /*
  83.   Impostiamo il livello di luminosità usando un potenziometro.  Il valore che leggo dall'analogica varia nel range 0-1023,
  84.   va quindi scalato nel range che abbiamo deciso di usare e pe farlo usiamo map()
  85.   Da notare che ho invertito il "verso" altrimenti il pot funzionerebbe al contrario.
  86.   */
  87.   dimlevel = map(analogRead(A0), 0, 1023, 99, 0);
  88.  
  89.    
  90.   // E' inutile fare le conversioni ad ogni ciclo di loop, facciamo solo se è cambiato il valore del potenziometro
  91.   if(dimlevel != dimlevel_old){
  92.     dimlevel_old = dimlevel;
  93.  
  94.     // Determiniamo il tempo da aspettare prima di accendere il TRIAC
  95.  
  96.     // modo PSEUDO-LOGARITMICO: variazioni diverse per ogni step secondo la curva simil CIE1931    
  97.     dimtime = cie_table[dimlevel];
  98.  
  99.     // modo LINEARE: variazioni sempre uguali per ogni step (prova a valutare la differenza commentando uno dei due metodi)  
  100.     //dimtime = STEP * dimlevel;          
  101.    
  102.     Serial.print(dimlevel);
  103.     Serial.print(": ");
  104.     Serial.println(dimtime);    
  105.   }
  106.  
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement