NV40/3(CLE)
This page covers the currently supported NV-series amplifiers and their psj-lib integration.
Overview
NV series support follows the same three-layer architecture as other devices:
NVFamilyDevice
├── Global capabilities (display, knob)
└── NVFamilyChannel / derived channel types
└── Channel capabilities (setpoint, position, status, monitor output, ...)
Shared behavior is implemented in NVFamilyDevice and NVFamilyChannel,
while model-specific classes define channel count and available closed-loop features.
Device Variants
Open-loop variants
NV403Device(three channels)
Closed-loop variants
NV403CLEDevice(three channels)
Device Capabilities
NV devices provide global (device-level) capabilities that are not tied to a specific channel:
User Interface
Display: Front-panel brightness control
Knob Configuration: Encoder mode, timing, acceleration, and step behavior
Multi-Channel Coordination
Multi Setpoint: Set all channel setpoints in one command (NV40/3 variants)
Multi Position: Read all channel positions in one command (NV40/3 variants)
Channel Capabilities
Each NV channel provides a set of capabilities for command/control and diagnostics:
Status and Monitoring
Status Register: NV-specific fault and actuator state flags
Position: Actual position readback (voltage for open-loop, sensor readback for closed-loop devices)
Open-Loop Control
Setpoint: Open-loop/closed-loop target setting
Open-Loop Unit: Unit readback for open-loop operation
Open-Loop Limits: Lower and upper admissible range
Signal Routing
Modulation Source: Select control source (encoder/analog or serial)
Monitor Output: Route internal signals to analog monitor output
Closed-Loop Additions (CLE Variants)
Closed-Loop Controller: Enable/disable closed-loop feedback
Closed-Loop Unit: Unit readback for closed-loop operation
Closed-Loop Limits: Lower and upper admissible range
Accessing Capabilities
All capabilities are accessed as device or channel attributes. The NV family provides both standard piezo capabilities and device-specific implementations.
from psj_lib import NV403CLEDevice, TransportType
device = NV403CLEDevice(TransportType.SERIAL, "COM10")
async with device:
channel = device.channels[0]
# Device-level capability
await device.display.set(brightness=40.0)
# Access channel capabilities
status = await channel.status.get()
position = await channel.position.get()
await channel.setpoint.set(25.0)
Device Capabilities Reference
All NV-family device capabilities with API references:
Property |
API Reference |
Description |
|---|---|---|
|
Device display brightness control |
|
|
Encoder knob configuration |
|
|
Set all channel setpoints synchronously (NV40/3 and NV40/3CLE) |
|
|
Read all channel positions synchronously (NV40/3 and NV40/3CLE) |
Channel Capabilities Reference
All NV-family channel capabilities with API references:
Note
Some capability readbacks (e.g. setpoint) are cached by the library, as NV devices do not provide native readback for these values. Cached values are updated on set operations.
Property |
API Reference |
Description |
|---|---|---|
|
Target open-loop/closed-loop setpoint
Cached readback |
|
|
Actual channel position readback |
|
|
Modulation source selection (expects
NVModulationSourceTypes enum)Cached readback |
|
|
Analog monitor output routing (expects
NVMonitorOutputSource enum)Cached readback |
|
|
Unit of the open-loop command domain |
|
|
Open-loop lower and upper limits |
|
|
Status access using |
|
|
Closed-loop feedback control enable/disable (CLE variants only) |
|
|
Unit of the closed-loop command domain (CLE variants only) |
|
|
Closed-loop lower and upper limits (CLE variants only) |
Usage Example
import asyncio
from psj_lib import NV403CLEDevice, TransportType
async def main():
device = NV403CLEDevice(TransportType.SERIAL, "COM10")
async with device:
await device.display.set(brightness=50.0)
ch0 = device.channels[0]
await ch0.closed_loop_controller.set(enabled=True)
await ch0.setpoint.set(25.0)
print(await ch0.position.get())
await device.multi_setpoint.set([10.0, 20.0, 30.0])
print(await device.multi_position.get())
asyncio.run(main())