Simple test application for the STMicroelectronics X-NUCLEO-LED61A1 LED Control Expansion Board.
Dependencies: X_NUCLEO_LED61A1 mbed
Fork of HelloWorld_LED61A1 by
LED Control with the X-NUCLEO-LED61A1 Expansion Board
This application provides a simple example of usage of the X-NUCLEO-LED61A1 LED Control Expansion Board.
It shows how to control a LED stripe load connected to the board by means of a sinusoidal wave form injected into the PWM dimming control pin.
Diff: main.cpp
- Revision:
- 7:7a608b07fa9f
- Parent:
- 6:899828fd9d9d
- Child:
- 13:97083451e538
--- a/main.cpp Fri Jan 15 17:12:03 2016 +0000 +++ b/main.cpp Thu Feb 04 10:29:42 2016 +0000 @@ -3,7 +3,7 @@ * @file main.cpp * @author Davide Aliprandi, STMicroelectronics * @version V1.0.0 - * @date December 9th, 2015 + * @date February 4h, 2016 * @brief mbed test application for the STMicroelectronics X-NUCLEO-LED61A1 * LED expansion board. ****************************************************************************** @@ -54,44 +54,13 @@ #endif /* Loop period in micro-seconds. */ -#define LOOP_PERIOD_us (1E5) +#define LOOP_PERIOD_us (5E5) /* 0.5 seconds. */ /* Sin period in micro-seconds. */ -#define PWM_SIN_PERIOD_us (1E7) -#define ANALOG_SIN_PERIOD_us (1E7) - -/* Duration of button press in milli-seconds. */ -#define SWITCH_DEMO_BUTTON_PRESS_ms (500) -#define SWITCH_POWER_BUTTON_PRESS_ms (2000) +#define PWM_SIN_PERIOD_us (1E7) /* 10 seconds. */ /* Duration of initialization interval in milli-seconds. */ -#define INITIALIZATION_INTERVAL_ms (2000) - -/* Dimming Step. */ -#define DIMMING_STEP (0.05f) - - -/* Types ---------------------------------------------------------------------*/ - -/* Demos. */ -typedef enum -{ - MANUAL_PWM_DIMMING = 0, - MANUAL_ANALOG_DIMMING, - AUTOMATIC_PWM_DIMMING, - AUTOMATIC_ANALOG_DIMMING, - PHOTO_BASED_ANALOG_DIMMING, - LED_DEMO_SIZE -} LED_Demo_t; - -/* Actions. */ -typedef enum -{ - SWITCH_POWER = 0, - SWITCH_DEMO, - SWITCH_STATE, - NO_ACTION -} LED_Action_t; +#define INITIALIZATION_INTERVAL_ms (2E3) /* 2 seconds. */ /* Variables -----------------------------------------------------------------*/ @@ -99,39 +68,15 @@ /* Main loop's ticker. */ static Ticker ticker; -/* User Button's interrupt. */ -static InterruptIn button(USER_BUTTON); - -/* MCU Board's Led which provides the user with a visual feedback on - the user button's status (ON = pressed, OFF = released). */ -DigitalOut button_pressed_led(LED1); - /* LED Control Component. */ LED6001 *led; /* Interrupt flags. */ static volatile bool ticker_irq_triggered; -static volatile bool button_irq_triggered; static volatile bool xfault_irq_triggered; -/* Demo State. */ -static volatile LED_Demo_t demo; -static volatile LED_Action_t action; -static volatile bool power_on; - -/* PWM and Analog dimming values. */ +/* PWM dimming values. */ static float pwm_dimming; -static float analog_dimming; - -/* Demos' Names. */ -static char* demos[] = -{ - "Manual PWM Dimming", - "Manual Analog Dimming", - "Sinusoidal PWM Dimming", - "Sinusoidal Analog Dimming", - "Photo-based Analog Dimming" -}; /* Functions -----------------------------------------------------------------*/ @@ -147,18 +92,11 @@ printf("Initializing LED driver..."); /* Initializing Interrupt flags. */ - button_irq_triggered = false; xfault_irq_triggered = false; ticker_irq_triggered = false; - /* Initializing Demo. */ - power_on = true; - action = SWITCH_DEMO; - demo = (LED_Demo_t) (LED_DEMO_SIZE - 1); - - /* Initializing PWM and Analog dimming to maximum values. */ + /* Initializing PWM dimming to maximum values. */ pwm_dimming = 1.0f; - analog_dimming = 1.0f; /* Start-up sequence. */ led->PowerOFF(); @@ -166,11 +104,11 @@ led->PowerON(); /* Printing to the console. */ - printf("Done.\r\n\nDemo:\r\n"); + printf("Done.\r\n\n"); } /** - * @brief Handling the LED capabilities and executing several demos. + * @brief Handling the LED capabilities. * @param None. * @retval None. */ @@ -178,96 +116,20 @@ { static int tick = 0; - /* Handling the power switch. */ - if (action == SWITCH_POWER) - { - /* Switching the LED power ON/OFF. */ - power_on = !power_on; - - if (power_on) - { - /* Initializing PWM and Analog dimming to maximum values. */ - pwm_dimming = 1.0f; - analog_dimming = 1.0f; - } - else - { - /* Printing to the console. */ - printf("%-56s\r", "Power OFF"); + /* Handling the LED dimming when powered ON. */ + pwm_dimming = 0.5f * sin(2 * M_PI * (tick++ * LOOP_PERIOD_us) / PWM_SIN_PERIOD_us) + 0.5f; + tick %= (int) (PWM_SIN_PERIOD_us / LOOP_PERIOD_us); - /* Powering OFF the LED. */ - led->PowerOFF(); - } - } - - /* Handling the LED dimming when powered ON. */ - if (power_on) - { - /* Switching to the next demo. */ - if (action == SWITCH_DEMO) - { - pwm_dimming = 1.0f; - analog_dimming = 1.0f; - tick = 0; - demo = (LED_Demo_t) ((demo + 1) % LED_DEMO_SIZE); - } + /* Printing to the console. */ + printf("Sinusoidal PWM Dimming --> %0.2f\r", pwm_dimming); - /* Setting the LED dimming depending on the selected demo. */ - switch (demo) - { - /* Changing PWM dimming according to the user button. */ - case MANUAL_PWM_DIMMING: - if (action == SWITCH_STATE) - { - pwm_dimming -= DIMMING_STEP; - pwm_dimming = (pwm_dimming < 0.0f ? 1.0f : pwm_dimming); - } - break; - - /* Changing Analog dimming according to the user button. */ - case MANUAL_ANALOG_DIMMING: - if (action == SWITCH_STATE) - { - analog_dimming -= DIMMING_STEP; - analog_dimming = (analog_dimming < 0.0f ? 1.0f : analog_dimming); - } - break; - - /* Changing PWM dimming continuously. */ - case AUTOMATIC_PWM_DIMMING: - pwm_dimming = 0.5f * sin(2 * M_PI * (tick++ * LOOP_PERIOD_us) / PWM_SIN_PERIOD_us) + 0.5f; - tick %= (int) (PWM_SIN_PERIOD_us / LOOP_PERIOD_us) + 1; - action = SWITCH_STATE; - break; + /* + Writing PWM dimming values to the LED. - /* Changing Analog dimming continuously. */ - case AUTOMATIC_ANALOG_DIMMING: - analog_dimming = 0.5f * sin(2 * M_PI * (tick++ * LOOP_PERIOD_us) / ANALOG_SIN_PERIOD_us) + 0.5f; - tick %= (int) (ANALOG_SIN_PERIOD_us / LOOP_PERIOD_us) + 1; - action = SWITCH_STATE; - break; - - /* Setting Analog dimming according to the photo sensor. */ - case PHOTO_BASED_ANALOG_DIMMING: - analog_dimming = 1.0f - led->GetCurrent(); - action = SWITCH_STATE; - break; - } - - /* Writing PWM and Analog dimming values to the LED. */ - if (action != NO_ACTION) - { - /* Printing to the console. */ - printf("%d) %-26s --> Dimming: %0.2f\r", demo + 1, demos[demo], demo == MANUAL_PWM_DIMMING || demo == AUTOMATIC_PWM_DIMMING ? pwm_dimming : analog_dimming); - - /* Writing PWM and Analog dimming values to the LED. */ - led->SetPWMDimming(pwm_dimming); - led->SetAnalogDimming(analog_dimming); - } - } - - /* Resetting the action. */ - action = NO_ACTION; + Notes: + + Replace "SetPWMDimming()" with "SetAnalogDimming()" for an analog control. + */ + led->SetPWMDimming(pwm_dimming); } /** @@ -281,17 +143,6 @@ } /** - * @brief Interrupt Request for the user button's interrupt. - * @param None. - * @retval None. - */ -void ButtonIRQ(void) -{ - button_irq_triggered = true; - button.disable_irq(); -} - -/** * @brief Interrupt Request for the component's XFAULT interrupt. * @param None. * @retval None. @@ -303,43 +154,6 @@ } /** - * @brief Interrupt Handler for the user button's interrupt. - * @param None. - * @retval None. - */ -void ButtonHandler(void) -{ - /* User Button's timer to measure the time the button remains pressed. */ - static Timer button_pressed_timer; - - bool button_pressed_flag = (button.read() == 0 ? true : false); - - if (button_pressed_flag) - { - button_pressed_led = 1; - button_pressed_timer.start(); - } - else - { - button_pressed_led = 0; - button_pressed_timer.stop(); - - /* Either changing current demo's state or switching to the next demo. */ - int time_pressed = button_pressed_timer.read_ms(); - if (time_pressed < SWITCH_DEMO_BUTTON_PRESS_ms) - action = SWITCH_STATE; - else if (time_pressed < SWITCH_POWER_BUTTON_PRESS_ms) - action = SWITCH_DEMO; - else - action = SWITCH_POWER; - - button_pressed_timer.reset(); - } - - button.enable_irq(); -} - -/** * @brief Interrupt Handler for the component's XFAULT interrupt. * @param None. * @retval None. @@ -363,16 +177,7 @@ /*----- Initialization. -----*/ /* Printing to the console. */ - printf("LED Control Application Example\r\n\n" \ - "Demos:\r\n"); - int demo = 0; - for (demo = 0; demo < LED_DEMO_SIZE; demo++) - printf("%d) %-26s\r\n", demo, demos[demo]); - printf("\r\nActions:\r\n" \ - "+ Short Button Press [<%.1fs] --> Manual Dimming\r\n" \ - "+ Medium Button Press --> Switch Demo\r\n" \ - "+ Long Button Press [>%.1fs] --> Switch Power ON/OFF\r\n\n" \ - , SWITCH_DEMO_BUTTON_PRESS_ms / 1000.0f, SWITCH_POWER_BUTTON_PRESS_ms / 1000.0f); + printf("LED Control Application Example\r\n\n"); /* Initializing LED Control Component. */ led = new LED6001(D4, A3, D6, D5); @@ -380,8 +185,6 @@ exit(EXIT_FAILURE); /* Attaching interrupt request functions. */ - button.fall(ButtonIRQ); - button.rise(ButtonIRQ); led->AttachXFaultIRQ(&XFaultIRQ); led->EnableXFaultIRQ(); ticker.attach_us(TickerIRQ, LOOP_PERIOD_us); @@ -399,10 +202,6 @@ { ticker_irq_triggered = false; LEDHandler(); - } else if (button_irq_triggered) - { - button_irq_triggered = false; - ButtonHandler(); } else if (xfault_irq_triggered) { xfault_irq_triggered = false;