Dependencies: PCA9955A_library_prototype mbed
main.cpp@10:a31bfd0b3e8e, 2014-08-01 (annotated)
- Committer:
- okano
- Date:
- Fri Aug 01 07:14:51 2014 +0000
- Revision:
- 10:a31bfd0b3e8e
- Parent:
- 8:4400ee176f03
register definitions are corrected
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okano | 5:78bfbf11bb2f | 1 | #include "mbed.h" |
okano | 2:8a31696f1da5 | 2 | #include "PCA9955A.h" |
okano | 0:71d7b5b100ab | 3 | |
okano | 1:8bcef4962076 | 4 | BusOut leds( LED4, LED3, LED2, LED1 ); |
okano | 4:75a2c3550bdc | 5 | DigitalOut pin( p21 ); |
okano | 0:71d7b5b100ab | 6 | AnalogIn ain( p20 ); |
okano | 5:78bfbf11bb2f | 7 | AnalogOut aout( p18 ); |
okano | 0:71d7b5b100ab | 8 | |
okano | 5:78bfbf11bb2f | 9 | PCA9955A led_driver( p28, p27, 0x02 ); // SDA, SCL, I2C_slave_sddress |
okano | 2:8a31696f1da5 | 10 | |
okano | 5:78bfbf11bb2f | 11 | Ticker led_maintenance; |
okano | 5:78bfbf11bb2f | 12 | Ticker sample_timing; |
okano | 2:8a31696f1da5 | 13 | |
okano | 2:8a31696f1da5 | 14 | int led_change = 0; |
okano | 5:78bfbf11bb2f | 15 | int sampling = 0; |
okano | 2:8a31696f1da5 | 16 | |
okano | 2:8a31696f1da5 | 17 | |
okano | 2:8a31696f1da5 | 18 | void set_color( int v ); |
okano | 2:8a31696f1da5 | 19 | void led_cntl(); |
okano | 5:78bfbf11bb2f | 20 | void ad_cntl(); |
okano | 7:40f2b0db16a6 | 21 | int peak_detect( float in ); |
okano | 7:40f2b0db16a6 | 22 | void init_setting( void ); |
okano | 2:8a31696f1da5 | 23 | |
okano | 2:8a31696f1da5 | 24 | |
okano | 1:8bcef4962076 | 25 | int main() |
okano | 0:71d7b5b100ab | 26 | { |
okano | 7:40f2b0db16a6 | 27 | init_setting(); |
okano | 7:40f2b0db16a6 | 28 | |
okano | 5:78bfbf11bb2f | 29 | led_maintenance.attach( &led_cntl, 0.02 ); |
okano | 5:78bfbf11bb2f | 30 | sample_timing.attach( &ad_cntl, 0.01 ); |
okano | 2:8a31696f1da5 | 31 | |
okano | 0:71d7b5b100ab | 32 | while(1) { |
okano | 5:78bfbf11bb2f | 33 | |
okano | 5:78bfbf11bb2f | 34 | if ( sampling ) { |
okano | 5:78bfbf11bb2f | 35 | sampling = 0; |
okano | 7:40f2b0db16a6 | 36 | led_change = peak_detect( (float)ain ); |
okano | 2:8a31696f1da5 | 37 | } |
okano | 0:71d7b5b100ab | 38 | } |
okano | 0:71d7b5b100ab | 39 | |
okano | 0:71d7b5b100ab | 40 | } |
okano | 2:8a31696f1da5 | 41 | |
okano | 6:4da1c7f560b8 | 42 | |
okano | 7:40f2b0db16a6 | 43 | int peak_detect( float in ) |
okano | 6:4da1c7f560b8 | 44 | { |
okano | 7:40f2b0db16a6 | 45 | static float coef = 26.4; |
okano | 7:40f2b0db16a6 | 46 | static float peak = 0; |
okano | 7:40f2b0db16a6 | 47 | static float thresold = 0.05; |
okano | 7:40f2b0db16a6 | 48 | static int shift; |
okano | 7:40f2b0db16a6 | 49 | static int count = 0; |
okano | 7:40f2b0db16a6 | 50 | int rtn = 0; |
okano | 7:40f2b0db16a6 | 51 | |
okano | 7:40f2b0db16a6 | 52 | pin =0; |
okano | 7:40f2b0db16a6 | 53 | in = (float)ain; |
okano | 7:40f2b0db16a6 | 54 | |
okano | 7:40f2b0db16a6 | 55 | if ( 0.06 < in ) { |
okano | 7:40f2b0db16a6 | 56 | if ( 200 <= count ) { |
okano | 7:40f2b0db16a6 | 57 | led_maintenance.attach( &led_cntl, 0.02 ); |
okano | 7:40f2b0db16a6 | 58 | init_setting(); |
okano | 7:40f2b0db16a6 | 59 | } |
okano | 7:40f2b0db16a6 | 60 | count = 0; |
okano | 7:40f2b0db16a6 | 61 | |
okano | 7:40f2b0db16a6 | 62 | if ( peak < in ) { |
okano | 7:40f2b0db16a6 | 63 | if ( thresold < (in - peak) ) { |
okano | 7:40f2b0db16a6 | 64 | thresold = in - peak; |
okano | 7:40f2b0db16a6 | 65 | rtn = 1; |
okano | 7:40f2b0db16a6 | 66 | } |
okano | 7:40f2b0db16a6 | 67 | peak = in; |
okano | 7:40f2b0db16a6 | 68 | } |
okano | 7:40f2b0db16a6 | 69 | } else { |
okano | 7:40f2b0db16a6 | 70 | if ( 200 == count ) { |
okano | 7:40f2b0db16a6 | 71 | led_maintenance.attach( NULL, 0.02 ); |
okano | 7:40f2b0db16a6 | 72 | |
okano | 7:40f2b0db16a6 | 73 | init_setting(); |
okano | 8:4400ee176f03 | 74 | led_driver = 0xEEEE; |
okano | 8:4400ee176f03 | 75 | led_driver.set_all_intensity( (char)0xC7, true ); |
okano | 7:40f2b0db16a6 | 76 | led_driver.group_selector( 0x1111, 0x2222, 0x4444, 0x8888 ); // channel assignment for groups |
okano | 8:4400ee176f03 | 77 | led_driver.gradation_setting( 0 ,0xC0 ,0x8 ,0xD2 ,0xDE ); |
okano | 8:4400ee176f03 | 78 | led_driver.gradation_setting( 1 ,0xC0 ,0x9 ,0xC4 ,0xC7 ); |
okano | 8:4400ee176f03 | 79 | led_driver.gradation_setting( 2 ,0xC0 ,0x9 ,0xC4 ,0xC7 ); |
okano | 8:4400ee176f03 | 80 | led_driver.gradation_setting( 3 ,0xC0 ,0x9 ,0xC4 ,0xC7 ); |
okano | 8:4400ee176f03 | 81 | led_driver.gradation_start( 1, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 82 | |
okano | 7:40f2b0db16a6 | 83 | } else if ( 300 == count ) { |
okano | 8:4400ee176f03 | 84 | led_driver.gradation_start( 2, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 85 | } else if ( 400 == count ) { |
okano | 8:4400ee176f03 | 86 | led_driver.gradation_start( 3, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 87 | } else if ( 500 == count ) { |
okano | 8:4400ee176f03 | 88 | //led_driver.gradation_start( 3, CONTINUOUS ); |
okano | 7:40f2b0db16a6 | 89 | } |
okano | 7:40f2b0db16a6 | 90 | count++; |
okano | 6:4da1c7f560b8 | 91 | } |
okano | 6:4da1c7f560b8 | 92 | |
okano | 7:40f2b0db16a6 | 93 | shift = (int)(coef * peak); |
okano | 7:40f2b0db16a6 | 94 | leds = 0x1 << shift; |
okano | 7:40f2b0db16a6 | 95 | peak *= 0.97; |
okano | 7:40f2b0db16a6 | 96 | thresold*= (thresold < 0.07) ? 0.07 : thresold * 0.9; |
okano | 7:40f2b0db16a6 | 97 | pin =1; |
okano | 7:40f2b0db16a6 | 98 | aout = peak; |
okano | 8:4400ee176f03 | 99 | |
okano | 8:4400ee176f03 | 100 | if ( shift > 2 ) { |
okano | 8:4400ee176f03 | 101 | //led_change = 1; |
okano | 8:4400ee176f03 | 102 | } |
okano | 8:4400ee176f03 | 103 | |
okano | 7:40f2b0db16a6 | 104 | return ( rtn ); |
okano | 7:40f2b0db16a6 | 105 | } |
okano | 7:40f2b0db16a6 | 106 | |
okano | 5:78bfbf11bb2f | 107 | void ad_cntl() |
okano | 5:78bfbf11bb2f | 108 | { |
okano | 5:78bfbf11bb2f | 109 | sampling = 1; |
okano | 5:78bfbf11bb2f | 110 | } |
okano | 5:78bfbf11bb2f | 111 | |
okano | 5:78bfbf11bb2f | 112 | |
okano | 5:78bfbf11bb2f | 113 | void led_cntl() |
okano | 2:8a31696f1da5 | 114 | { |
okano | 4:75a2c3550bdc | 115 | static int count = 0; |
okano | 2:8a31696f1da5 | 116 | static float intensity = 1.0; |
okano | 2:8a31696f1da5 | 117 | |
okano | 2:8a31696f1da5 | 118 | if ( led_change ) { |
okano | 4:75a2c3550bdc | 119 | set_color( count++ & 0x3 ); |
okano | 2:8a31696f1da5 | 120 | led_change = 0; |
okano | 2:8a31696f1da5 | 121 | intensity = 1.0; |
okano | 2:8a31696f1da5 | 122 | } |
okano | 5:78bfbf11bb2f | 123 | |
okano | 2:8a31696f1da5 | 124 | led_driver.set_all_intensity( (char)(intensity * (float)0xFF) ); |
okano | 5:78bfbf11bb2f | 125 | |
okano | 2:8a31696f1da5 | 126 | intensity *= 0.90; |
okano | 2:8a31696f1da5 | 127 | } |
okano | 2:8a31696f1da5 | 128 | |
okano | 2:8a31696f1da5 | 129 | void set_color( int v ) |
okano | 2:8a31696f1da5 | 130 | { |
okano | 4:75a2c3550bdc | 131 | v = 0x1 << v; |
okano | 2:8a31696f1da5 | 132 | led_driver = (v << 12) | (v << 8) | (v << 4) | v; |
okano | 2:8a31696f1da5 | 133 | } |
okano | 2:8a31696f1da5 | 134 | |
okano | 7:40f2b0db16a6 | 135 | |
okano | 7:40f2b0db16a6 | 136 | void init_setting( void ) |
okano | 7:40f2b0db16a6 | 137 | { |
okano | 7:40f2b0db16a6 | 138 | led_driver = 0xFFFF; |
okano | 7:40f2b0db16a6 | 139 | led_driver.set_all_intensity( 0xFF ); |
okano | 7:40f2b0db16a6 | 140 | led_driver.set_all_intensity( 0x40, true ); |
okano | 7:40f2b0db16a6 | 141 | led_driver.group_selector( 0x0000, 0x0000, 0x0000, 0x0000 ); // all channels are in normal control |
okano | 7:40f2b0db16a6 | 142 | } |
okano | 7:40f2b0db16a6 | 143 |