Tedd OKANO
/
pwm_led_sample
simple sample code
main.cpp@0:359aaebee1d9, 2014-02-03 (annotated)
- Committer:
- okano
- Date:
- Mon Feb 03 06:40:03 2014 +0000
- Revision:
- 0:359aaebee1d9
pam led sample
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okano | 0:359aaebee1d9 | 1 | #include "mbed.h" |
okano | 0:359aaebee1d9 | 2 | |
okano | 0:359aaebee1d9 | 3 | PwmOut led1(LED1); |
okano | 0:359aaebee1d9 | 4 | PwmOut led2(LED2); |
okano | 0:359aaebee1d9 | 5 | PwmOut led3(LED3); |
okano | 0:359aaebee1d9 | 6 | PwmOut led4(LED4); |
okano | 0:359aaebee1d9 | 7 | |
okano | 0:359aaebee1d9 | 8 | PwmOut led[ 4 ] = {led4, led3, led2, led1 }; |
okano | 0:359aaebee1d9 | 9 | |
okano | 0:359aaebee1d9 | 10 | #define UPDATE_RATE 100.0 |
okano | 0:359aaebee1d9 | 11 | |
okano | 0:359aaebee1d9 | 12 | class Blinker { |
okano | 0:359aaebee1d9 | 13 | public: |
okano | 0:359aaebee1d9 | 14 | |
okano | 0:359aaebee1d9 | 15 | typedef enum { |
okano | 0:359aaebee1d9 | 16 | OFF, |
okano | 0:359aaebee1d9 | 17 | ON, |
okano | 0:359aaebee1d9 | 18 | STAY, |
okano | 0:359aaebee1d9 | 19 | UP, |
okano | 0:359aaebee1d9 | 20 | DOWN, |
okano | 0:359aaebee1d9 | 21 | UPDOWN |
okano | 0:359aaebee1d9 | 22 | } Mode; |
okano | 0:359aaebee1d9 | 23 | |
okano | 0:359aaebee1d9 | 24 | Blinker( PinName pin ) : |
okano | 0:359aaebee1d9 | 25 | output( pin ), |
okano | 0:359aaebee1d9 | 26 | mode( UPDOWN ), |
okano | 0:359aaebee1d9 | 27 | state( false ), |
okano | 0:359aaebee1d9 | 28 | intensity( 0.0 ), |
okano | 0:359aaebee1d9 | 29 | rate( 1.0 / UPDATE_RATE ), |
okano | 0:359aaebee1d9 | 30 | direction( true ) { |
okano | 0:359aaebee1d9 | 31 | t.attach( this, &Blinker::blinker_maintain, 1.0 / UPDATE_RATE ); |
okano | 0:359aaebee1d9 | 32 | output.period_ms( 1 ); |
okano | 0:359aaebee1d9 | 33 | output = intensity; |
okano | 0:359aaebee1d9 | 34 | } |
okano | 0:359aaebee1d9 | 35 | |
okano | 0:359aaebee1d9 | 36 | void start( void ) { |
okano | 0:359aaebee1d9 | 37 | state = true; |
okano | 0:359aaebee1d9 | 38 | } |
okano | 0:359aaebee1d9 | 39 | |
okano | 0:359aaebee1d9 | 40 | void stop( void ) { |
okano | 0:359aaebee1d9 | 41 | state = false; |
okano | 0:359aaebee1d9 | 42 | } |
okano | 0:359aaebee1d9 | 43 | |
okano | 0:359aaebee1d9 | 44 | void set_mode( Mode m ) { |
okano | 0:359aaebee1d9 | 45 | mode = m; |
okano | 0:359aaebee1d9 | 46 | } |
okano | 0:359aaebee1d9 | 47 | |
okano | 0:359aaebee1d9 | 48 | void set_initial_intensity( float v ) { |
okano | 0:359aaebee1d9 | 49 | intensity = v; |
okano | 0:359aaebee1d9 | 50 | } |
okano | 0:359aaebee1d9 | 51 | |
okano | 0:359aaebee1d9 | 52 | void set_frequency( float f ) { |
okano | 0:359aaebee1d9 | 53 | rate = f / UPDATE_RATE; |
okano | 0:359aaebee1d9 | 54 | } |
okano | 0:359aaebee1d9 | 55 | |
okano | 0:359aaebee1d9 | 56 | private: |
okano | 0:359aaebee1d9 | 57 | void blinker_maintain( void ) { |
okano | 0:359aaebee1d9 | 58 | |
okano | 0:359aaebee1d9 | 59 | if ( OFF == state ) |
okano | 0:359aaebee1d9 | 60 | return; |
okano | 0:359aaebee1d9 | 61 | |
okano | 0:359aaebee1d9 | 62 | switch ( mode ) { |
okano | 0:359aaebee1d9 | 63 | case OFF : |
okano | 0:359aaebee1d9 | 64 | intensity = 0.0; |
okano | 0:359aaebee1d9 | 65 | break; |
okano | 0:359aaebee1d9 | 66 | case ON : |
okano | 0:359aaebee1d9 | 67 | intensity = 1.0; |
okano | 0:359aaebee1d9 | 68 | break; |
okano | 0:359aaebee1d9 | 69 | case STAY : |
okano | 0:359aaebee1d9 | 70 | break; |
okano | 0:359aaebee1d9 | 71 | case UP : |
okano | 0:359aaebee1d9 | 72 | intensity += rate; |
okano | 0:359aaebee1d9 | 73 | intensity = (1.0 < intensity) ? 0.0 : intensity; |
okano | 0:359aaebee1d9 | 74 | break; |
okano | 0:359aaebee1d9 | 75 | case DOWN : |
okano | 0:359aaebee1d9 | 76 | intensity -= rate; |
okano | 0:359aaebee1d9 | 77 | intensity = (intensity < 0.0) ? 1.0 : intensity; |
okano | 0:359aaebee1d9 | 78 | break; |
okano | 0:359aaebee1d9 | 79 | case UPDOWN : |
okano | 0:359aaebee1d9 | 80 | direction = (intensity <= 0.0) ? true : direction; |
okano | 0:359aaebee1d9 | 81 | direction = (1.0 <= intensity) ? false : direction; |
okano | 0:359aaebee1d9 | 82 | intensity += direction ? (rate * 2.0) : -(rate * 2.0); |
okano | 0:359aaebee1d9 | 83 | break; |
okano | 0:359aaebee1d9 | 84 | default : |
okano | 0:359aaebee1d9 | 85 | break; |
okano | 0:359aaebee1d9 | 86 | } |
okano | 0:359aaebee1d9 | 87 | |
okano | 0:359aaebee1d9 | 88 | output = intensity * intensity; |
okano | 0:359aaebee1d9 | 89 | } |
okano | 0:359aaebee1d9 | 90 | |
okano | 0:359aaebee1d9 | 91 | PwmOut output; |
okano | 0:359aaebee1d9 | 92 | Ticker t; |
okano | 0:359aaebee1d9 | 93 | |
okano | 0:359aaebee1d9 | 94 | Mode mode; |
okano | 0:359aaebee1d9 | 95 | int state; |
okano | 0:359aaebee1d9 | 96 | float intensity; |
okano | 0:359aaebee1d9 | 97 | float rate; |
okano | 0:359aaebee1d9 | 98 | float direction; |
okano | 0:359aaebee1d9 | 99 | }; |
okano | 0:359aaebee1d9 | 100 | |
okano | 0:359aaebee1d9 | 101 | //Blinker b( LED1 ); |
okano | 0:359aaebee1d9 | 102 | Blinker b[ 4 ] = { LED4, LED3, LED2, LED1 }; |
okano | 0:359aaebee1d9 | 103 | |
okano | 0:359aaebee1d9 | 104 | |
okano | 0:359aaebee1d9 | 105 | int main() { |
okano | 0:359aaebee1d9 | 106 | |
okano | 0:359aaebee1d9 | 107 | |
okano | 0:359aaebee1d9 | 108 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:359aaebee1d9 | 109 | b[ i ].set_frequency( 2 ); |
okano | 0:359aaebee1d9 | 110 | b[i].start(); |
okano | 0:359aaebee1d9 | 111 | } |
okano | 0:359aaebee1d9 | 112 | |
okano | 0:359aaebee1d9 | 113 | while ( 1 ) { |
okano | 0:359aaebee1d9 | 114 | |
okano | 0:359aaebee1d9 | 115 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:359aaebee1d9 | 116 | b[ i ].set_mode( Blinker::DOWN ); |
okano | 0:359aaebee1d9 | 117 | b[ i ].set_initial_intensity( 0.25 * (float)i ); |
okano | 0:359aaebee1d9 | 118 | } |
okano | 0:359aaebee1d9 | 119 | |
okano | 0:359aaebee1d9 | 120 | wait( 2.0 ); |
okano | 0:359aaebee1d9 | 121 | |
okano | 0:359aaebee1d9 | 122 | for ( int n = 0; n < 40; n++ ) { |
okano | 0:359aaebee1d9 | 123 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:359aaebee1d9 | 124 | b[ i ].set_mode( rand() & 0x1 ? Blinker::ON : Blinker::OFF ); |
okano | 0:359aaebee1d9 | 125 | } |
okano | 0:359aaebee1d9 | 126 | wait( 0.05 ); |
okano | 0:359aaebee1d9 | 127 | } |
okano | 0:359aaebee1d9 | 128 | |
okano | 0:359aaebee1d9 | 129 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:359aaebee1d9 | 130 | b[ i ].set_mode( Blinker::DOWN ); |
okano | 0:359aaebee1d9 | 131 | b[ i ].set_initial_intensity( 1.0 - (0.25 * (float)i) ); |
okano | 0:359aaebee1d9 | 132 | } |
okano | 0:359aaebee1d9 | 133 | |
okano | 0:359aaebee1d9 | 134 | wait( 2.0 ); |
okano | 0:359aaebee1d9 | 135 | |
okano | 0:359aaebee1d9 | 136 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:359aaebee1d9 | 137 | b[ i ].set_mode( Blinker::UPDOWN ); |
okano | 0:359aaebee1d9 | 138 | b[ i ].set_initial_intensity( 0 ); |
okano | 0:359aaebee1d9 | 139 | } |
okano | 0:359aaebee1d9 | 140 | |
okano | 0:359aaebee1d9 | 141 | wait( 2.0 ); |
okano | 0:359aaebee1d9 | 142 | |
okano | 0:359aaebee1d9 | 143 | for ( int i = 0; i < 4; i++ ) { |
okano | 0:359aaebee1d9 | 144 | b[ i ].set_mode( Blinker::UPDOWN ); |
okano | 0:359aaebee1d9 | 145 | b[ i ].set_initial_intensity( (i & 0x1) ? 1 : 0 ); |
okano | 0:359aaebee1d9 | 146 | } |
okano | 0:359aaebee1d9 | 147 | |
okano | 0:359aaebee1d9 | 148 | wait( 2.0 ); |
okano | 0:359aaebee1d9 | 149 | |
okano | 0:359aaebee1d9 | 150 | } |
okano | 0:359aaebee1d9 | 151 | |
okano | 0:359aaebee1d9 | 152 | } |