LEDDriver_NXP_Arduino
1.0.3
LED driver device operation sample code for Arduino
Toggle main menu visibility
Loading...
Searching...
No Matches
src
GradationControl.cpp
1
#include <GradationControl.h>
2
3
GradationControl::GradationControl
(
PCA995x
* dev_ptr,
int
group_num, uint32_t bitmap ) :
4
devp( dev_ptr ), group( group_num )
5
{
6
gradation_group_assign
( bitmap );
7
gradation_channel_enable
( bitmap );
8
}
9
10
GradationControl::~GradationControl
()
11
{
12
}
13
14
float
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
87
void
GradationControl::gradation_channel_enable
( uint32_t bitmap )
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
101
void
GradationControl::gradation_group_assign
( uint32_t bitmap )
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
125
void
GradationControl::add_channel
( uint8_t ch )
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
154
void
GradationControl::control
(
int
ctrl )
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
}
170
void
GradationControl::start
(
bool
continuous )
171
{
172
control
( ONE_SHOT | continuous );
173
}
174
175
void
GradationControl::stop
(
void
)
176
{
177
control
( STOP );
178
}
179
180
181
const
float
GradationControl::HOLDTIME[] = { 0, 0.25, 0.50, 0.75, 1, 2, 4, 6, };
182
GradationControl::start
void start(bool continuous=true)
Definition
GradationControl.cpp:170
GradationControl::stop
void stop(void)
Definition
GradationControl.cpp:175
GradationControl::gradation_channel_enable
void gradation_channel_enable(uint32_t bitmap)
Definition
GradationControl.cpp:87
GradationControl::GradationControl
GradationControl(PCA995x *devp, int num_group, uint32_t bitmap=0x0000)
Definition
GradationControl.cpp:3
GradationControl::gradation_group_assign
void gradation_group_assign(uint32_t bitmap)
Definition
GradationControl.cpp:101
GradationControl::~GradationControl
virtual ~GradationControl()
Definition
GradationControl.cpp:10
GradationControl::cycle
float cycle
Definition
GradationControl.h:34
GradationControl::add_channel
void add_channel(uint8_t ch)
Definition
GradationControl.cpp:125
GradationControl::control
control
Definition
GradationControl.h:26
GradationControl::set_gradation
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)
Definition
GradationControl.cpp:14
PCA995x
Definition
LEDDriver.h:94
Generated by
1.17.0