rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
dac.cpp
Go to the documentation of this file.
1#include "dac.h"
2
3#include <rusefi/rusefi_math.h>
4
5#if EFI_DAC
6
7static DACConfig dacConfig = {
8 .init = 4095U, /* full VCC */
9 .datamode = DAC_DHRM_12BIT_RIGHT,
10 .cr = 0
11};
12
13Dac::Dac(DACDriver& driver)
14 : m_driver(&driver)
15{
16}
17
18void Dac::Start(DACConfig& p_config)
19{
20 dacStart(m_driver, &p_config);
21}
22
23void Dac::SetVoltage(int channel, float voltage) {
24 voltage = clampF(0, voltage, engineConfiguration->adcVcc);
25 m_voltageFloat[channel] = voltage;
26
27 dacPutChannelX(m_driver, channel, voltage / engineConfiguration->adcVcc * ((1 << 12) - 1));
28}
29
31{
32 return m_voltageFloat[channel];
33}
34
35static Dac dacs[] {
36 /** ChibiOS magic: if not dual mode DAC1 CH1 driver identifier.*/
37 Dac(DACD1),
38 /** ChibiOS magic: if not dual mode DAC1 CH2 driver identifier.*/
39 Dac(DACD2)
40};
41
42void initDac() {
43 bool dacIsUsed = false;
44 for (size_t i = 0;i<DAC_OUTPUT_COUNT;i++) {
46 if (isBrainPinValid(pin)) {
47 // setting up the output pin as analog as suggested by the Reference Manual.
48 efiSetPadMode("dac", pin, PAL_MODE_INPUT_ANALOG);
49 dacIsUsed = true;
50 }
51 }
52 if (dacIsUsed) {
53 // DAC peripheral changes associated pin behaviour regardless of actual pin mode
56 }
57}
58
59void setDacVoltage(int channel, float voltage) {
60 dacs[channel].SetVoltage(0, voltage);
61}
62
63#endif // EFI_DAC
uint16_t channel
Definition adc_inputs.h:104
void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode)
Definition dac.h:12
float GetLastVoltage(int channel)
Definition dac.cpp:30
void SetVoltage(int channel, float volage)
Definition dac.cpp:23
DACDriver *const m_driver
Definition dac.h:21
Dac(DACDriver &driver)
Definition dac.cpp:13
float m_voltageFloat[2]
Definition dac.h:22
void Start(DACConfig &config)
Definition dac.cpp:18
static DACConfig dacConfig
Definition dac.cpp:7
static Dac dacs[]
Definition dac.cpp:35
void initDac()
Definition dac.cpp:42
void setDacVoltage(int channel, float voltage)
Definition dac.cpp:59
static constexpr engine_configuration_s * engineConfiguration
bool isBrainPinValid(brain_pin_e brainPin)
brain_pin_e pin
Definition stm32_adc.cpp:15