Dependencies:   PCA9955A_library_prototype mbed

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?

UserRevisionLine numberNew 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