16-channel Fm+ I2C-bus 57 mA/20 V constant current LED driver
Dependencies: mbed
PCA9955A.cpp
00001 #include "mbed.h" 00002 #include "PCA9955A.h" 00003 00004 I2C i2c(p28,p27); // sda, scl 00005 Serial pc(USBTX, USBRX); // tx, rx 00006 char cmd[32]; 00007 int i, j, k; 00008 int sw; 00009 00010 void set_ch(char sel) 00011 { // PCA9541のサンプル 00012 // MST_0側の自分にスレーブ側の制御権を得る場合 00013 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg 00014 i2c.write( 0xe2, cmd, 1); // Cont Regを指定 00015 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み 00016 wait(0.1); // 0.1s待つ 00017 switch(cmd[0] & 0xf) 00018 { 00019 case 0: // bus off, has control 00020 case 1: // bus off, no control 00021 case 5: // bus on, no control 00022 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg 00023 cmd[1] = 4; // bus on, has control 00024 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み 00025 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み 00026 break; 00027 case 2: // bus off, no control 00028 case 3: // bus off, has control 00029 case 6: // bus on, no control 00030 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg 00031 cmd[1] = 5; // bus on, has control 00032 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み 00033 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み 00034 break; 00035 case 9: // bus on, no control 00036 case 0xc: // bus on, no control 00037 case 0xd: // bus off, no control 00038 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg 00039 cmd[1] = 0; // bus on, has control 00040 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み 00041 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み 00042 break; 00043 case 0xa: // bus on, no control 00044 case 0xe: // bus off, no control 00045 case 0xf: // bus on, has control 00046 cmd[0] = 1; // PCA9541 コマンドコード Cont Reg 00047 cmd[1] = 1; // bus on, has control 00048 i2c.write( 0xe2, cmd, 2); // Cont Regにcmd[1]を書込み 00049 i2c.read( 0xe2, cmd, 1); // Cont Regを読込み 00050 break; 00051 default: 00052 break; 00053 } 00054 00055 cmd[0] = sel; // PCA9546 Cont Reg sel channel enabled 00056 i2c.write( 0xe8, cmd, 1); // Send command string 00057 } 00058 00059 int main () 00060 { 00061 i2c.frequency(100000); 00062 pc.printf("PCA9955A Sample Program\r\n"); 00063 00064 set_ch(1); // PCA9955Aはch0に接続 00065 00066 // PCA9955A 00067 while(1) 00068 { 00069 pc.printf("シーケンシャル … 1, グラデーション … 2 ? \r\n"); 00070 pc.scanf("%d", &sw); 00071 pc.printf("%d\r\n", sw); 00072 switch (sw) 00073 { 00074 case 1: 00075 pc.printf("シーケンシャル Sample Start\r\n"); 00076 00077 cmd[0] = MODE1; 00078 cmd[1] = 0x0; // SLEEP = 0 00079 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00080 00081 cmd[0] = LEDOUT0 + 0x80; // LEDOUT0, Auto incriment 00082 cmd[1] = 0xaa; // LED3,2,1,0 10= PWM 00083 cmd[2] = 0xaa; // LED7,6,5,4 10= PWM 00084 cmd[3] = 0xaa; // LED11,10,9,8 10= PWM 00085 cmd[4] = 0xaa; // LED15,14,13,12 10= PWM 00086 i2c.write(PCA9955A_ADDR, cmd, 5); // cmd[0]Regにcmd[1-4]を書込み 00087 00088 cmd[0] = IREF0 + 0x80; // IREF0, Auto incriment 00089 for(i=0; i<16; i++) cmd[i+1] = 0x80; // all IREF = 50% 00090 i2c.write(PCA9955A_ADDR, cmd, 17); // cmd[0]Regにcmd[1-16]を書込み 00091 00092 for(k=0; k<3; k++) // 3回繰返す 00093 { 00094 for(i=0; i<16; i++) // チャネル0~15まで一つずつ点灯 00095 { 00096 cmd[0] = PWM0 + 0x80; // PWM0, Auto incriment 00097 for(j=0; j<16; j++) cmd[j+1] = 0x0; // all LED PWM = 0% 00098 cmd[i+1] = 0xff; // iチャネルのLED PWM = 99.6% 00099 i2c.write(PCA9955A_ADDR, cmd, 17); // cmd[0]Regにcmd[1-16]を書込み 00100 wait(0.5); 00101 } 00102 } 00103 pc.printf("シーケンシャル Sample End\r\n"); 00104 break; 00105 case 2: 00106 pc.printf("グラデーション Sample Start\r\n"); 00107 00108 cmd[0] = MODE1; 00109 cmd[1] = 0x0; // SLEEP = 0 00110 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00111 00112 cmd[0] = LEDOUT0 + 0x80; // LEDOUT0, Auto incriment 00113 cmd[1] = 0x55; // LED3,2,1,0 01= ON 00114 cmd[2] = 0x05; // LED7,6 00= OFF LED5,4 01= ON 00115 cmd[3] = 0x00; // LED11,10,9,8 00= OFF 00116 cmd[4] = 0x00; // LED15,14,13,12 00= OFF 00117 i2c.write(PCA9955A_ADDR, cmd, 5); // cmd[0]Regにcmd[1-4]を書込み 00118 00119 /* cmd[0] = PWMALL; 00120 cmd[1] = 0xFF; // PWM = 99.6% 00121 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00122 */ 00123 cmd[0] = GRAD_GRP_SEL1; 00124 cmd[1] = 0x50; // LED3, 4 = GRP0 00125 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00126 00127 cmd[0] = IREFALL; // 00128 cmd[1] = 0x1; // あとでIREF_GRP0で設定するので1以上であればよい 00129 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00130 /* cmd[0] = IREF4; // 00131 cmd[1] = 0x1; // Idrv = 240 * 40uA(Rext = 5.6k)=9.6mA 00132 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00133 */ 00134 cmd[0] = GRAD_MODE_SEL0; 00135 cmd[1] = 0x31; // LED0, 4, 5 = Gradation 00136 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00137 00138 cmd[0] = GRAD_GRP_SEL0; 00139 cmd[1] = 0x0; // LED0, 1, 2, 3 = GRP0 00140 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00141 00142 00143 cmd[0] = IREF_GRP0; 00144 cmd[1] = 0xF0; // Idrv = 240 * 40uA(Rext = 5.6k)=9.6mA 00145 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00146 00147 cmd[0] = STEP_TIME_GRP0; 00148 cmd[1] = 0x3F; // 0.5ms * 64 = 32ms 00149 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00150 00151 cmd[0] = RAMP_RATE_GRP0; 00152 cmd[1] = 0xc0 + 0x31; // Ramp up/down ON, Ramp rate = 50 00153 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00154 00155 cmd[0] = HOLD_CNTL_GRP0; 00156 cmd[1] = 0xc0 + (0x1 << 3) + 0x2; // Hold ON/OFF ON, ON = 0.25s, OFF = 0.5s 00157 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00158 00159 cmd[0] = GRAD_CNTL; 00160 cmd[1] = 0x3; // Gradation ON, Continuous 00161 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00162 00163 wait(15); // 15s 待つ 00164 00165 cmd[0] = GRAD_CNTL; 00166 cmd[1] = 0x0; // Gradation OFF 00167 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00168 00169 cmd[0] = GRAD_MODE_SEL0; 00170 cmd[1] = 0x0; // LED0, 4, 5 = Normal 00171 i2c.write(PCA9955A_ADDR, cmd, 2); // cmd[0]Regにcmd[1]を書込み 00172 00173 pc.printf("グラデーション Sample End\r\n"); 00174 break; 00175 default: 00176 break; 00177 } 00178 } 00179 } 00180
Generated on Sun Jul 24 2022 06:37:51 by 1.7.2