@@ -163,7 +163,7 @@ size_t pwm_pin_index(pin_size_t pinNumber) {
163
163
DT_PHA_BY_IDX(DT_PATH(zephyr_user), p, i, pin)),
164
164
#define ADC_CH_CFG (n,p,i ) arduino_adc[i].channel_cfg,
165
165
166
- const struct adc_dt_spec arduino_adc[] =
166
+ static const struct adc_dt_spec arduino_adc[] =
167
167
{ DT_FOREACH_PROP_ELEM (DT_PATH (zephyr_user), io_channels, ADC_DT_SPEC) };
168
168
169
169
/* io-channel-pins node provides a mapping digital pin numbers to adc channels */
@@ -184,6 +184,28 @@ size_t analog_pin_index(pin_size_t pinNumber) {
184
184
185
185
#endif // CONFIG_ADC
186
186
187
+ #ifdef CONFIG_DAC
188
+
189
+ #if (DT_NODE_HAS_PROP(DT_PATH(zephyr_user), dac))
190
+
191
+ #define DAC_NODE DT_PHANDLE (DT_PATH(zephyr_user), dac)
192
+ #define DAC_RESOLUTION DT_PROP (DT_PATH(zephyr_user), dac_resolution)
193
+ static const struct device *const dac_dev = DEVICE_DT_GET(DAC_NODE);
194
+
195
+ #define DAC_CHANNEL_DEFINE (n, p, i ) \
196
+ { \
197
+ .channel_id = DT_PROP_BY_IDX (n, p, i), \
198
+ .resolution = DAC_RESOLUTION, \
199
+ .buffered = true , \
200
+ },
201
+
202
+ static const struct dac_channel_cfg dac_ch_cfg[] =
203
+ { DT_FOREACH_PROP_ELEM (DT_PATH (zephyr_user), dac_channels, DAC_CHANNEL_DEFINE) };
204
+
205
+ #endif
206
+
207
+ #endif // CONFIG_DAC
208
+
187
209
static unsigned int irq_key;
188
210
static bool interrupts_disabled = false ;
189
211
}
@@ -276,6 +298,16 @@ unsigned long micros(void) {
276
298
277
299
unsigned long millis (void ) { return k_uptime_get_32 (); }
278
300
301
+ #if defined(CONFIG_DAC) || defined(CONFIG_PWM)
302
+ static int _analog_write_resolution = 8 ;
303
+ void analogWriteResolution (int bits) {
304
+ _analog_write_resolution = bits;
305
+ }
306
+ int analogWriteResolution () {
307
+ return _analog_write_resolution;
308
+ }
309
+ #endif
310
+
279
311
#ifdef CONFIG_PWM
280
312
281
313
void analogWrite (pin_size_t pinNumber, int value)
@@ -290,6 +322,8 @@ void analogWrite(pin_size_t pinNumber, int value)
290
322
return ;
291
323
}
292
324
325
+ value = map (value, 0 , 1 << _analog_write_resolution, 0 , arduino_pwm[idx].period );
326
+
293
327
if (((uint32_t )value) > arduino_pwm[idx].period ) {
294
328
value = arduino_pwm[idx].period ;
295
329
} else if (value < 0 ) {
@@ -305,6 +339,21 @@ void analogWrite(pin_size_t pinNumber, int value)
305
339
306
340
#endif
307
341
342
+ #ifdef CONFIG_DAC
343
+ void analogWrite (enum dacPins dacName, int value)
344
+ {
345
+ if (dacName >= NUM_OF_DACS) {
346
+ return ;
347
+ }
348
+
349
+ dac_channel_setup (dac_dev, &dac_ch_cfg[dacName]);
350
+
351
+ const int max_dac_value = 1U << dac_ch_cfg[dacName].resolution ;
352
+ dac_write_value (dac_dev, dac_ch_cfg[dacName].channel_id , map (value, 0 , 1 << _analog_write_resolution, 0 , max_dac_value));
353
+ }
354
+ #endif
355
+
356
+
308
357
#ifdef CONFIG_ADC
309
358
310
359
void analogReference (uint8_t mode)
0 commit comments