You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.7 KiB
112 lines
2.7 KiB
6 years ago
|
//
|
||
|
// Created by MightyPork on 2018/02/03.
|
||
|
//
|
||
|
|
||
|
#ifndef GEX_F072_DAC_INTERNAL_H
|
||
|
#define GEX_F072_DAC_INTERNAL_H
|
||
|
|
||
|
#ifndef DAC_INTERNAL
|
||
|
#error bad include!
|
||
|
#endif
|
||
|
|
||
|
#include "unit_base.h"
|
||
|
|
||
|
enum UDAC_Noise {
|
||
|
NOISE_NONE = 0b00, // 0
|
||
|
NOISE_WHITE = 0b01, // 1
|
||
|
NOISE_TRIANGLE = 0b10, // 2
|
||
|
};
|
||
|
|
||
|
enum UDAC_Waveform {
|
||
|
UDAC_WAVE_DC,
|
||
|
UDAC_WAVE_SINE,
|
||
|
UDAC_WAVE_TRIANGLE,
|
||
|
UDAC_WAVE_SAWTOOTH_UP,
|
||
|
UDAC_WAVE_SAWTOOTH_DOWN,
|
||
|
UDAC_WAVE_RECTANGLE,
|
||
|
};
|
||
|
|
||
|
struct udac_channel_cfg {
|
||
|
bool enable;
|
||
|
bool buffered;
|
||
|
enum UDAC_Noise noise_type;
|
||
|
uint8_t noise_level; // 0-11
|
||
|
};
|
||
|
|
||
|
// 0 - 1 MHz, 2-500k, 4-250k, 8-125k
|
||
|
#define UDAC_TIM_FREQ_DIVIDER 8
|
||
|
|
||
|
#define UDAC_INDEX_WIDTH 13 // corresponds to 8192 places
|
||
|
#define UDAC_INDEX_SHIFT (32 - UDAC_INDEX_WIDTH)
|
||
|
#define UDAC_MAX_INDEX ((1 << UDAC_INDEX_WIDTH) - 1)
|
||
|
#define UDAC_VALUE_COUNT (1 << UDAC_INDEX_WIDTH)
|
||
|
|
||
|
extern const uint8_t LUT_sine_8192_quad_packed[];
|
||
|
|
||
|
struct udac_channel_live {
|
||
|
enum UDAC_Noise noise_type;
|
||
|
uint8_t noise_level; // 0-11
|
||
|
enum UDAC_Waveform waveform;
|
||
|
|
||
|
uint16_t rectangle_ontime; // for rectangle wave, 0-8191
|
||
|
uint16_t rectangle_high;
|
||
|
uint16_t rectangle_low;
|
||
|
uint16_t dc_level; // for DC wave
|
||
|
|
||
|
uint32_t counter;
|
||
|
uint32_t increment;
|
||
|
|
||
|
// last set phase if the frequencies are the same
|
||
|
// - can be used for live frequency changes without reset (meaningful only with matching increment values)
|
||
|
uint16_t phase;
|
||
|
uint16_t last_index;
|
||
|
uint16_t last_value;
|
||
|
};
|
||
|
|
||
|
/** Private data structure */
|
||
|
struct priv {
|
||
|
// settings
|
||
|
struct {
|
||
|
struct udac_channel_cfg ch[2];
|
||
|
} cfg;
|
||
|
|
||
|
// internal state
|
||
|
struct udac_channel_live ch[2];
|
||
|
TIM_TypeDef *TIMx; // timer used for the DDS function
|
||
|
};
|
||
|
|
||
|
/** Allocate data structure and set defaults */
|
||
|
error_t UDAC_preInit(Unit *unit);
|
||
|
|
||
|
/** Load from a binary buffer stored in Flash */
|
||
|
void UDAC_loadBinary(Unit *unit, PayloadParser *pp);
|
||
|
|
||
|
/** Write to a binary buffer for storing in Flash */
|
||
|
void UDAC_writeBinary(Unit *unit, PayloadBuilder *pb);
|
||
|
|
||
|
// ------------------------------------------------------------------------
|
||
|
|
||
|
/** Parse a key-value pair from the INI file */
|
||
|
error_t UDAC_loadIni(Unit *unit, const char *key, const char *value);
|
||
|
|
||
|
/** Generate INI file section for the unit */
|
||
|
void UDAC_writeIni(Unit *unit, IniWriter *iw);
|
||
|
|
||
|
// ------------------------------------------------------------------------
|
||
|
|
||
|
/** Finalize unit set-up */
|
||
|
error_t UDAC_init(Unit *unit);
|
||
|
|
||
|
/** Tear down the unit */
|
||
|
void UDAC_deInit(Unit *unit);
|
||
|
|
||
|
void UDAC_Reconfigure(Unit *unit);
|
||
|
|
||
|
void UDAC_HandleIT(void *arg);
|
||
|
|
||
|
error_t UDAC_SetFreq(Unit *unit, int channel, float freq);
|
||
|
|
||
|
void UDAC_ToggleTimerIfNeeded(Unit *unit);
|
||
|
|
||
|
#endif //GEX_F072_DAC_INTERNAL_H
|