summaryrefslogtreecommitdiff
path: root/sw/Core/Src/dac.h
diff options
context:
space:
mode:
authorStijn Kuipers <stijnkuipers@gmail.com>2023-06-29 16:26:07 +0200
committerStijn Kuipers <stijnkuipers@gmail.com>2023-06-29 16:26:07 +0200
commitfb5a321dd7c2848128b04b306f3e1e59c87a3f70 (patch)
treea8ef6273f9f331ebb1971a9baf20a8c897955612 /sw/Core/Src/dac.h
parentbae7568fd4dd0676b370be8548c7ec95d6521ba1 (diff)
downloadplinky-fb5a321dd7c2848128b04b306f3e1e59c87a3f70.tar.gz
Initial Filedump
Tadaaa!!
Diffstat (limited to 'sw/Core/Src/dac.h')
-rwxr-xr-xsw/Core/Src/dac.h113
1 files changed, 113 insertions, 0 deletions
diff --git a/sw/Core/Src/dac.h b/sw/Core/Src/dac.h
new file mode 100755
index 0000000..ba9c855
--- /dev/null
+++ b/sw/Core/Src/dac.h
@@ -0,0 +1,113 @@
+
+enum {
+ OUT_TRIGGER,
+ OUT_CLOCK,
+ OUT_PRESSURE,
+ OUT_GATE,
+ OUT_PITCHLO,
+ OUT_PITCHHI,
+};
+
+#ifdef EMU
+int emucvouthist;
+float emucvout[6][256];
+float emupitchloopback;
+#endif
+
+#ifdef EMU
+void SetOutputCVEmu(int chan, int data) {
+ emucvout[chan][emucvouthist/4] = maxf(emucvout[chan][emucvouthist/4],data * (1.f/65535.f));
+}
+#else
+#define SetOutputCVEmu(chan, data)
+#endif
+
+void SetOutputCVTrigger(int data) {
+#ifdef EMU
+ SetOutputCVEmu(OUT_TRIGGER, data);
+#else
+// HAL_GPIO_WritePin(CVOUTTRIG_GPIO_Port, CVOUTTRIG_Pin, data ? GPIO_PIN_SET : GPIO_PIN_RESET);
+ __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, clampi(data,0,65535)>>8);
+#endif
+}
+void SetOutputCVClk(int data) {
+#ifdef EMU
+ SetOutputCVEmu(OUT_CLOCK, data);
+#else
+// HAL_GPIO_WritePin(CVOUTCLK_GPIO_Port, CVOUTCLK_Pin, data ? GPIO_PIN_SET : GPIO_PIN_RESET);
+ __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, clampi(data,0,65535)>>8);
+#endif
+}
+u8 maxpressure_out;
+void SetOutputCVPressure(int data) {
+ maxpressure_out = clampi(data >> 6,0,255);
+#ifdef EMU
+ SetOutputCVEmu(OUT_PRESSURE, data);
+#else
+ __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, clampi(data,0,65535)>>8);
+#endif
+}
+void SetOutputCVGate(int data) {
+#ifdef EMU
+ SetOutputCVEmu(OUT_GATE, data);
+#else
+ __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, clampi(data, 0, 65535) >> 8);
+#endif
+}
+void SetOutputCVPitchLo(int data, bool applycalib) {
+ if (applycalib) {
+ data = (int)((data * cvcalib[8].scale) + cvcalib[8].bias);
+ int step=abs((int)(cvcalib[8].scale*(2048.f*12.f)));
+ for (int k=0;k<3;++k) if (data>65535) data-=step; else break;
+ for (int k=0;k<3;++k) if (data<0) data+=step; else break;
+ }
+#ifdef EMU
+ SetOutputCVEmu(OUT_PITCHLO, data);
+ emupitchloopback = (data - 52100.f) / -9334.83f;
+#else
+ HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_L, clampi(data,0,65535) );
+#endif
+}
+int pitchhi_out;
+void SetOutputCVPitchHi(int data, bool applycalib) {
+ pitchhi_out = data ;
+ if (applycalib) {
+ data = (int)((data * cvcalib[9].scale) + cvcalib[9].bias);
+ int step=abs((int)(cvcalib[9].scale*(2048.f*12.f)));
+ for (int k=0;k<3;++k) if (data>65535) data-=step; else break;
+ for (int k=0;k<3;++k) if (data<0) data+=step; else break;
+ }
+#ifdef EMU
+ SetOutputCVEmu(OUT_PITCHHI, data);
+#else
+ HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_L, clampi(data,0,65535) );
+#endif
+}
+
+void dac_init(void) {
+#ifndef EMU
+ HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);
+ HAL_DAC_Start(&hdac1, DAC_CHANNEL_2);
+
+ // must start timer to actually have it work
+
+ // also start pwm outputs
+ HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
+ HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
+ HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
+ HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);
+#endif
+}
+
+extern int arpdebugi;
+
+void AdvanceCVOut() {
+#ifdef EMU
+ emucvouthist++;
+ emucvouthist &= 1023;
+ if ((emucvouthist & 3) == 0) {
+ for (int c = 0; c < 6; ++c) emucvout[c][emucvouthist / 4] = 0;
+ }
+ arpdebugi = (arpdebugi + 1) & 1023;
+#endif
+}