Skip to content

Commit

Permalink
WIP: Changed test led function to include other channels
Browse files Browse the repository at this point in the history
  • Loading branch information
christopherkinyua committed Nov 1, 2024
1 parent f3964de commit 9928b32
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 40 deletions.
9 changes: 8 additions & 1 deletion firmware/Core/Inc/pwm.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,21 @@
#define __INCLUDE_GUARD__PWM_H__

#include <stdint.h>
#include "driver/ledc.h"

#ifdef __cplusplus
extern "C"
{
#endif

#define RED_CHANNEL LEDC_CHANNEL_0
#define GREEN_CHANNEL LEDC_CHANNEL_1
#define BLUE_CHANNEL LEDC_CHANNEL_2


void LED_PWM_Init(void);
uint8_t LED_set_dimming(uint32_t duty_percentage);
uint8_t LED_set_dimming(ledc_channel_t channel, uint32_t duty_percentage);
uint8_t LED_channel_ramp(ledc_channel_t channel, uint32_t delay_ms);
void LED_test_dimming(void);

#ifdef __cplusplus
Expand Down
120 changes: 90 additions & 30 deletions firmware/Core/Src/pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,62 +22,122 @@ void LED_PWM_Init(void)
ledc_timer_config(&ledc_timer);

// Setting up the LEDC channel Configuration for GPIO pin 0
ledc_channel_config_t ledc_channel = {
ledc_channel_config_t ledc_channel_4 = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_0,
.timer_sel = LEDC_TIMER_0,
.intr_type = LEDC_INTR_DISABLE,
.gpio_num = GPIO_NUM_0,
.gpio_num = GPIO_NUM_4,
.duty = 0, // Initially off
.hpoint = 0};
ledc_channel_config(&ledc_channel);
ledc_channel_config(&ledc_channel_4);

ledc_channel_config_t ledc_channel_5 = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_1,
.timer_sel = LEDC_TIMER_0,
.intr_type = LEDC_INTR_DISABLE,
.gpio_num = GPIO_NUM_5,
.duty = 0, // Initially off
.hpoint = 0};
ledc_channel_config(&ledc_channel_5);

ledc_channel_config_t ledc_channel_6 = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_2,
.timer_sel = LEDC_TIMER_0,
.intr_type = LEDC_INTR_DISABLE,
.gpio_num = GPIO_NUM_6,
.duty = 0, // Initially off
.hpoint = 0};
ledc_channel_config(&ledc_channel_6);

ledc_channel_config_t ledc_channel_7 = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_3,
.timer_sel = LEDC_TIMER_0,
.intr_type = LEDC_INTR_DISABLE,
.gpio_num = GPIO_NUM_7,
.duty = 0, // Initially off
.hpoint = 0};
ledc_channel_config(&ledc_channel_7);

ledc_channel_config_t ledc_channel_8 = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_4,
.timer_sel = LEDC_TIMER_0,
.intr_type = LEDC_INTR_DISABLE,
.gpio_num = GPIO_NUM_8,
.duty = 0, // Initially off
.hpoint = 0};
ledc_channel_config(&ledc_channel_8);
}

/// @brief 0-10V Dimming: Controls the dimming level of an LED using PWM.
/// @param duty_percentage
/// - Arg 0: The desired brightness level as a percentage (uint32_t)
/// @brief Sets the dimming level of a specified LED channel to a percentage
/// @param channel The LED channel to dim (LEDC_CHANNEL_0, LEDC_CHANNEL_1, etc.)
/// @param duty_percentage The desired brightness level as a percentage (0-100)
/// @return 0 on success, > 0 on error
/// TODO: Add error checks for the ledc_set_duty and ledc_update_duty
uint8_t LED_set_dimming(uint32_t duty_percentage)
uint8_t LED_set_dimming(ledc_channel_t channel, uint32_t duty_percentage)
{
if (duty_percentage > 100)
{
return 1;
// Error: Percentage out of range
return 1;
}

// Calculate duty cycle based on percentage (0-100)
uint32_t duty = (8191 * duty_percentage) / 100; // 8191 = 2^13 - 1 (13-bit resolution)

// Set the duty cycle and update the PWM output
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, duty);
ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);
// Set the duty cycle and update the PWM output for the specified channel
ledc_set_duty(LEDC_LOW_SPEED_MODE, channel, duty);
ledc_update_duty(LEDC_LOW_SPEED_MODE, channel);

return 0;
return 0; // Success
}

/// @brief 0-10V Dimming: Testing the 0-10V Dimming through PWM
/// @param None
/// @return 0 on success, >0 on error
/// TODO: Implement the error checks obtained from LED_set_dimming
void LED_test_dimming(void)
/// @brief Ramps the dimming of a specified LED channel up and down
/// @param channel The LED channel to dim (LEDC_CHANNEL_0, LEDC_CHANNEL_1, etc.)
/// @param delay_ms Delay in milliseconds between brightness adjustments
/// @return 0 on success, > 0 on error
uint8_t LED_channel_ramp(ledc_channel_t channel, uint32_t delay_ms)
{
uint8_t dimming_result;

// Ramp up brightness from 0 to 100%
for (int i = 0; i <= 100; i += 5)
{
dimming_result = LED_set_dimming(i);
if (dimming_result == 0)
{
continue;
}
vTaskDelay(500 / portTICK_PERIOD_MS); // Delay 500ms
dimming_result = LED_set_dimming(channel, i);
if (dimming_result > 0) {
// Error handling
return dimming_result;
}
vTaskDelay(delay_ms / portTICK_PERIOD_MS);
}

// Ramp down brightness from 100 to 0%
for (int i = 100; i >= 0; i -= 5)
{
dimming_result = LED_set_dimming(i);
if (dimming_result == 0)
{
continue;
}
vTaskDelay(500 / portTICK_PERIOD_MS); // Delay 500ms
dimming_result = LED_set_dimming(channel, i);
if (dimming_result > 0) {
// Error handling
return dimming_result;
}
vTaskDelay(delay_ms / portTICK_PERIOD_MS);
}

return 0; // Success
}


/// @brief 0-10V Dimming: Testing the 0-10V Dimming through PWM
/// @param None
/// @return 0 on success, >0 on error
/// TODO: Implement the error checks obtained from LED_set_dimming
void LED_test_dimming(void)
{
LED_channel_ramp(LEDC_CHANNEL_0, 100); // Red
LED_channel_ramp(LEDC_CHANNEL_1, 100); // Blue
LED_channel_ramp(LEDC_CHANNEL_2, 100); // Green
LED_channel_ramp(LEDC_CHANNEL_3, 100); // Not Sure
LED_channel_ramp(LEDC_CHANNEL_4, 100); // Not Sure
}
6 changes: 3 additions & 3 deletions firmware/Core/Src/unit_tests/unit_test_inventory.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ const TEST_Definition_t TEST_definitions[] = {
.test_file = "unit_tests/unit_test_function_arg_helpers",
.test_func_name = "is_valid_hex_string"},

{.test_func = TEST_EXEC__LED_set_dimming,
.test_file = "unit_tests/unit_test_pwm",
.test_func_name = "LED_set_dimming"},
// {.test_func = TEST_EXEC__LED_set_dimming,
// .test_file = "unit_tests/unit_test_pwm",
// .test_func_name = "LED_set_dimming"},

{.test_func = TEST_EXEC__RGB_convert_hex_to_rgb,
.test_file = "unit_tests/unit_test_rgb",
Expand Down
12 changes: 6 additions & 6 deletions firmware/Core/Src/unit_tests/unit_test_pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ uint8_t TEST_EXEC__LED_set_dimming()
{
uint8_t status;

// Pass Criteria
status = LED_set_dimming(50);
TEST_ASSERT_TRUE(status == 0);
// // Pass Criteria
// status = LED_set_dimming(RED_CHANNEL,50);
// TEST_ASSERT_TRUE(status == 0);

// Fail Criteria
status = LED_set_dimming(110);
TEST_ASSERT_TRUE(status == 1);
// // Fail Criteria
// status = LED_set_dimming(RED_CHANNEL,110);
// TEST_ASSERT_TRUE(status == 1);

return 0;
}

0 comments on commit 9928b32

Please sign in to comment.