RuiViana

HC595_ESP32_PWM.ino

Sep 9th, 2020 (edited)
1,167
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //  GPIO_OUT_W1TS_REG Set
  2. //  GPIO_OUT_W1TC_REG Clear
  3. // Port   31     30     29     28         27     26     25     24
  4. //      GPIO31 GPIO30 GPIO29 GPIO28     GPIO27 GPIO26 GPIO25 GPIO24
  5. // Port   23     22     21     20         19     18     17     16
  6. //      GPIO23 GPIO22 GPIO21 GPIO20     GPIO19 GPIO18 GPIO17 GPIO16
  7. // Port   15     14     13     12         11     10      9     8
  8. //      GPIO15 GPIO14 GPIO13 GPIO12     GPIO11 GPIO10 GPIO9  GPIO8
  9. // Port    7     6      5       4         3       2      1      0
  10. //      GPIO7  GPIO6  GPIO5  GPIO4      GPIO3   GPIO2  GPIO1 GPIO0
  11.  
  12. //  SER   DATA  DS     14  Lilas      12
  13. //  SRCLK SHIFT SH_CP  11  Marrom     13
  14. //  RCLK  LATCH ST_CP  12  Azul       14
  15.  
  16. #define leds                              // Define se usa 1 led ou todos leds em cascata (led ou leds)
  17. int ledNum = 4;                           // se for 1 led, acende este
  18.  
  19. #define SER   12                          // DS data port
  20. #define SRCLK 13                          // SH_CP clock
  21. #define RCLK  14                          // ST_CP latch
  22. #define SER_bit   BIT12                   // DS bit usado no ESP32
  23. #define SRCLK_bit BIT13                   // SH_CP bit usado no ESP32
  24. #define RCLK_bit  BIT14                   // ST_CP usado no ESP32
  25.  
  26. int totalLeds = 24;                       // Total de leds na cascata
  27. float resolucao = 4096;                   // Resolução do PWM
  28. float porcento = 99.90;                   // % de duty
  29. //float duty = resolucao * porcento / 100;  // Calculo duty
  30. float duty = resolucao * (100-porcento) / 100;    // Calculo duty
  31. int maximo = resolucao;                   // Maxima resolucao de PWM
  32. //--------------------------------------------------
  33. void setup()
  34. {
  35.   Serial.begin(115200);                   // Inicializacao Serial
  36.   pinMode(SER,   OUTPUT);                 // DS data port como saida
  37.   pinMode(SRCLK, OUTPUT);                 // SH_CP clock port como saida
  38.   pinMode(RCLK,  OUTPUT);                 // ST_CP latch port como saida
  39.   digitalWrite(SER, LOW);                 // DS data port em LOW
  40.   digitalWrite(SRCLK, LOW);               // SH_CP clock port em LOW
  41.   digitalWrite(RCLK, LOW);                // ST_CP latch port em LOW
  42.   apaga();                                // Apaga todos leds
  43. }
  44. //--------------------------------------------------
  45. void apaga()                                    // Rotina para apagar todos leds
  46. {
  47.   for (int i = 0; i < totalLeds; i++)           // Apaga led de 0 a xx
  48.   {
  49.     REG_WRITE(GPIO_OUT_W1TC_REG, SER_bit);      // Serial data em LOW
  50.     REG_WRITE(GPIO_OUT_W1TS_REG, SRCLK_bit);    // Shift clock em HIGH
  51.     REG_WRITE(GPIO_OUT_W1TS_REG, RCLK_bit);     // Latch clock em HIGH
  52.   }
  53. }
  54. //--------------------------------------------------
  55. void loop()
  56. {
  57.   REG_WRITE(GPIO_OUT_W1TS_REG, SER_bit);        // Set data HIGH
  58.   for (int i = 0; i < totalLeds; i++)           // Scan led de 0 a xx
  59.   {
  60.     REG_WRITE(GPIO_OUT_W1TS_REG, SRCLK_bit);    // Set Shift HIGH
  61.     if (i == ledNum)                            // Se for o LED especifico
  62.     {
  63.       if (resolucao >= duty)                    // Se chegou o momento de acender o led
  64.       {
  65.         REG_WRITE(GPIO_OUT_W1TS_REG, RCLK_bit); // Pulsa Latch bit
  66.         REG_WRITE(GPIO_OUT_W1TC_REG, RCLK_bit);
  67.       }
  68.     }
  69.     REG_WRITE(GPIO_OUT_W1TC_REG, SRCLK_bit);    // Set Shift LOW
  70.     REG_WRITE(GPIO_OUT_W1TC_REG, SER_bit);      // Set data LOW
  71.   }
  72.   resolucao++;                                  // Incrementa resolucao
  73.   if (resolucao >= maximo)                      // Se passou o maximo de resolucao
  74.   {
  75.     resolucao = 0;                              // Retorna pra zero
  76.  
  77. #ifdef leds
  78.     ledNum++;                                   // Incrementa led para acender
  79.     if (ledNum >= totalLeds)                    // Se atingiu ultimo led
  80.       ledNum = 0;                               // Reinicia resolucao de led
  81. #endif
  82.  
  83.   }
  84.   if (resolucao < duty)                         // Se ainda nao e o momento de acender o led
  85.   { //                                          // Apaga tudo
  86.     REG_WRITE(GPIO_OUT_W1TC_REG, SER_bit);      // Serial data em LOW
  87.     REG_WRITE(GPIO_OUT_W1TS_REG, SRCLK_bit);    // Shift clock em HIGH
  88.     REG_WRITE(GPIO_OUT_W1TS_REG, RCLK_bit);     // Latch clock em HIGH
  89.   }
  90. }
RAW Paste Data