Frederic DUFOURG
/
Ticker_and_PWM
A first try to test how interrupt, timeout and ticker interact.
main.cpp
- Committer:
- fdufnews
- Date:
- 2014-08-30
- Revision:
- 1:d07b9b4d4264
- Parent:
- 0:3789d7ce5639
- Child:
- 2:87c848ac42d9
File content as of revision 1:d07b9b4d4264:
#include "mbed.h" /** * @file main.cpp * @brief main file. * * @addtogroup test * @author fdufnews * @date 23.08.2014 * @brief Main module to test led, button and ticker interaction * @note required LEDs on pin D9 and D11 in addition to that on the board * @{ */ #define F_DELAY1 1.5 #define F_DELAY2 0.25 void offEnd(void); Timeout redOn, redOff; // 2 timeout that call each other to make some sort of programmable oscillator Ticker flipperPWM; // Ticker that ramp up and down an LED InterruptIn button1(USER_BUTTON); // button that light an LED and modify timeouts period DigitalOut led1(LED1); // The green LED onboard DigitalOut redLED(D9); // a red LED on a breadboard PwmOut orangeLED(D11); // an orange one on the breadboard /** Function to toggle led1 evry time the button is pushed this function is called and led1 state toggled*/ void toggleLed1(void){ led1 = !led1; } /** Function called at end of onEnd timeout, sets new timeout defined by led1 state onEnd calls offEnd which calls onEnd making an oscillator*/ void onEnd(void){ redLED=0; // led off float delay = led1?F_DELAY1:F_DELAY2; // sets new delay conditionned by led1 state redOff.attach(&offEnd,delay); // update delay } /** Function called at end ofEnd off timeout, sets new timeout defined by led1 state offEnd calls onEnd which calls offEnd making an oscillator*/ void offEnd(void){ redLED=1; // led on float delay = led1?F_DELAY1:F_DELAY2; // sets new delay conditionned by led1 state redOn.attach(&onEnd,delay); // update delay } /** Function to manage PWM for orange LED at each new tick rampPWM is called changing PWM value ramping up and down the LED*/ void rampPWM(void){ static int rampDir=0; float curVal = orangeLED.read(); // read current programmed PWM value if (rampDir==0){ // if ramping up curVal+=0.05; // increment current PWM value orangeLED=curVal; // sets PWM if (curVal>=1.0){ // if limit reached rampDir=1; // toggle direction } }else if (rampDir==1){ // if ramping down curVal-=0.1; // decrement current PWM value orangeLED=curVal; // sets PWM if (curVal<=0.0){ // if limit reached rampDir=0; // toggle direction } } } /** main function sets system up by initializing LEDs state attaching interrupt launching ticker and timeout then enters an infinite while(1) loop */ int main(void){ // sets LED default state led1=0; redLED=1; orangeLED.write(0.0); // attach functions called by ISR redOn.attach(&onEnd,F_DELAY1); // toggle redLED state flipperPWM.attach(&rampPWM,0.1); // change PWM value every 100ms button1.fall(&toggleLed1); while(1){}; // do nothing } /** @} */