LEDDriver_NXP_Arduino 0.5.4
LED driver device operation sample code for Arduino
Loading...
Searching...
No Matches
GradationControl.cpp
1#include <GradationControl.h>
2
3GradationControl::GradationControl( PCA995x* dev_ptr, int group_num, uint32_t bitmap ) :
4 devp( dev_ptr ), group( group_num )
5{
8}
9
11{
12}
13
14float GradationControl::set_gradation( float max_iref, float time, bool up, bool down, float on, float off, bool hold_on, bool hold_off )
15{
16 int iref;
17 float step_duration;
18 float cycle_time;
19 int cycle_time_i = 0;
20 int multi_fctr = 1;
21 int iref_inc = 1;
22 int on_i = 7;
23 int off_i = 7;
24 float ramp_time;
25 uint8_t reg[ 4 ];
26
27 iref = (int)(max_iref * 255.0);
28 time *= 1000.0;
29
30 if ( 0.0 < time ) {
31 step_duration = time / iref;
32
33 if ( 32 < step_duration ) {
34 cycle_time = 8.0;
35 cycle_time_i = 1;
36 }
37 else {
38 cycle_time = 0.5;
39 cycle_time_i = 0;
40 }
41
42 multi_fctr = (int)(step_duration / cycle_time);
43 multi_fctr = (multi_fctr < 1) ? 1 : multi_fctr;
44 multi_fctr = (64 < multi_fctr) ? 64 : multi_fctr;
45
46 if ( multi_fctr == 1 )
47 iref_inc = (int)( iref / (time / cycle_time) );
48 }
49 else {
50 cycle_time = 0;
51 }
52
53 for ( int i = 0; i < 7; i++ ) {
54 if ( on < HOLDTIME[ i + 1 ] ) {
55 on = HOLDTIME[ i ];
56 on_i = i;
57 break;
58 }
59 }
60
61 for ( int i = 0; i < 7; i++ ) {
62 if ( off < HOLDTIME[ i + 1 ] ) {
63 off = HOLDTIME[ i ];
64 off_i = i;
65 break;
66 }
67 }
68
69 reg[ 0 ] = (up << 7) | (down << 6) | (iref_inc - 1); // for RAMP_RATE_GRPn
70 reg[ 1 ] = ( cycle_time_i << 6 ) | (multi_fctr - 1); // for STEP_TIME_GRPn
71 reg[ 2 ] = (hold_on << 7) | (hold_off << 6) | ( on_i << 3) | off_i; // for HOLD_CNTL_GRPn
72 reg[ 3 ] = iref; // for IREF_GRPn
73
74 devp->reg_access( devp->arp[ SETTING ] + group * 4, reg, sizeof( reg ) );
75
76 ramp_time = ((multi_fctr * cycle_time) * (iref / iref_inc)) / 1000;
77
78 cycle_time = on + off;
79 cycle_time += up ? ramp_time : 0;
80 cycle_time += down ? ramp_time : 0;
81
82 cycle = cycle_time;
83
84 return cycle;
85}
86
88{
89 const int n_reg = devp->n_channel / 8;
90 uint8_t reg[ n_reg ];
91
92 devp->reg_access_r( devp->arp[ MODE ], reg, sizeof( reg ) );
93
94 for ( int i = 0; i < n_reg; i++ ) {
95 reg[ i ] |= (uint8_t)(bitmap >> (i * 8));
96 }
97
98 devp->reg_access( devp->arp[ MODE ], reg, sizeof( reg ) );
99}
100
102{
103 const int grp_shift = (devp->arp[ N_GROUP ] == 4) ? 2 : 4;
104 const int n_reg = devp->n_channel / (8 / grp_shift);
105 uint8_t bits = (grp_shift == 2) ? 0x3 : 0x0F;
106 uint8_t reg[ n_reg ];
107 int r_index;
108 int s_index;
109
110 devp->reg_access_r( devp->arp[ GROUP ], reg, sizeof( reg ) );
111
112 for ( int i = 0; i < devp->n_channel; i++ ) {
113 if ( (bitmap >> i) & 0x1 ) {
114 r_index = i / (8 / grp_shift);
115 s_index = (i * grp_shift) % 8;
116
117 reg[ r_index ] = ~(bits << s_index) & reg[ r_index ];
118 reg[ r_index ] |= group << s_index;
119 }
120 }
121
122 devp->reg_access( devp->arp[ GROUP ], reg, sizeof( reg ) );
123}
124
126{
127 const int grp_shift = (devp->arp[ N_GROUP ] == 4) ? 2 : 4;
128 uint8_t bits = (grp_shift == 2) ? 0x3 : 0x0F;
129 uint8_t v;
130 int r_index;
131 int s_index;
132
133
134 r_index = ch / (8 / grp_shift);
135 s_index = (ch * grp_shift) % 8;
136
137 v = devp->reg_access( devp->arp[ GROUP ] + r_index );
138
139 v = ~(bits << s_index) & v;
140 v |= group << s_index;
141
142 devp->reg_access( devp->arp[ GROUP ] + r_index, v );
143
144 const int n_reg = ch / 8;
145
146 v = devp->reg_access( devp->arp[ MODE ] + n_reg );
147
148 v |= (uint8_t)(0x1 << (ch % 8));
149
150 devp->reg_access( devp->arp[ MODE ] + n_reg, v );
151}
152
153
155{
156 int r_index;
157 int s_index;
158 uint8_t reg;
159
160 r_index = group / 4;
161 s_index = (group * 2) % 8 + (r_index ? 4 : 0);
162
163
164 reg = devp->reg_access( devp->arp[ CNTL ] + r_index );
165 reg &= ~(0x03 << s_index);
166 reg |= ctrl << s_index;
167
168 devp->reg_access( devp->arp[ CNTL ] + r_index, reg );
169}
170void GradationControl::start( bool continuous )
171{
172 control( ONE_SHOT | continuous );
173}
174
176{
177 control( STOP );
178}
179
180
181const float GradationControl::HOLDTIME[] = { 0, 0.25, 0.50, 0.75, 1, 2, 4, 6, };
182
void start(bool continuous=true)
void gradation_channel_enable(uint32_t bitmap)
GradationControl(PCA995x *devp, int num_group, uint32_t bitmap=0x0000)
void gradation_group_assign(uint32_t bitmap)
void add_channel(uint8_t ch)
float set_gradation(float max_iref, float time, bool up=true, bool down=true, float on=0.0, float off=0.0, bool hold_on=true, bool hold_off=true)