Skip to content

Commit 2767bd4

Browse files
committed
0.1.0 AD5660
1 parent 5b034d6 commit 2767bd4

File tree

20 files changed

+1039
-0
lines changed

20 files changed

+1039
-0
lines changed

libraries/AD5660/.arduino-ci.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
platforms:
2+
rpipico:
3+
board: rp2040:rp2040:rpipico
4+
package: rp2040:rp2040
5+
gcc:
6+
features:
7+
defines:
8+
- ARDUINO_ARCH_RP2040
9+
warnings:
10+
flags:
11+
12+
packages:
13+
rp2040:rp2040:
14+
url: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
15+
16+
compile:
17+
# Choosing to run compilation tests on 2 different Arduino platforms
18+
platforms:
19+
- uno
20+
# - due
21+
# - zero
22+
# - leonardo
23+
- m4
24+
- esp32
25+
- esp8266
26+
# - mega2560
27+
- rpipico
28+
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# These are supported funding model platforms
2+
3+
github: RobTillaart
4+
custom: "https://www.paypal.me/robtillaart"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
name: Arduino-lint
2+
3+
on: [push, pull_request]
4+
jobs:
5+
lint:
6+
runs-on: ubuntu-latest
7+
timeout-minutes: 5
8+
steps:
9+
- uses: actions/checkout@v4
10+
- uses: arduino/arduino-lint-action@v1
11+
with:
12+
library-manager: update
13+
compliance: strict
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: Arduino CI
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
runTest:
7+
runs-on: ubuntu-latest
8+
timeout-minutes: 20
9+
10+
steps:
11+
- uses: actions/checkout@v4
12+
- uses: ruby/setup-ruby@v1
13+
with:
14+
ruby-version: 2.6
15+
- run: |
16+
gem install arduino_ci
17+
arduino_ci.rb
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
name: JSON check
2+
3+
on:
4+
push:
5+
paths:
6+
- '**.json'
7+
pull_request:
8+
9+
jobs:
10+
test:
11+
runs-on: ubuntu-latest
12+
timeout-minutes: 5
13+
steps:
14+
- uses: actions/checkout@v4
15+
- name: json-syntax-check
16+
uses: limitusus/json-syntax-check@v2
17+
with:
18+
pattern: "\\.json$"

libraries/AD5660/AD5660.cpp

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
//
2+
// FILE: AD5660.cpp
3+
// AUTHOR: Rob Tillaart
4+
// VERSION: 0.1.0
5+
// DATE: 2024-10-25
6+
// PURPOSE: Arduino library for AD5660 Digital Analog Convertor (16 bit).
7+
8+
9+
#include "AD5660.h"
10+
11+
12+
// HARDWARE SPI
13+
AD5660::AD5660(uint8_t slaveSelect, __SPI_CLASS__ * mySPI)
14+
{
15+
_select = slaveSelect;
16+
_hwSPI = true;
17+
_mySPI = mySPI;
18+
_value = 0;
19+
_type = 16;
20+
_maxValue = 65535;
21+
_powerMode = 0;
22+
}
23+
24+
// SOFTWARE SPI
25+
AD5660::AD5660(uint8_t slaveSelect, uint8_t spiData, uint8_t spiClock)
26+
{
27+
_select = slaveSelect;
28+
_hwSPI = false;
29+
_mySPI = NULL;
30+
_dataOut = spiData;
31+
_clock = spiClock;
32+
_value = 0;
33+
_type = 16;
34+
_maxValue = 65535;
35+
_powerMode = 0;
36+
}
37+
38+
39+
// initializes the SPI
40+
// and sets internal state
41+
void AD5660::begin()
42+
{
43+
pinMode(_select, OUTPUT);
44+
digitalWrite(_select, HIGH);
45+
46+
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE0);
47+
48+
if (_hwSPI)
49+
{
50+
// _mySPI->end();
51+
// _mySPI->begin();
52+
// delay(1);
53+
}
54+
else // SOFTWARE SPI
55+
{
56+
pinMode(_dataOut, OUTPUT);
57+
pinMode(_clock, OUTPUT);
58+
digitalWrite(_dataOut, LOW);
59+
digitalWrite(_clock, LOW);
60+
}
61+
}
62+
63+
64+
uint8_t AD5660::getType()
65+
{
66+
return _type;
67+
}
68+
69+
70+
//
71+
// SET VALUE
72+
//
73+
bool AD5660::setValue(uint16_t value)
74+
{
75+
// range check not needed.
76+
// if (value > _maxValue) return false;
77+
_value = value;
78+
// prepare 12 bit transfer.
79+
uint32_t data = value;
80+
// set powerMode bits if not 0.
81+
if (_powerMode) data |= (((uint32_t)_powerMode) << 16);
82+
updateDevice(data);
83+
return true;
84+
}
85+
86+
87+
uint16_t AD5660::getValue()
88+
{
89+
return _value;
90+
}
91+
92+
93+
uint16_t AD5660::getMaxValue()
94+
{
95+
return _maxValue;
96+
}
97+
98+
99+
bool AD5660::setPercentage(float percentage)
100+
{
101+
// range check
102+
if ((percentage < 0) || (percentage > 100)) return false;
103+
104+
uint32_t value = round(655.35 * percentage);
105+
return setValue(value);
106+
}
107+
108+
109+
float AD5660::getPercentage()
110+
{
111+
float value = getValue();
112+
if (value > 0)
113+
{
114+
return value * ( 1.0 / 655.35);
115+
}
116+
return 0;
117+
}
118+
119+
120+
//
121+
// POWER DOWN
122+
//
123+
bool AD5660::setPowerDownMode(uint8_t mode)
124+
{
125+
// range check
126+
if (mode > 3) return false;
127+
_powerMode = mode;
128+
return true;
129+
}
130+
131+
132+
uint8_t AD5660::getPowerDownMode()
133+
{
134+
return _powerMode;
135+
}
136+
137+
138+
//
139+
// SPI
140+
//
141+
void AD5660::setSPIspeed(uint32_t speed)
142+
{
143+
_SPIspeed = speed;
144+
_spi_settings = SPISettings(_SPIspeed, MSBFIRST, SPI_MODE0);
145+
};
146+
147+
148+
uint32_t AD5660::getSPIspeed()
149+
{
150+
return _SPIspeed;
151+
}
152+
153+
154+
bool AD5660::usesHWSPI()
155+
{
156+
return _hwSPI;
157+
}
158+
159+
160+
//////////////////////////////////////////////////////////////////
161+
//
162+
// PROTECTED
163+
//
164+
165+
void AD5660::updateDevice(uint32_t data)
166+
{
167+
digitalWrite(_select, LOW);
168+
if (_hwSPI)
169+
{
170+
_mySPI->beginTransaction(_spi_settings);
171+
_mySPI->transfer((data >> 16) & 0xFF);
172+
_mySPI->transfer((data >> 8) & 0xFF);
173+
_mySPI->transfer(data & 0xFF);
174+
_mySPI->endTransaction();
175+
}
176+
else // Software SPI
177+
{
178+
swSPI_transfer(data);
179+
}
180+
digitalWrite(_select, HIGH);
181+
}
182+
183+
184+
// simple one mode version
185+
void AD5660::swSPI_transfer(uint32_t value)
186+
{
187+
uint8_t clk = _clock;
188+
uint8_t dao = _dataOut;
189+
// 24 bit
190+
for (uint16_t mask = 0x800000; mask; mask >>= 1)
191+
{
192+
digitalWrite(dao,(value & mask));
193+
digitalWrite(clk, HIGH);
194+
digitalWrite(clk, LOW);
195+
}
196+
}
197+
198+
199+
// -- END OF FILE --
200+

libraries/AD5660/AD5660.h

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#pragma once
2+
//
3+
// FILE: AD5660.h
4+
// AUTHOR: Rob Tillaart
5+
// VERSION: 0.1.0
6+
// DATE: 2024-10-29
7+
// PURPOSE: Arduino library for AD5660 Digital Analog Convertor (16 bit).
8+
9+
10+
#include "Arduino.h"
11+
#include "SPI.h"
12+
13+
#define AD5660_LIB_VERSION (F("0.1.0"))
14+
15+
#ifndef __SPI_CLASS__
16+
// MBED must be tested before RP2040
17+
#if defined(ARDUINO_ARCH_MBED)
18+
#define __SPI_CLASS__ SPIClass
19+
#elif defined(ARDUINO_ARCH_RP2040)
20+
#define __SPI_CLASS__ SPIClassRP2040
21+
#else
22+
#define __SPI_CLASS__ SPIClass
23+
#endif
24+
#endif
25+
26+
27+
class AD5660
28+
{
29+
public:
30+
// HARDWARE SPI
31+
AD5660(uint8_t slaveSelect, __SPI_CLASS__ * mySPI = &SPI);
32+
// SOFTWARE SPI
33+
AD5660(uint8_t slaveSelect, uint8_t spiData, uint8_t spiClock);
34+
35+
void begin();
36+
uint8_t getType();
37+
38+
// SET DAC
39+
// sets output immediately = prepare + update.
40+
bool setValue(uint16_t value = 0);
41+
uint16_t getValue();
42+
uint16_t getMaxValue();
43+
bool setPercentage(float percentage);
44+
float getPercentage();
45+
46+
// POWER DOWN
47+
bool setPowerDownMode(uint8_t mode);
48+
uint8_t getPowerDownMode();
49+
50+
// SPI
51+
// speed in Hz
52+
void setSPIspeed(uint32_t speed);
53+
uint32_t getSPIspeed();
54+
bool usesHWSPI();
55+
56+
57+
protected:
58+
uint8_t _type; // #bits
59+
uint16_t _maxValue;
60+
uint8_t _dataOut = 255;
61+
uint8_t _clock = 255;
62+
uint8_t _select = 255;
63+
64+
uint16_t _value = 0;
65+
// power down mode P19.
66+
uint8_t _powerMode = 0;
67+
68+
bool _hwSPI = false;
69+
uint32_t _SPIspeed = 16000000;
70+
71+
void updateDevice(uint32_t data);
72+
void swSPI_transfer(uint32_t data);
73+
74+
__SPI_CLASS__ * _mySPI;
75+
SPISettings _spi_settings;
76+
};
77+
78+
79+
// -- END OF FILE --

libraries/AD5660/CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Change Log AD5620
2+
3+
All notable changes to this project will be documented in this file.
4+
5+
The format is based on [Keep a Changelog](http://keepachangelog.com/)
6+
and this project adheres to [Semantic Versioning](http://semver.org/).
7+
8+
9+
## [0.1.0] - 2024-10-29
10+
- initial version, based upon AD5620
11+

0 commit comments

Comments
 (0)