Skip to content

Commit

Permalink
Add new library and example
Browse files Browse the repository at this point in the history
  • Loading branch information
ozgurbostan committed Jun 3, 2021
1 parent 6d07b28 commit fe6c361
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include "deneyap.h"
#include "analogWrite.h"

#define LED_PIN LEDB // Led pini (PWM cikis pini)

uint8_t brightness = 0; // Ledin parlaklik ayari (0-255)
uint8_t brightStep = 5; // Parlaklik degisim adimi

void setup() {
analogWriteChannel(LED_PIN); // PWM pin ayari
}

void loop() {
brightness += brightStep; // Parlaklik kademesi degistiriliyor

if ( brightness == 0 || brightness == 255 ) // Sinir degerlerde parlaklik yonu degistiriliyor
{
brightStep = -brightStep;
}

analogWrite(LED_PIN, brightness); // Parlaklik degeri pin ile iliskilendiriliyor

delay(50);
}
106 changes: 106 additions & 0 deletions libraries/03_PWM/src/analogWrite.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
#include "analogWrite.h"

analog_write_channel_t _analog_write_channels[16] = {
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13},
{-1, 5000, 13}};

int analogWriteChannel(uint8_t pin)
{
int channel = -1;

// Check if pin already attached to a channel
for (uint8_t i = 0; i < 16; i++)
{
if (_analog_write_channels[i].pin == pin)
{
channel = i;
break;
}
}

// If not, attach it to a free channel
if (channel == -1)
{
for (uint8_t i = 0; i < 16; i++)
{
if (_analog_write_channels[i].pin == -1)
{
_analog_write_channels[i].pin = pin;
channel = i;
ledcSetup(channel, _analog_write_channels[i].frequency, _analog_write_channels[i].resolution);
ledcAttachPin(pin, channel);
break;
}
}
}

return channel;
}

void analogWriteFrequency(double frequency)
{
for (uint8_t i = 0; i < 16; i++)
{
_analog_write_channels[i].frequency = frequency;
}
}

void analogWriteFrequency(uint8_t pin, double frequency)
{
int channel = analogWriteChannel(pin);

// Make sure the pin was attached to a channel, if not do nothing
if (channel != -1 && channel < 16)
{
_analog_write_channels[channel].frequency = frequency;
}
}

void analogWriteResolution(uint8_t resolution)
{
for (uint8_t i = 0; i < 16; i++)
{
_analog_write_channels[i].resolution = resolution;
}
}

void analogWriteResolution(uint8_t pin, uint8_t resolution)
{
int channel = analogWriteChannel(pin);

// Make sure the pin was attached to a channel, if not do nothing
if (channel != -1 && channel < 16)
{
_analog_write_channels[channel].resolution = resolution;
}
}

void analogWrite(uint8_t pin, uint32_t value, uint32_t valueMax)
{
int channel = analogWriteChannel(pin);

// Make sure the pin was attached to a channel, if not do nothing
if (channel != -1 && channel < 16)
{
uint8_t resolution = _analog_write_channels[channel].resolution;
uint32_t levels = pow(2, resolution);
uint32_t duty = ((levels - 1) / valueMax) * min(value, valueMax);

// write duty to LEDC
ledcWrite(channel, duty);
}
}
23 changes: 23 additions & 0 deletions libraries/03_PWM/src/analogWrite.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#ifndef _ESP32_ANALOG_WRITE_
#define _ESP32_ANALOG_WRITE_

#include <Arduino.h>

typedef struct analog_write_channel
{
int8_t pin;
double frequency;
uint8_t resolution;
} analog_write_channel_t;

int analogWriteChannel(uint8_t pin);

void analogWriteFrequency(double frequency);
void analogWriteFrequency(uint8_t pin, double frequency);

void analogWriteResolution(uint8_t resolution);
void analogWriteResolution(uint8_t pin, uint8_t resolution);

void analogWrite(uint8_t pin, uint32_t value, uint32_t valueMax = 255);

#endif

0 comments on commit fe6c361

Please sign in to comment.