simple spring example
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Wed, 19 Apr 2017 15:16:52 +0000 (17:16 +0200)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Wed, 19 Apr 2017 15:16:52 +0000 (17:16 +0200)
.gitignore [new file with mode: 0644]
Makefile [new file with mode: 0644]
forcefader.c [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..793198f
--- /dev/null
@@ -0,0 +1,11 @@
+*~
+.DS_Store
+Thumbs.db
+
+uc-sdk
+*.bin
+*.dep
+*.elf
+*.map
+*.o
+
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..58f0789
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,58 @@
+export BOARD = stm32f429discovery
+ROOTDIR = $(CURDIR)/uC-sdk
+
+ifeq ($(wildcard $(ROOTDIR)/uC-sdk.root),)
+ifneq ($(wildcard ../../../uC-sdk.root),)
+ROOTDIR = ../../..
+endif
+endif
+
+TARGET = forcefader.bin
+TARGET_SRCS = forcefader.c
+
+LIBDEPS = \
+$(ROOTDIR)/FreeRTOS/libFreeRTOS.a \
+$(ROOTDIR)/arch/libarch.a \
+$(ROOTDIR)/os/libos.a \
+$(ROOTDIR)/libc/libc.a \
+$(ROOTDIR)/libm/libm.a \
+$(ROOTDIR)/acorn/libacorn.a \
+$(ROOTDIR)/hardware/libhardware.a \
+
+LIBS = -Wl,--start-group $(LIBDEPS) -Wl,--end-group
+TARGET_INCLUDES = include
+
+include $(ROOTDIR)/common.mk
+
+all: uC-sdk $(TARGET)
+
+clean: clean-generic
+       $(Q)$(MAKE) $(MAKE_OPTS) -C $(ROOTDIR) clean
+
+.PHONY: uC-sdk
+
+$(ROOTDIR)/FreeRTOS/libFreeRTOS.a: uC-sdk
+$(ROOTDIR)/arch/libarch.a: uC-sdk
+$(ROOTDIR)/os/libos.a: uC-sdk
+$(ROOTDIR)/libc/libc.a: uC-sdk
+$(ROOTDIR)/libm/libm.a: uC-sdk
+$(ROOTDIR)/acorn/libacorn.a: uC-sdk
+$(ROOTDIR)/hardware/libhardware.a: uC-sdk
+
+uC-sdk:
+       $(E) "[MAKE]   Entering uC-sdk"
+       $(Q)$(MAKE) $(MAKE_OPTS) -C $(ROOTDIR)
+
+deps: ldeps
+       $(E) "[DEPS]   Creating dependency tree for uC-sdk"
+       $(Q)$(MAKE) $(MAKE_OPTS) -C $(ROOTDIR) ldeps
+
+include $(ROOTDIR)/FreeRTOS/config.mk
+include $(ROOTDIR)/arch/config.mk
+include $(ROOTDIR)/os/config.mk
+include $(ROOTDIR)/libc/config.mk
+include $(ROOTDIR)/libm/config.mk
+include $(ROOTDIR)/acorn/config.mk
+include $(ROOTDIR)/hardware/config.mk
+include $(ROOTDIR)/target-rules.mk
+
diff --git a/forcefader.c b/forcefader.c
new file mode 100644 (file)
index 0000000..ec2da76
--- /dev/null
@@ -0,0 +1,124 @@
+#include <gpio.h>
+#include <adc.h>
+#include <timer.h>
+#include <stdio.h>
+
+#define POSMIN 0
+#define POSMAX 4095
+
+#define THRESHOLD 90
+
+uint16_t faderpos;
+pin_t faderpos_pin, motorsignal_pin, motordir1_pin, motordir2_pin, fadertouch_pin, touch_TX_pin, touch_RX_pin;
+
+timer_channel_t forceloop_timer = { .timer = 1, .channel = 1 };
+timer_channel_t capacitiveloop_timer = { .timer = 2, .channel = 1 };
+timer_channel_t motorsignal_timer = { .timer = 3, .channel = 3 };
+timer_channel_t capacitivemeasure_timer = { .timer = 4, .channel = 1 };
+
+uint16_t capacitance = 0;
+
+void setSpringForce(uint16_t pos, uint8_t k)
+{
+  uint32_t force;
+  if (faderpos > pos)
+  {
+    gpio_set(motordir1_pin, 0);
+    gpio_set(motordir2_pin, 1);
+    force = ((uint32_t)(faderpos - pos) * k) / 4096;
+  }
+  else
+  {
+    gpio_set(motordir1_pin, 1);
+    gpio_set(motordir2_pin, 0);
+    force = ((uint32_t)(pos - faderpos) * k) / 4096;
+  }
+  //printf("force 1: %8d\n", force);
+  timer_pwmchannel_init(motorsignal_timer, motorsignal_pin, force);
+}
+
+void updateForce()
+{
+  if (capacitance > THRESHOLD)
+    setSpringForce(2048, 255);
+}
+
+uint8_t measuring = 0;
+
+void capacitiveRX()
+{
+  if (measuring)
+  {
+    capacitance = timer_get_count(timer_4);
+    //printf("capa : %8d\n", c);
+    gpio_set(touch_TX_pin, 0);
+    measuring = 0;
+  }
+}
+
+void capacitiveTimeout()
+{
+  if (measuring)
+  {
+    capacitance = 0xffff;
+    //printf("capa : timeout\n");
+    gpio_set(touch_TX_pin, 0);
+    measuring = 0;
+  }
+}
+
+void capacitiveTX()
+{
+  if (!measuring)
+  {
+    timer_set_count(timer_4, 0);
+    gpio_set(touch_TX_pin, 1);
+    measuring = 1;
+  }
+}
+
+int main()
+{
+  faderpos_pin = make_pin(gpio_port_a, 0);    //ADC1   CH0
+  motorsignal_pin = make_pin(gpio_port_b, 0); //TIMER3 CH3
+  motordir1_pin = make_pin(gpio_port_e, 6);
+  motordir2_pin = make_pin(gpio_port_f, 4);
+  touch_TX_pin = make_pin(gpio_port_c, 12);
+  touch_RX_pin = make_pin(gpio_port_g, 11);
+
+  faderpos = 0;
+  uint8_t channel = 0;
+  adc_config_continuous(adc_1, &channel, &faderpos_pin, &faderpos, 1);
+
+  gpio_config(motordir1_pin, pin_dir_write, pull_none);
+  gpio_config(motordir2_pin, pin_dir_write, pull_none);
+
+  gpio_config(touch_TX_pin, pin_dir_write, pull_down);
+  gpio_config(touch_RX_pin, pin_dir_read, pull_none);
+  gpio_set(touch_TX_pin, 0);
+
+  //compute new force
+  timer_config(timer_1, 42, 1000);
+  timer_irq_init(forceloop_timer, event_update, updateForce);
+
+  //start capacitive measure
+  timer_config(timer_2, 1050, 1000);
+  timer_irq_init(capacitiveloop_timer, event_update, capacitiveTX);
+
+  //motor amplitude
+  timer_config(timer_3, 8, 255);
+  timer_pwmchannel_init(motorsignal_timer, motorsignal_pin, 0);
+
+  //capacitive counter
+  timer_config(timer_4, 84, 4000);
+  //timer_disable(timer_4);
+  timer_irq_init(capacitivemeasure_timer, event_update, capacitiveTimeout);
+
+  gpio_irq_init(touch_RX_pin, capacitiveRX, rising);
+
+  //Loop
+  while (1);
+    //printf("pos : %4d\n", faderpos);
+
+  return 0;
+}