From: Thomas Pietrzak Date: Wed, 19 Apr 2017 15:16:52 +0000 (+0200) Subject: simple spring example X-Git-Url: https://git.thomaspietrzak.com/?a=commitdiff_plain;h=0c601cd40b9956e1dd5cd990c11251823ea95335;p=forcefader.git simple spring example --- 0c601cd40b9956e1dd5cd990c11251823ea95335 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..793198f --- /dev/null +++ b/.gitignore @@ -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 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 index 0000000..ec2da76 --- /dev/null +++ b/forcefader.c @@ -0,0 +1,124 @@ +#include +#include +#include +#include + +#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; +}