Dependencies:   PCA9955A_library_prototype mbed

Committer:
okano
Date:
Thu Jul 17 10:23:22 2014 +0000
Revision:
7:40f2b0db16a6
Parent:
6:4da1c7f560b8
Child:
8:4400ee176f03
gradation control when the audio is low level

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 7:40f2b0db16a6 29 #if 0
okano 7:40f2b0db16a6 30 led_driver.group_selector( 0x1111, 0x2222, 0x4444, 0x8888 ); // channel assignment for groups
okano 7:40f2b0db16a6 31 led_driver.gradation_setting( 0 ,0xC0 ,0x7 ,0xC4 ,0xFD );
okano 7:40f2b0db16a6 32 led_driver.gradation_setting( 1 ,0xC0 ,0x7 ,0xC4 ,0xFD );
okano 7:40f2b0db16a6 33 led_driver.gradation_setting( 2 ,0xC0 ,0x7 ,0xC4 ,0xFD );
okano 7:40f2b0db16a6 34 led_driver.gradation_setting( 3 ,0xC0 ,0x7 ,0xC4 ,0xFD );
okano 2:8a31696f1da5 35
okano 7:40f2b0db16a6 36 led_driver.gradation_start( 0, CONTINUOUS );
okano 7:40f2b0db16a6 37 //wait_ms( 1000 );
okano 7:40f2b0db16a6 38 led_driver.gradation_start( 1, CONTINUOUS );
okano 7:40f2b0db16a6 39 //wait_ms( 1000 );
okano 7:40f2b0db16a6 40 led_driver.gradation_start( 2, CONTINUOUS );
okano 7:40f2b0db16a6 41 //wait_ms( 1000 );
okano 7:40f2b0db16a6 42 led_driver.gradation_start( 3, CONTINUOUS );
okano 7:40f2b0db16a6 43 wait_ms( 10000 );
okano 7:40f2b0db16a6 44 led_driver.gradation_stop();
okano 7:40f2b0db16a6 45 led_driver.group_selector( 0x0000, 0x0000, 0x0000, 0x0000 ); // all channels are in normal control
okano 7:40f2b0db16a6 46
okano 7:40f2b0db16a6 47 led_driver.set_all_intensity( 0xFF, true );
okano 7:40f2b0db16a6 48 #endif
okano 2:8a31696f1da5 49
okano 2:8a31696f1da5 50 set_color( 1 );
okano 2:8a31696f1da5 51
okano 5:78bfbf11bb2f 52 led_maintenance.attach( &led_cntl, 0.02 );
okano 5:78bfbf11bb2f 53 sample_timing.attach( &ad_cntl, 0.01 );
okano 2:8a31696f1da5 54
okano 0:71d7b5b100ab 55 while(1) {
okano 5:78bfbf11bb2f 56
okano 5:78bfbf11bb2f 57 if ( sampling ) {
okano 5:78bfbf11bb2f 58 sampling = 0;
okano 7:40f2b0db16a6 59 led_change = peak_detect( (float)ain );
okano 2:8a31696f1da5 60 }
okano 0:71d7b5b100ab 61 }
okano 0:71d7b5b100ab 62
okano 0:71d7b5b100ab 63 }
okano 2:8a31696f1da5 64
okano 6:4da1c7f560b8 65
okano 7:40f2b0db16a6 66 int peak_detect( float in )
okano 6:4da1c7f560b8 67 {
okano 7:40f2b0db16a6 68 static float coef = 26.4;
okano 7:40f2b0db16a6 69 static float peak = 0;
okano 7:40f2b0db16a6 70 static float thresold = 0.05;
okano 7:40f2b0db16a6 71 static int shift;
okano 7:40f2b0db16a6 72 static int count = 0;
okano 7:40f2b0db16a6 73 int rtn = 0;
okano 7:40f2b0db16a6 74
okano 7:40f2b0db16a6 75 pin =0;
okano 7:40f2b0db16a6 76 in = (float)ain;
okano 7:40f2b0db16a6 77
okano 7:40f2b0db16a6 78 if ( 0.06 < in ) {
okano 7:40f2b0db16a6 79 if ( 200 <= count ) {
okano 7:40f2b0db16a6 80 led_maintenance.attach( &led_cntl, 0.02 );
okano 7:40f2b0db16a6 81 init_setting();
okano 7:40f2b0db16a6 82 }
okano 7:40f2b0db16a6 83 count = 0;
okano 7:40f2b0db16a6 84
okano 7:40f2b0db16a6 85 if ( peak < in ) {
okano 7:40f2b0db16a6 86 if ( thresold < (in - peak) ) {
okano 7:40f2b0db16a6 87 thresold = in - peak;
okano 7:40f2b0db16a6 88 rtn = 1;
okano 7:40f2b0db16a6 89 }
okano 7:40f2b0db16a6 90 peak = in;
okano 7:40f2b0db16a6 91 }
okano 7:40f2b0db16a6 92 } else {
okano 7:40f2b0db16a6 93 if ( 200 == count ) {
okano 7:40f2b0db16a6 94 led_maintenance.attach( NULL, 0.02 );
okano 7:40f2b0db16a6 95
okano 7:40f2b0db16a6 96 init_setting();
okano 7:40f2b0db16a6 97 led_driver.group_selector( 0x1111, 0x2222, 0x4444, 0x8888 ); // channel assignment for groups
okano 7:40f2b0db16a6 98 led_driver.gradation_setting( 0 ,0xC0 ,0x7 ,0xC4 ,0xFD );
okano 7:40f2b0db16a6 99 led_driver.gradation_setting( 1 ,0xC0 ,0x7 ,0xC4 ,0xFD );
okano 7:40f2b0db16a6 100 led_driver.gradation_setting( 2 ,0xC0 ,0x7 ,0xC4 ,0xFD );
okano 7:40f2b0db16a6 101 led_driver.gradation_setting( 3 ,0xC0 ,0x7 ,0xC4 ,0xFD );
okano 7:40f2b0db16a6 102
okano 7:40f2b0db16a6 103 led_driver.gradation_start( 0, CONTINUOUS );
okano 7:40f2b0db16a6 104
okano 7:40f2b0db16a6 105 } else if ( 300 == count ) {
okano 7:40f2b0db16a6 106 led_driver.gradation_start( 1, CONTINUOUS );
okano 7:40f2b0db16a6 107 } else if ( 400 == count ) {
okano 7:40f2b0db16a6 108 led_driver.gradation_start( 2, CONTINUOUS );
okano 7:40f2b0db16a6 109 } else if ( 500 == count ) {
okano 7:40f2b0db16a6 110 led_driver.gradation_start( 3, CONTINUOUS );
okano 7:40f2b0db16a6 111 }
okano 7:40f2b0db16a6 112 count++;
okano 6:4da1c7f560b8 113 }
okano 6:4da1c7f560b8 114
okano 7:40f2b0db16a6 115 shift = (int)(coef * peak);
okano 7:40f2b0db16a6 116 leds = 0x1 << shift;
okano 7:40f2b0db16a6 117 peak *= 0.97;
okano 7:40f2b0db16a6 118 thresold*= (thresold < 0.07) ? 0.07 : thresold * 0.9;
okano 7:40f2b0db16a6 119 pin =1;
okano 7:40f2b0db16a6 120 aout = peak;
okano 7:40f2b0db16a6 121 return ( rtn );
okano 7:40f2b0db16a6 122 }
okano 7:40f2b0db16a6 123
okano 5:78bfbf11bb2f 124 void ad_cntl()
okano 5:78bfbf11bb2f 125 {
okano 5:78bfbf11bb2f 126 sampling = 1;
okano 5:78bfbf11bb2f 127 }
okano 5:78bfbf11bb2f 128
okano 5:78bfbf11bb2f 129
okano 5:78bfbf11bb2f 130 void led_cntl()
okano 2:8a31696f1da5 131 {
okano 4:75a2c3550bdc 132 static int count = 0;
okano 2:8a31696f1da5 133 static float intensity = 1.0;
okano 2:8a31696f1da5 134
okano 2:8a31696f1da5 135 if ( led_change ) {
okano 4:75a2c3550bdc 136 set_color( count++ & 0x3 );
okano 2:8a31696f1da5 137 led_change = 0;
okano 2:8a31696f1da5 138 intensity = 1.0;
okano 2:8a31696f1da5 139 }
okano 5:78bfbf11bb2f 140
okano 2:8a31696f1da5 141 led_driver.set_all_intensity( (char)(intensity * (float)0xFF) );
okano 5:78bfbf11bb2f 142
okano 2:8a31696f1da5 143 intensity *= 0.90;
okano 2:8a31696f1da5 144 }
okano 2:8a31696f1da5 145
okano 2:8a31696f1da5 146 void set_color( int v )
okano 2:8a31696f1da5 147 {
okano 4:75a2c3550bdc 148 v = 0x1 << v;
okano 2:8a31696f1da5 149 led_driver = (v << 12) | (v << 8) | (v << 4) | v;
okano 2:8a31696f1da5 150 }
okano 2:8a31696f1da5 151
okano 7:40f2b0db16a6 152
okano 7:40f2b0db16a6 153 void init_setting( void )
okano 7:40f2b0db16a6 154 {
okano 7:40f2b0db16a6 155 led_driver = 0xFFFF;
okano 7:40f2b0db16a6 156 led_driver.set_all_intensity( 0xFF );
okano 7:40f2b0db16a6 157 led_driver.set_all_intensity( 0x40, true );
okano 7:40f2b0db16a6 158 led_driver.group_selector( 0x0000, 0x0000, 0x0000, 0x0000 ); // all channels are in normal control
okano 7:40f2b0db16a6 159 }
okano 7:40f2b0db16a6 160