Skip to content

Commit c22741d

Browse files
committed
Add: Lsm6dsv16x high end smartphone IMU with qvar support.
1 parent 561da36 commit c22741d

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

edg/parts/Lsm6dsv16x.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from ..abstract_parts import *
2+
from .JlcPart import JlcPart
3+
4+
5+
class Lsm6dsv16x_Device(InternalSubcircuit, FootprintBlock, JlcPart):
6+
def __init__(self) -> None:
7+
super().__init__()
8+
self.vdd = self.Port(VoltageSink(
9+
voltage_limits=(1.71, 3.6)*Volt,
10+
current_draw=(4*uAmp, 0.65*mAmp) # Values for low-power and high-performance modes
11+
))
12+
self.vddio = self.Port(VoltageSink(
13+
voltage_limits=(1.08, 3.6) *Volt # Extended range
14+
))
15+
self.gnd = self.Port(Ground())
16+
17+
dio_model = DigitalBidir.from_supply(
18+
self.gnd, self.vddio,
19+
voltage_limit_abs=(-0.3*Volt, self.vddio.voltage_limits.upper()+0.3),
20+
# datasheet states abs volt to be [0.3, VDD_IO+0.3], likely a typo
21+
current_limits=(-4, 4)*mAmp,
22+
input_threshold_factor=(0.3, 0.7)
23+
)
24+
self.i2c = self.Port(I2cTarget(dio_model))
25+
26+
dout_model = DigitalSource.low_from_supply(self.gnd)
27+
self.int1 = self.Port(dout_model, optional=True)
28+
self.int2 = self.Port(dout_model, optional=True)
29+
30+
qvar_model = DigitalSink(voltage_limits=(-0.46, 0.46)*Volt,
31+
current_draw=(2.6, 15)*uAmp)
32+
self.qvar1 = self.Port(qvar_model, optional=True)
33+
self.qvar2 = self.Port(qvar_model, optional=True)
34+
35+
def contents(self) -> None:
36+
self.footprint(
37+
'U', 'Package_LGA:Bosch_LGA-14_3x2.5mm_P0.5mm',
38+
{
39+
'1': self.gnd, # sa0
40+
'2': self.qvar1, # not used in mode 1
41+
'3': self.qvar2, # not used in mode 1
42+
'4': self.int1,
43+
'5': self.vddio,
44+
'6': self.gnd,
45+
'7': self.gnd,
46+
'8': self.vdd,
47+
'9': self.int2,
48+
# '10': self.nc, # leave unconnected
49+
# '11': self.nc, # leave unconnected
50+
'12': self.vddio, # cs pin
51+
'13': self.i2c.scl,
52+
'14': self.i2c.sda,
53+
},
54+
mfr='STMicroelectronics', part='LSM6DSV16X',
55+
datasheet='https://www.st.com/resource/en/datasheet/lsm6dsv16x.pdf'
56+
)
57+
self.assign(self.lcsc_part, 'C5267406')
58+
self.assign(self.actual_basic_part, False)
59+
60+
class Lsm6dsv16x(Accelerometer, Gyroscope, DefaultExportBlock):
61+
"""Integrated High-edn smartphone 3d accelerometer (ranging over +/- 2/4/8/16 g) and 3d gyroscope
62+
(ranging over +/- 125/250/500/1000/2000 dps). Onboard sensor fusion for quaternion calculation.
63+
Supports external qvar for tap detections, etc."""
64+
def __init__(self):
65+
super().__init__()
66+
self.ic = self.Block(Lsm6dsv16x_Device())
67+
self.gnd = self.Export(self.ic.gnd, [Common])
68+
self.pwr = self.Export(self.ic.vdd, [Power])
69+
self.pwr_io = self.Export(self.ic.vddio, default=self.pwr, doc="IO supply voltage")
70+
71+
self.i2c = self.Export(self.ic.i2c)
72+
self.int1 = self.Export(self.ic.int1, optional=True, doc="Programmable interrupt")
73+
self.int2 = self.Export(self.ic.int2, optional=True, doc="Programmable interrupt")
74+
75+
self.qvar1 = self.Export(self.ic.qvar1, optional=True, doc="qvar input pin 1")
76+
self.qvar2 = self.Export(self.ic.qvar2, optional=True, doc="qvar input pin 2")
77+
78+
def contents(self):
79+
super().contents()
80+
self.vdd_cap = self.Block(DecouplingCapacitor(100*nFarad(tol=0.2))).connected(self.gnd, self.ic.vdd)
81+
self.vddio_cap = self.Block(DecouplingCapacitor(100*nFarad(tol=0.2))).connected(self.gnd, self.ic.vddio)
82+

edg/parts/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@
159159
from .StepperDriver_A4988 import A4988, PololuA4988
160160

161161
from .Imu_Lsm6ds3trc import Lsm6ds3trc
162+
from .Lsm6dsv16x import Lsm6dsv16x
162163
from .Mag_Qmc5883l import Qmc5883l
163164
from .EnvironmentalSensor_Sensirion import Shtc3
164165
from .EnvironmentalSensor_Bme680 import Bme680

0 commit comments

Comments
 (0)