From e6241231ee8558fefa428dcd0b86dfb20122e799 Mon Sep 17 00:00:00 2001 From: Rene Hopf Date: Tue, 3 Jan 2017 22:51:05 +0100 Subject: [PATCH] initial v4 port --- Makefile | 2 +- src/comps/adc.comp | 14 +- src/comps/enc_fb.comp | 92 ++++++------- src/comps/freq_fb.comp | 39 +++--- src/comps/{io.comp => hw/io3.comp} | 23 ++-- src/comps/hw/io4.comp | 168 +++++++++++++++++++++++ src/comps/res.comp | 46 +++++-- src/comps/term.comp | 2 +- src/defines_res.h | 213 ----------------------------- src/hw/hw.h | 169 +++++++++++++++++++++++ src/main.c | 36 ++--- src/setup.c | 67 +++------ src/setup.h | 2 +- stm32_flash.ld | 2 +- timer.txt | 29 ++-- 15 files changed, 506 insertions(+), 398 deletions(-) rename src/comps/{io.comp => hw/io3.comp} (81%) create mode 100644 src/comps/hw/io4.comp delete mode 100644 src/defines_res.h create mode 100644 src/hw/hw.h diff --git a/Makefile b/Makefile index ebc5912a..46ce7b47 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Optimization level, can be [0, 1, 2, 3, s]. # 0 = turn off optimization. s = optimize for size. # -OPT = -O1 -flto +OPT = -O1 # OPT = -O1 # for debugging # Object files directory diff --git a/src/comps/adc.comp b/src/comps/adc.comp index 26786955..08df0e4b 100644 --- a/src/comps/adc.comp +++ b/src/comps/adc.comp @@ -1,16 +1,8 @@ HAL_COMP(adc); -#define AREF 3.3// analog reference voltage -#define ARES 4096.0// analog resolution, 12 bit - -#define R15 1000.0 -#define R22 3900.0 -#define R21 180.0 -#define R19 470.0 -#define V_REF 5.0 -#define INPUT_REF (V_REF * R21 / (R19 + R21)) -#define INPUT_GAIN (R22 / R15 * R21 / (R19 + R21)) -#define V_DIFF(ADC) (((ADC)/ADC_ANZ/ARES*AREF-INPUT_REF)/INPUT_GAIN) +#define INPUT_REF (OP_REF * OP_R_OUT_LOW / (OP_R_OUT_HIGH + OP_R_OUT_LOW)) +#define INPUT_GAIN (OP_R_FEEDBACK / OP_R_INPUT * OP_R_OUT_LOW / (OP_R_OUT_HIGH + OP_R_OUT_LOW)) +#define V_DIFF(ADC) (((ADC) / ADC_ANZ / ADC_RES * ADC_REF - INPUT_REF) / INPUT_GAIN) HAL_PIN(sin) = 0.0; HAL_PIN(cos) = 0.0; diff --git a/src/comps/enc_fb.comp b/src/comps/enc_fb.comp index 18d7aed3..068f2c59 100644 --- a/src/comps/enc_fb.comp +++ b/src/comps/enc_fb.comp @@ -32,57 +32,55 @@ RT_INIT( TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0xF; - TIM_ICInit(ENC1_TIM, &TIM_ICInitStructure); + TIM_ICInit(FB0_ENC_TIM, &TIM_ICInitStructure); /***************** port 1, quadrature , sin/cos or resolver *********************/ e_res = (int)PIN(res); if(e_res < 1){ - e_res = 1; + e_res = 1; } // enable clocks - RCC_APB1PeriphClockCmd(ENC1_TIM_RCC, ENABLE); + RCC_APB1PeriphClockCmd(FB0_ENC_TIM_RCC, ENABLE); // pin mode: af - GPIO_InitStructure.GPIO_Pin = ENC1_A_PIN | ENC1_B_PIN; + GPIO_InitStructure.GPIO_Pin = FB0_A_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(ENC1_A_PORT, &GPIO_InitStructure); + GPIO_Init(FB0_A_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = FB0_B_PIN; + GPIO_Init(FB0_B_PORT, &GPIO_InitStructure); // pin af -> tim - GPIO_PinAFConfig(ENC1_A_PORT, ENC1_A_PIN_SOURCE, ENC1_A_AF_SOURCE); - GPIO_PinAFConfig(ENC1_B_PORT, ENC1_B_PIN_SOURCE, ENC1_B_AF_SOURCE); + GPIO_PinAFConfig(FB0_A_PORT, FB0_A_PIN_SOURCE, FB0_ENC_TIM_AF); + GPIO_PinAFConfig(FB0_B_PORT, FB0_B_PIN_SOURCE, FB0_ENC_TIM_AF); // enc res / turn - TIM_SetAutoreload(ENC1_TIM, e_res - 1); + TIM_SetAutoreload(FB0_ENC_TIM, e_res - 1); // quad - TIM_Cmd(ENC1_TIM, DISABLE); - GPIO_InitStructure.GPIO_Pin = ENC1_A_PIN | ENC1_B_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(ENC1_A_PORT, &GPIO_InitStructure); - TIM_EncoderInterfaceConfig(ENC1_TIM, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); - TIM_Cmd(ENC1_TIM, ENABLE); + TIM_Cmd(FB0_ENC_TIM, DISABLE); + TIM_EncoderInterfaceConfig(FB0_ENC_TIM, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); + TIM_Cmd(FB0_ENC_TIM, ENABLE); ); RT_DEINIT( - TIM_Cmd(ENC1_TIM, DISABLE); - TIM_DeInit(ENC1_TIM); - RCC_APB2PeriphClockCmd(ENC1_TIM_RCC, DISABLE); - GPIO_InitStructure.GPIO_Pin = ENC1_A_PIN | ENC1_B_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(ENC1_A_PORT, &GPIO_InitStructure); + //TODO: + // TIM_Cmd(FB0_ENC_TIM, DISABLE); + // TIM_DeInit(FB0_ENC_TIM); + // RCC_APB2PeriphClockCmd(FB0_ENC_TIM_RCC, DISABLE); + // GPIO_InitStructure.GPIO_Pin = ENC1_A_PIN | ENC1_B_PIN; + // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + // GPIO_Init(ENC1_A_PORT, &GPIO_InitStructure); ); FRT( - float p = mod(TIM_GetCounter(ENC1_TIM) * 2.0f * M_PI / (float)e_res); + float p = mod(TIM_GetCounter(FB0_ENC_TIM) * 2.0f * M_PI / (float)e_res); PIN(pos) = p; if(RISING_EDGE(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)) && PIN(isabs) != 1.0){ absoffset = -p; @@ -92,18 +90,18 @@ FRT( ); RT( - int32_t tim = TIM_GetCounter(ENC1_TIM);//TODO: interrupt here? - uint32_t scgpio = GPIOC->IDR; + int32_t tim = TIM_GetCounter(FB0_ENC_TIM);//TODO: interrupt here? + uint32_t scgpio = FB0_A_PORT->IDR;//TODO: ENC PORT float p = 0.0; int r = (int)PIN(res); if(r < 1){ - r = 1; + r = 1; } float ir = PIN(ires); if(ir < 1){ - ir = 1; + ir = 1; } float s = PIN(sin); @@ -112,16 +110,16 @@ RT( PIN(amp) = a; int q; - - if(!(scgpio & GPIO_Pin_6)){ - if(scgpio & GPIO_Pin_7){ + + if(!(scgpio & FB0_A_PIN)){//TODO: check A/B mapping, hw3 has A -> cos, B -> sin + if(scgpio & FB0_B_PIN){ q = 1; } else{ q = 2; } }else{ - if(scgpio & GPIO_Pin_7){ + if(scgpio & FB0_B_PIN){ q = 4; } else{ @@ -130,7 +128,7 @@ RT( } //TODO: sincos stuff at speed int qdiff = PIN(quad)-q; - + switch(qdiff){ case 1: case -3: @@ -143,21 +141,21 @@ RT( default: break; } - + if(tim >= e_res){ tim = 0; } else if(tim < 0){ tim = e_res - 1; } - + PIN(qdiff) = qdiff; - - PIN(s) = (scgpio & GPIO_Pin_6)?0:1; - PIN(c) = (scgpio & GPIO_Pin_7)?1:0; - + + PIN(s) = (scgpio & FB0_A_PIN)?0:1; + PIN(c) = (scgpio & FB0_B_PIN)?1:0; + PIN(oquad) = q; - + p = mod(tim * 2.0f * M_PI / (float)e_res); if(a < 0.15 && !EDGE(tim)){ @@ -170,20 +168,20 @@ RT( if(e_res != r){ e_res = r; - TIM_SetAutoreload(ENC1_TIM, e_res - 1); + TIM_SetAutoreload(FB0_ENC_TIM, e_res - 1); } - if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)){//TODO: setup pin + if(GPIO_ReadInputDataBit(FB0_Z_PORT,FB0_Z_PIN)){//TODO: setup pin PIN(index) = 0.0; }else{ PIN(index) = 1.0; } - if(GPIO_ReadInputDataBit(ENC1_A_PORT,ENC1_A_PIN)){//TODO: setup pin + if(GPIO_ReadInputDataBit(FB0_A_PORT,FB0_A_PIN)){//TODO: setup pin PIN(a) = 0.0; }else{ PIN(a) = 1.0; } - if(GPIO_ReadInputDataBit(ENC1_B_PORT,ENC1_B_PIN)){//TODO: setup pin + if(GPIO_ReadInputDataBit(FB0_B_PORT,FB0_B_PIN)){//TODO: setup pin PIN(b) = 0.0; }else{ PIN(b) = 1.0; diff --git a/src/comps/freq_fb.comp b/src/comps/freq_fb.comp index 950d1476..86df8a39 100644 --- a/src/comps/freq_fb.comp +++ b/src/comps/freq_fb.comp @@ -14,55 +14,54 @@ RT_INIT( GPIO_InitTypeDef GPIO_InitStructure; // enable clocks - RCC_APB1PeriphClockCmd(ENC1_TIM_RCC, ENABLE); + RCC_APB1PeriphClockCmd(FB0_ENC_TIM_RCC, ENABLE); // pin mode: af - GPIO_InitStructure.GPIO_Pin = ENC1_A_PIN; + GPIO_InitStructure.GPIO_Pin = FB0_A_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(ENC1_A_PORT, &GPIO_InitStructure); + GPIO_Init(FB0_A_PORT, &GPIO_InitStructure); // pin af -> tim - GPIO_PinAFConfig(ENC1_A_PORT, ENC1_A_PIN_SOURCE, ENC1_A_AF_SOURCE); - // GPIO_PinAFConfig(ENC1_B_PORT, ENC1_B_PIN_SOURCE, ENC1_B_AF_SOURCE); + GPIO_PinAFConfig(FB0_A_PORT, FB0_A_PIN_SOURCE, FB0_ENC_TIM_AF); // enc res / turn - TIM_SetAutoreload(ENC1_TIM, 5000-1); + TIM_SetAutoreload(FB0_ENC_TIM, 5000-1); // quad - TIM_Cmd(ENC1_TIM, DISABLE); - GPIO_InitStructure.GPIO_Pin = ENC1_A_PIN; + TIM_Cmd(FB0_ENC_TIM, DISABLE); + GPIO_InitStructure.GPIO_Pin = FB0_A_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(ENC1_A_PORT, &GPIO_InitStructure); - TIM_EncoderInterfaceConfig(ENC1_TIM, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); + GPIO_Init(FB0_A_PORT, &GPIO_InitStructure); + TIM_EncoderInterfaceConfig(FB0_ENC_TIM, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); - TIM_ETRClockMode1Config(ENC1_TIM,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00); + TIM_ETRClockMode1Config(FB0_ENC_TIM,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00); - TIM_TIxExternalClockConfig(ENC1_TIM,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising,0x00); + TIM_TIxExternalClockConfig(FB0_ENC_TIM,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising,0x00); - TIM_Cmd(ENC1_TIM, ENABLE); + TIM_Cmd(FB0_ENC_TIM, ENABLE); ); RT_DEINIT( - TIM_Cmd(ENC1_TIM, DISABLE); - TIM_DeInit(ENC1_TIM); - RCC_APB2PeriphClockCmd(ENC1_TIM_RCC, DISABLE); - GPIO_InitStructure.GPIO_Pin = ENC1_A_PIN | ENC1_B_PIN; + TIM_Cmd(FB0_ENC_TIM, DISABLE); + TIM_DeInit(FB0_ENC_TIM); + RCC_APB2PeriphClockCmd(FB0_ENC_TIM_RCC, DISABLE); + GPIO_InitStructure.GPIO_Pin = FB0_A_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(ENC1_A_PORT, &GPIO_InitStructure); + GPIO_Init(FB0_A_PORT, &GPIO_InitStructure); ); RT( float lp = PIN(lp); - uint32_t tim = TIM_GetCounter(ENC1_TIM); + uint32_t tim = TIM_GetCounter(FB0_ENC_TIM); if(time > PIN(t)){ float vel = ((tim - lastpos + 5000)%5000)/PIN(res)/time; vel_lp = vel * lp + vel_lp * (1.0 - lp); @@ -72,7 +71,7 @@ RT( } time += period; - if(GPIO_ReadInputDataBit(ENC1_A_PORT,ENC1_A_PIN)){//TODO: setup pin + if(GPIO_ReadInputDataBit(FB0_A_PORT,FB0_A_PIN)){//TODO: setup pin PIN(a) = 0.0; }else{ PIN(a) = 1.0; diff --git a/src/comps/io.comp b/src/comps/hw/io3.comp similarity index 81% rename from src/comps/io.comp rename to src/comps/hw/io3.comp index 06d21eb1..a5813c98 100644 --- a/src/comps/io.comp +++ b/src/comps/hw/io3.comp @@ -12,15 +12,8 @@ INIT( GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //fan - GPIO_InitStructure.GPIO_Pin = FAN_PIN; - GPIO_Init(FAN_PORT, &GPIO_InitStructure); - - //led - GPIO_InitStructure.GPIO_Pin = LED_R_PIN; - GPIO_Init(LED_R_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = LED_G_PIN; - GPIO_Init(LED_G_PORT, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11; + GPIO_Init(GPIOC, &GPIO_InitStructure); //brake RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); @@ -56,9 +49,9 @@ INIT( NRT( if(PIN(fan) > 0) - GPIO_SetBits(FAN_PORT, FAN_PIN); + GPIO_SetBits(GPIOC, GPIO_Pin_8); else - GPIO_ResetBits(FAN_PORT, FAN_PIN); + GPIO_ResetBits(GPIOC, GPIO_Pin_8); TIM8->CCR4 = (int)CLAMP(PIN(brake) * 8400, 0, TIM8->ARR - 1); @@ -93,14 +86,14 @@ NRT( } if(red > 0) - GPIO_SetBits(LED_R_PORT, LED_R_PIN); + GPIO_SetBits(GPIOC, GPIO_Pin_10); else - GPIO_ResetBits(LED_R_PORT, LED_R_PIN); + GPIO_ResetBits(GPIOC, GPIO_Pin_10); if(green > 0) - GPIO_SetBits(LED_G_PORT, LED_G_PIN); + GPIO_SetBits(GPIOC, GPIO_Pin_11); else - GPIO_ResetBits(LED_G_PORT, LED_G_PIN); + GPIO_ResetBits(GPIOC, GPIO_Pin_11); ); ENDCOMP; diff --git a/src/comps/hw/io4.comp b/src/comps/hw/io4.comp new file mode 100644 index 00000000..0b79a858 --- /dev/null +++ b/src/comps/hw/io4.comp @@ -0,0 +1,168 @@ +HAL_COMP(io); + +HAL_PIN(fan) = 0.0; + +HAL_PIN(state) = 0.0; +HAL_PIN(fault) = 0.0; +HAL_PIN(brake) = 0.0; + +HAL_PIN(red) = 0.0; +HAL_PIN(yellow) = 0.0; +HAL_PIN(green) = 0.0; + +HAL_PIN(out0) = 0.0; +HAL_PIN(out1) = 0.0; +HAL_PIN(out2) = 0.0; + +HAL_PIN(in0) = 0.0; +HAL_PIN(in1) = 0.0; + +HAL_PIN(fb0g) = 0.0; +HAL_PIN(fb0y) = 0.0; + +HAL_PIN(fb1g) = 0.0; +HAL_PIN(fb1y) = 0.0; + +HAL_PIN(cmdg) = 0.0; +HAL_PIN(cmdy) = 0.0; + +INIT( + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + + //fan + //GPIO_InitStructure.GPIO_Pin = FAN_PIN; + //GPIO_Init(FAN_PORT, &GPIO_InitStructure); + + //red + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + //yellow + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + //green + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + //in1 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + //in0 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + //out0 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + //out1 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + //out2 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + //fb0 green + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + //fb0 yellow + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + //fb1 green + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + //fb1 yellow + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + //cmd yellow + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + //cmd green + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; + GPIO_Init(GPIOD, &GPIO_InitStructure); +); + +NRT( + if(PIN(red) > 0) + GPIO_SetBits(GPIOD, GPIO_Pin_3); + else + GPIO_ResetBits(GPIOD, GPIO_Pin_3); + + if(PIN(yellow) > 0) + GPIO_SetBits(GPIOD, GPIO_Pin_4); + else + GPIO_ResetBits(GPIOD, GPIO_Pin_4); + + if(PIN(green) > 0) + GPIO_SetBits(GPIOD, GPIO_Pin_5); + else + GPIO_ResetBits(GPIOD, GPIO_Pin_5); + + if(PIN(out0) > 0) + GPIO_SetBits(GPIOE, GPIO_Pin_4); + else + GPIO_ResetBits(GPIOE, GPIO_Pin_4); + + if(PIN(out1) > 0) + GPIO_SetBits(GPIOE, GPIO_Pin_5); + else + GPIO_ResetBits(GPIOE, GPIO_Pin_5); + + if(PIN(out2) > 0) + GPIO_SetBits(GPIOE, GPIO_Pin_6); + else + GPIO_ResetBits(GPIOE, GPIO_Pin_6); + + if(PIN(in0) > 0) + GPIO_SetBits(GPIOE, GPIO_Pin_1); + else + GPIO_ResetBits(GPIOE, GPIO_Pin_1); + + if(PIN(in1) > 0) + GPIO_SetBits(GPIOE, GPIO_Pin_0); + else + GPIO_ResetBits(GPIOE, GPIO_Pin_0); + + if(PIN(fb0g) > 0) + GPIO_SetBits(GPIOD, GPIO_Pin_8); + else + GPIO_ResetBits(GPIOD, GPIO_Pin_8); + + if(PIN(fb0y) > 0) + GPIO_SetBits(GPIOD, GPIO_Pin_9); + else + GPIO_ResetBits(GPIOD, GPIO_Pin_9); + + if(PIN(fb1g) > 0) + GPIO_SetBits(GPIOE, GPIO_Pin_7); + else + GPIO_ResetBits(GPIOE, GPIO_Pin_7); + + if(PIN(fb1y) > 0) + GPIO_SetBits(GPIOE, GPIO_Pin_8); + else + GPIO_ResetBits(GPIOE, GPIO_Pin_8); + + if(PIN(cmdy) > 0) + GPIO_SetBits(GPIOD, GPIO_Pin_6); + else + GPIO_ResetBits(GPIOD, GPIO_Pin_6); + + if(PIN(cmdg) > 0) + GPIO_SetBits(GPIOD, GPIO_Pin_7); + else + GPIO_ResetBits(GPIOD, GPIO_Pin_7); +); + +ENDCOMP; diff --git a/src/comps/res.comp b/src/comps/res.comp index fa9218a0..0940cafb 100644 --- a/src/comps/res.comp +++ b/src/comps/res.comp @@ -14,20 +14,35 @@ HAL_PIN(cos) = 0.0; HAL_PIN(enable) = 0.0; HAL_PIN(error) = 0.0; -//HAL_PIN(tim2_oc) = 240.0; +HAL_PIN(tim_oc) = 5.0; MEM(int lastq) = 0;// last quadrant MEM(int abspos) = 0;// multiturn position RT_INIT( + // resolver reference signal OC + //TODO: timer init! + TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; + TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; + TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; + TIM_OCInitStructure.TIM_Pulse = 5; + TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; + TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; + TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; + TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; + //ref is always OC3 + TIM_OC3Init(TIM_SLAVE, &TIM_OCInitStructure); + TIM_OC3PreloadConfig(TIM_SLAVE, TIM_OCPreload_Enable); + TIM_CtrlPWMOutputs(TIM_SLAVE, ENABLE); + //resolver ref signal generation - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Pin = FB0_Z_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOB, &GPIO_InitStructure); + GPIO_Init(FB0_Z_PORT, &GPIO_InitStructure); - GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_TIM2); + GPIO_PinAFConfig(FB0_Z_PORT, FB0_Z_PIN_SOURCE, FB0_RES_TIM_AF); // TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; // TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; @@ -43,23 +58,23 @@ RT_INIT( // TIM_CtrlPWMOutputs(TIM2, ENABLE); //txen - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; + GPIO_InitStructure.GPIO_Pin = FB0_Z_TXEN_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOB, &GPIO_InitStructure); - GPIO_SetBits(GPIOB,GPIO_Pin_12); + GPIO_Init(FB0_Z_TXEN_PORT, &GPIO_InitStructure); + GPIO_SetBits(FB0_Z_TXEN_PORT,FB0_Z_TXEN_PIN); ); RT_DEINIT( - GPIO_ResetBits(GPIOB,GPIO_Pin_12);//tx disable - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_12; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOB, &GPIO_InitStructure); + // GPIO_ResetBits(GPIOB,GPIO_Pin_12);//tx disable + // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_12; + // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + // GPIO_Init(GPIOB, &GPIO_InitStructure); // TIM_CtrlPWMOutputs(TIM2, DISABLE); // TIM_OCStructInit(&TIM_OCInitStructure); // TIM_OC3Init(TIM2, &TIM_OCInitStructure); @@ -67,7 +82,8 @@ RT_DEINIT( RT( //TODO: arr can change! -// TIM2->CCR3 = (int)CLAMP(PIN(tim2_oc), 0, TIM2->ARR - 1); + FB0_RES_TIM->CCR3 = (int)CLAMP(PIN(tim_oc), 0, FB0_RES_TIM->ARR - 1); + float s = 0.0; float c = 0.0; float a = 0.0; diff --git a/src/comps/term.comp b/src/comps/term.comp index 8bcf2770..a35260e7 100644 --- a/src/comps/term.comp +++ b/src/comps/term.comp @@ -255,7 +255,7 @@ NRT( } int tmp = 0; - unsigned char buf[8 + 2]; + unsigned char buf[8 + 2];//TODO: TERM_NUM_WAVES... buf[0] = 255; buf[8 + 1] = 0; diff --git a/src/defines_res.h b/src/defines_res.h deleted file mode 100644 index e6f90f5f..00000000 --- a/src/defines_res.h +++ /dev/null @@ -1,213 +0,0 @@ -// defines für stm32f405 - -// resolver -//// adc -#define SIN_ADC ADC1 -#define SIN_ADC_RCC RCC_APB2Periph_ADC1 -#define SIN_ADC_CHAN ADC_Channel_14 - -#define COS_ADC ADC2 -#define COS_ADC_RCC RCC_APB2Periph_ADC2 -#define COS_ADC_CHAN ADC_Channel_15 - -//// timer -#define RES_TIM TIM2 -#define RES_TIM_RCC RCC_APB1Periph_TIM2 - -//// dma -#define DMA DMA2_Stream2 -#define DMA_RCC RCC_AHB1Periph_DMA2 -#define DMA_CHAN DMA_Channel_1 -#define DMA_IRQN DMA2_Stream2_IRQn - -//// gpio -#define SIN_PIN GPIO_Pin_4 -#define SIN_PORT GPIOC -#define SIN_IO_RCC RCC_AHB1Periph_GPIOC - -#define COS_PIN GPIO_Pin_5 -#define COS_PORT GPIOC -#define COS_IO_RCC RCC_AHB1Periph_GPIOC - -#define RES_PIN GPIO_Pin_5 -#define RES_PORT GPIOA -#define RES_IO_RCC RCC_AHB1Periph_GPIOA - - -// encoder -//// timer -#define ENC0_TIM TIM1 -#define ENC0_TIM_RCC RCC_APB2Periph_TIM1 - -#define ENC1_TIM TIM3 -#define ENC1_TIM_RCC RCC_APB1Periph_TIM3 - -//// gpio -#define ENC0_A_PIN GPIO_Pin_8 -#define ENC0_A_PORT GPIOA -#define ENC0_A_IO_RCC RCC_AHB1Periph_GPIOA -#define ENC0_A_PIN_SOURCE GPIO_PinSource8 -#define ENC0_A_AF_SOURCE GPIO_AF_TIM1 - - -#define ENC0_B_PIN GPIO_Pin_9 -#define ENC0_B_PORT GPIOA -#define ENC0_B_IO_RCC RCC_AHB1Periph_GPIOA -#define ENC0_B_PIN_SOURCE GPIO_PinSource9 -#define ENC0_B_AF_SOURCE GPIO_AF_TIM1 - -#define ENC1_A_PIN GPIO_Pin_6 -#define ENC1_A_PORT GPIOC -#define ENC1_A_IO_RCC RCC_AHB1Periph_GPIOC -#define ENC1_A_PIN_SOURCE GPIO_PinSource6 -#define ENC1_A_AF_SOURCE GPIO_AF_TIM3 - -#define ENC1_B_PIN GPIO_Pin_7 -#define ENC1_B_PORT GPIOC -#define ENC1_B_IO_RCC RCC_AHB1Periph_GPIOC -#define ENC1_B_PIN_SOURCE GPIO_PinSource7 -#define ENC1_B_AF_SOURCE GPIO_AF_TIM3 - -// leds -#define LED_R_PIN GPIO_Pin_10 -#define LED_R_PORT GPIOC -#define LED_R_IO_RCC RCC_AHB1Periph_GPIOC - -#define LED_G_PIN GPIO_Pin_11 -#define LED_G_PORT GPIOC -#define LED_G_IO_RCC RCC_AHB1Periph_GPIOC - -// brake -#define BRAKE_PIN GPIO_Pin_9 -#define BRAKE_PORT GPIOC -#define BRAKE_IO_RCC RCC_AHB1Periph_GPIOC - -// fan -#define FAN_PIN GPIO_Pin_8 -#define FAN_PORT GPIOC -#define FAN_IO_RCC RCC_AHB1Periph_GPIOC - -#ifdef TROLLER - -#define UART_DRV USART1 -#define UART_DRV_RCC RCC_APB2Periph_USART1 -#define UART_DRV_CLOCK_COMMAND RCC_APB2PeriphClockCmd - -#define UART_DRV_RX_DMA DMA2_Stream5 -#define UART_DRV_RX_DMA_RCC RCC_AHB1Periph_DMA2 -#define UART_DRV_RX_DMA_CHAN DMA_Channel_4 -#define UART_DRV_RX_DMA_IRQN DMA1_Stream5_IRQn -#define UART_DRV_RX_DMA_TCIF DMA_FLAG_TCIF5 - -#define UART_DRV_IRQ USART1_IRQHandler -#define UART_DRV_IRQN USART1_IRQn - -#define UART_DRV_TX_DMA DMA2_Stream7 -#define UART_DRV_TX_DMA_RCC RCC_AHB1Periph_DMA2 -#define UART_DRV_TX_DMA_CHAN DMA_Channel_4 -#define UART_DRV_TX_DMA_IRQN DMA1_Stream7_IRQn -#define UART_DRV_TX_DMA_TCIF DMA_FLAG_TCIF7 - -#define UART_DRV_RX_PIN GPIO_Pin_7 -#define UART_DRV_RX_PORT GPIOB -#define UART_DRV_RX_IO_RCC RCC_AHB1Periph_GPIOB -#define UART_DRV_RX_PIN_SOURCE GPIO_PinSource7 -#define UART_DRV_RX_AF_SOURCE GPIO_AF_USART1 - -#define UART_DRV_TX_PIN GPIO_Pin_6 -#define UART_DRV_TX_PORT GPIOB -#define UART_DRV_TX_IO_RCC RCC_AHB1Periph_GPIOB -#define UART_DRV_TX_PIN_SOURCE GPIO_PinSource6 -#define UART_DRV_TX_AF_SOURCE GPIO_AF_USART1 - -#else - -#define UART_DRV USART2 -#define UART_DRV_RCC RCC_APB1Periph_USART2 -#define UART_DRV_CLOCK_COMMAND RCC_APB1PeriphClockCmd - -#define UART_DRV_RX_DMA DMA1_Stream5 -#define UART_DRV_RX_DMA_RCC RCC_AHB1Periph_DMA1 -#define UART_DRV_RX_DMA_CHAN DMA_Channel_4 -#define UART_DRV_RX_DMA_IRQN DMA1_Stream5_IRQn -#define UART_DRV_RX_DMA_TCIF DMA_FLAG_TCIF5 - -#define UART_DRV_IRQ USART2_IRQHandler -#define UART_DRV_IRQN USART2_IRQn - -#define UART_DRV_TX_DMA DMA1_Stream6 -#define UART_DRV_TX_DMA_RCC RCC_AHB1Periph_DMA1 -#define UART_DRV_TX_DMA_CHAN DMA_Channel_4 -#define UART_DRV_TX_DMA_IRQN DMA1_Stream6_IRQn -#define UART_DRV_TX_DMA_TCIF DMA_FLAG_TCIF6 - -#define UART_DRV_RX_PIN GPIO_Pin_3 -#define UART_DRV_RX_PORT GPIOA -#define UART_DRV_RX_IO_RCC RCC_AHB1Periph_GPIOA -#define UART_DRV_RX_PIN_SOURCE GPIO_PinSource3 -#define UART_DRV_RX_AF_SOURCE GPIO_AF_USART2 - -#define UART_DRV_TX_PIN GPIO_Pin_2 -#define UART_DRV_TX_PORT GPIOA -#define UART_DRV_TX_IO_RCC RCC_AHB1Periph_GPIOA -#define UART_DRV_TX_PIN_SOURCE GPIO_PinSource2 -#define UART_DRV_TX_AF_SOURCE GPIO_AF_USART2 - -#endif - -// // i2c -// #define I2C I2C1 -// #define I2C_RCC RCC_AHB1Periph_I2C1 -// -// //// gpio -// #define I2C_SDA_PIN GPIO_Pin_9 -// #define I2C_SDA_PORT GPIOB -// #define I2C_SDA_IO_RCC RCC_AHB1Periph_GPIOB -// #define I2C_SDA_PIN_SOURCE GPIO_PinSource9 -// #define I2C_SDA_AF_SOURCE GPIO_AF_I2C1 -// -// #define I2C_SCK_PIN GPIO_Pin_8 -// #define I2C_SCK_PORT GPIOB -// #define I2C_SCK_IO_RCC RCC_AHB1Periph_GPIOB -// #define I2C_SCK_PIN_SOURCE GPIO_PinSource8 -// #define I2C_SCK_AF_SOURCE GPIO_AF_I2C1 -// -// // spi -// #define SPI SPI1 -// #define SPI_RCC RCC_AHB1Periph_SPI1 -// -// //// gpio -// #define SPI_MOSI_PIN GPIO_Pin_5 -// #define SPI_MOSI_PORT GPIOB -// #define SPI_MOSI_IO_RCC RCC_AHB1Periph_GPIOB -// #define SPI_MOSI_PIN_SOURCE GPIO_PinSource5 -// #define SPI_MOSI_AF_SOURCE GPIO_AF_SPI1 -// -// #define SPI_MISO_PIN GPIO_Pin_4 -// #define SPI_MISO_PORT GPIOB -// #define SPI_MISO_IO_RCC RCC_AHB1Periph_GPIOB -// #define SPI_MISO_PIN_SOURCE GPIO_PinSource4 -// #define SPI_MISO_AF_SOURCE GPIO_AF_SPI1 -// -// #define SPI_SCK_PIN GPIO_Pin_3 -// #define SPI_SCK_PORT GPIOB -// #define SPI_SCK_IO_RCC RCC_AHB1Periph_GPIOB -// #define SPI_SCK_PIN_SOURCE GPIO_PinSource3 -// #define SPI_SCK_AF_SOURCE GPIO_AF_SPI1 -// -// // can -// #define CAN CAN1 -// #define CAN_RCC RCC_AHB1Periph_CAN1 -// -// //// gpio -// #define CAN_RX_PIN GPIO_Pin_8 -// #define CAN_RX_PORT GPIOB -// #define CAN_RX_IO_RCC RCC_AHB1Periph_GPIOB -// #define CAN_RX_PIN_SOURCE GPIO_PinSource8 -// #define CAN_RX_AF_SOURCE GPIO_AF_CAN1 -// -// #define CAN_TX_PIN GPIO_Pin_9 -// #define CAN_TX_PORT GPIOB -// #define CAN_TX_IO_RCC RCC_AHB1Periph_GPIOB -// #define CAN_TX_PIN_SOURCE GPIO_PinSource9 -// #define CAN_TX_AF_SOURCE GPIO_AF_CAN1 diff --git a/src/hw/hw.h b/src/hw/hw.h new file mode 100644 index 00000000..e0c4e170 --- /dev/null +++ b/src/hw/hw.h @@ -0,0 +1,169 @@ +#pragma once + +#define V4 + +#ifdef V3 + +#define SIN_ADC ADC1 +#define SIN_ADC_RCC RCC_APB2Periph_ADC1 +#define SIN_ADC_CHAN ADC_Channel_14 +#define SIN_PIN GPIO_Pin_4 +#define SIN_PORT GPIOC + +#define COS_ADC ADC2 +#define COS_ADC_RCC RCC_APB2Periph_ADC2 +#define COS_ADC_CHAN ADC_Channel_15 +#define COS_PIN GPIO_Pin_5 +#define COS_PORT GPIOC + +#define ADC_REF 3.3//analog reference voltage +#define ADC_RES 4096.0//analog resolution, 12 bit + +#define OP_R_INPUT 1000.0//opamp input +#define OP_R_FEEDBACK 3900.0//opamp feedback +#define OP_R_OUT_LOW 180.0//opamp out low +#define OP_R_OUT_HIGH 470.0//opamp out high +#define OP_REF 5.0//opamp reference voltage + +#define UART_DRV USART2 +#define UART_DRV_RCC RCC_APB1Periph_USART2 +#define UART_DRV_CLOCK_COMMAND RCC_APB1PeriphClockCmd + +#define UART_DRV_RX_DMA DMA1_Stream5 +#define UART_DRV_RX_DMA_CHAN DMA_Channel_4 +#define UART_DRV_RX_DMA_TCIF DMA_FLAG_TCIF5 + +#define UART_DRV_TX_DMA DMA1_Stream6 +#define UART_DRV_TX_DMA_CHAN DMA_Channel_4 +#define UART_DRV_TX_DMA_TCIF DMA_FLAG_TCIF6 + +#define UART_DRV_RX_PIN GPIO_Pin_3 +#define UART_DRV_RX_PORT GPIOA +#define UART_DRV_RX_PIN_SOURCE GPIO_PinSource3 +#define UART_DRV_RX_AF_SOURCE GPIO_AF_USART2 + +#define UART_DRV_TX_PIN GPIO_Pin_2 +#define UART_DRV_TX_PORT GPIOA +#define UART_DRV_TX_PIN_SOURCE GPIO_PinSource2 +#define UART_DRV_TX_AF_SOURCE GPIO_AF_USART2 + +#define FB0_A_PIN GPIO_Pin_6 +#define FB0_A_PIN_SOURCE GPIO_PinSource6 +#define FB0_A_PORT GPIOC + +#define FB0_B_PIN GPIO_Pin_7 +#define FB0_B_PIN_SOURCE GPIO_PinSource7 +#define FB0_B_PORT GPIOC +//TODO: PB10 Z TX, resolver out +#define FB0_Z_PIN GPIO_Pin_11 +#define FB0_Z_PIN_SOURCE GPIO_PinSource11 +#define FB0_Z_PORT GPIOB + +#define FB0_Z_TXEN_PIN GPIO_Pin_12 +#define FB0_Z_TXEN_PORT GPIOB + +#define FB0_ENC_TIM TIM3 +#define FB0_ENC_TIM_AF GPIO_AF_TIM3 +#define FB0_ENC_TIM_RCC RCC_APB1Periph_TIM3 + +#define FB0_RES_TIM TIM2 +#define FB0_RES_TIM_AF GPIO_AF_TIM2 //sync to slave timer for resolver +#define FB0_RES_TIM_RCC RCC_APB1Periph_TIM2 + +#define TIM_MASTER TIM4 +#define TIM_MASTER_RCC RCC_APB1Periph_TIM4 +#define TIM_MASTER_ADC_OC_INIT TIM_OC4Init +#define TIM_MASTER_ADC_OC_PRELOAD TIM_OC4PreloadConfig +#define TIM_MASTER_ADC ADC_ExternalTrigConv_T4_CC4 + +#define TIM_SLAVE TIM2 +#define TIM_SLAVE_RCC RCC_APB1Periph_TIM2 +#define TIM_SLAVE_ITR TIM_TS_ITR3 +#define TIM_SLAVE_IRQ TIM2_IRQn +#define TIM_SLAVE_HANDLER TIM2_IRQHandler + +#elif defined V4 + +#define SIN_ADC ADC1 +#define SIN_ADC_RCC RCC_APB2Periph_ADC1 +#define SIN_ADC_CHAN ADC_Channel_6 +#define SIN_PIN GPIO_Pin_6 +#define SIN_PORT GPIOA + +#define COS_ADC ADC2 +#define COS_ADC_RCC RCC_APB2Periph_ADC2 +#define COS_ADC_CHAN ADC_Channel_7 +#define COS_PIN GPIO_Pin_7 +#define COS_PORT GPIOA + +#define ADC_REF 3.3//analog reference voltage +#define ADC_RES 4096.0//analog resolution, 12 bit + +#define OP_R_INPUT 10000.0//opamp input +#define OP_R_FEEDBACK 15000.0//opamp feedback +#define OP_R_OUT_LOW 470.0//opamp out low +#define OP_R_OUT_HIGH 22.0//opamp out high +#define OP_REF 1.83//opamp reference voltage + +#define UART_DRV USART2 +#define UART_DRV_RCC RCC_APB1Periph_USART2 +#define UART_DRV_CLOCK_COMMAND RCC_APB1PeriphClockCmd + +#define UART_DRV_RX_DMA DMA1_Stream5 +#define UART_DRV_RX_DMA_CHAN DMA_Channel_4 +#define UART_DRV_RX_DMA_TCIF DMA_FLAG_TCIF5 + +#define UART_DRV_TX_DMA DMA1_Stream6 +#define UART_DRV_TX_DMA_CHAN DMA_Channel_4 +#define UART_DRV_TX_DMA_TCIF DMA_FLAG_TCIF6 + +#define UART_DRV_RX_PIN GPIO_Pin_3 +#define UART_DRV_RX_PORT GPIOA +#define UART_DRV_RX_PIN_SOURCE GPIO_PinSource3 +#define UART_DRV_RX_AF_SOURCE GPIO_AF_USART2 + +#define UART_DRV_TX_PIN GPIO_Pin_2 +#define UART_DRV_TX_PORT GPIOA +#define UART_DRV_TX_PIN_SOURCE GPIO_PinSource2 +#define UART_DRV_TX_AF_SOURCE GPIO_AF_USART2 + +#define FB0_A_PIN GPIO_Pin_12 +#define FB0_A_PIN_SOURCE GPIO_PinSource12 +#define FB0_A_PORT GPIOD + +#define FB0_B_PIN GPIO_Pin_13 +#define FB0_B_PIN_SOURCE GPIO_PinSource13 +#define FB0_B_PORT GPIOD + +#define FB0_Z_PIN GPIO_Pin_14 +#define FB0_Z_PIN_SOURCE GPIO_PinSource14 +#define FB0_Z_PORT GPIOD + +#define FB0_Z_TXEN_PIN GPIO_Pin_15 +#define FB0_Z_TXEN_PORT GPIOD + +#define FB0_ENC_TIM TIM4 +#define FB0_ENC_TIM_AF GPIO_AF_TIM4 +#define FB0_ENC_TIM_RCC RCC_APB1Periph_TIM4 + +#define FB0_RES_TIM TIM4 +#define FB0_RES_TIM_AF GPIO_AF_TIM4 //sync to slave timer for resolver +#define FB0_RES_TIM_RCC RCC_APB1Periph_TIM4 + +#define TIM_MASTER TIM3 +#define TIM_MASTER_RCC RCC_APB1Periph_TIM3 +#define TIM_MASTER_ADC_OC_INIT TIM_OC1Init +#define TIM_MASTER_ADC_OC_PRELOAD TIM_OC1PreloadConfig +#define TIM_MASTER_ADC ADC_ExternalTrigConv_T3_CC1 + +#define TIM_SLAVE TIM5 +#define TIM_SLAVE_RCC RCC_APB1Periph_TIM5 +#define TIM_SLAVE_ITR TIM_TS_ITR1 +#define TIM_SLAVE_IRQ TIM5_IRQn +#define TIM_SLAVE_HANDLER TIM5_IRQHandler + +#else + +#error "No hardware version defined" + +#endif diff --git a/src/main.c b/src/main.c index 3de41091..7d02d181 100644 --- a/src/main.c +++ b/src/main.c @@ -42,16 +42,16 @@ GLOBAL_HAL_PIN(frt_period_time); //hal interface TODO: move hal interface to file void hal_enable_rt(){ - TIM_Cmd(TIM4, ENABLE); + TIM_Cmd(TIM_MASTER, ENABLE); } void hal_enable_frt(){ - TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); + TIM_ITConfig(TIM_SLAVE, TIM_IT_Update, ENABLE); } void hal_disable_rt(){ - TIM_Cmd(TIM4, DISABLE); + TIM_Cmd(TIM_MASTER, DISABLE); } void hal_disable_frt(){ - TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE); + TIM_ITConfig(TIM_SLAVE, TIM_IT_Update, DISABLE); } uint32_t hal_get_systick_value(){ @@ -74,8 +74,8 @@ void SysTick_Handler(void) } //20kHz -void TIM2_IRQHandler(void){ - TIM_ClearITPendingBit(TIM2,TIM_IT_Update); +void TIM_SLAVE_HANDLER(void){ + TIM_ClearITPendingBit(TIM_SLAVE,TIM_IT_Update); switch(hal.frt_state){ case FRT_STOP: return; @@ -180,18 +180,18 @@ int main(void) //feedback comps #include "comps/adc.comp" - #include "comps/res.comp" + #include "comps/res.comp" //TODO: not working in v4 and v3... ref pin needs fixing #include "comps/enc_fb.comp" - #include "comps/encm.comp" - //#include "comps/encs.comp" - //#include "comps/yaskawa.comp" - #include "comps/hyper.comp" + // #include "comps/encm.comp" //TODO: not working in v4 + //#include "comps/encs.comp" //TODO: not working in v4 + //#include "comps/yaskawa.comp" //TODO: not working in v4 + // #include "comps/hyper.comp" //TODO: not working in v4 //command comps - #include "comps/sserial.comp" + // #include "comps/sserial.comp" //TODO: not working in v4 #include "comps/sim.comp" - #include "comps/enc_cmd.comp" - #include "comps/en.comp" + // #include "comps/enc_cmd.comp" //TODO: not working in v4 + // #include "comps/en.comp" //TODO: not working in v4 //PID #include "comps/stp.comp" @@ -216,14 +216,18 @@ int main(void) //other comps #include "comps/fault.comp" #include "comps/term.comp" - #include "comps/io.comp" #include "comps/uf.comp" #include "comps/freq_fb.comp" #include "comps/psi.comp" #include "comps/var.comp" #include "comps/i2t.comp" #include "comps/reslimit.comp" - + +#ifdef V3 + #include "comps/hw/io3.comp" +#elif defined V4 + #include "comps/hw/io4.comp" +#endif hal_set_comp_type("net"); diff --git a/src/setup.c b/src/setup.c index 1d7c4b72..819290c2 100644 --- a/src/setup.c +++ b/src/setup.c @@ -11,7 +11,8 @@ void setup(){ //Enable clocks - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1 | RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_CRC, ENABLE); + //TODO: small f4 does not have GPIOE + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_DMA1 | RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_CRC, ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); @@ -27,70 +28,46 @@ void setup(){ } // Setup Resolver Interface -// TIM4 triggers ADC1,ADC2(OC4) and TIM2(TRGO) at 1.2MHz -// TIM2 OC1 generates resolver reference signal at 10kHz -// DMA2 moves 60 samples to memory, generates transfer complete interrupt at 5kHz +// master timer triggers ADC1,ADC2 via OC, and slave timer via TRGO at 1.2MHz +// slave timer OC generates resolver reference signal at 10kHz, phase can be adjusted by oc value +// DMA2 moves ADC_ANZ samples to memory, generates transfer complete interrupt at 5kHz void setup_res(){ //master timer - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); + RCC_APB1PeriphClockCmd(TIM_MASTER_RCC, ENABLE); TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 70 - 1;// 84e6 / 70 = 1.2MHz TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; - TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); - TIM_ARRPreloadConfig(TIM4,ENABLE); - TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Update);// trigger ADC - - // debug tim4 - // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; - // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - // GPIO_Init(GPIOB, &GPIO_InitStructure); - // GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_TIM4); + TIM_TimeBaseInit(TIM_MASTER, &TIM_TimeBaseStructure); + TIM_ARRPreloadConfig(TIM_MASTER,ENABLE); + TIM_SelectOutputTrigger(TIM_MASTER, TIM_TRGOSource_Update);// trigger ADC - //oc4 for adc trigger + //oc for adc trigger TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_Pulse = 1; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; - - TIM_OC4Init(TIM4, &TIM_OCInitStructure); - TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); - TIM_CtrlPWMOutputs(TIM4, ENABLE); + //ADC trigger OC depends on timer + TIM_MASTER_ADC_OC_INIT(TIM_MASTER, &TIM_OCInitStructure); + TIM_MASTER_ADC_OC_PRELOAD(TIM_MASTER, TIM_OCPreload_Enable); + TIM_CtrlPWMOutputs(TIM_MASTER, ENABLE); //slave timer - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); + RCC_APB1PeriphClockCmd(TIM_SLAVE_RCC, ENABLE); TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 60 - 1;// 1.2e6 / 60 = 20kHz TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; - TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); - TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1);//Rising edges of the selected trigger (TRGI) clock the counter - TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ITR3);// clk = TIM4 trigger out - TIM_ARRPreloadConfig(TIM2,ENABLE); + TIM_TimeBaseInit(TIM_SLAVE, &TIM_TimeBaseStructure); + TIM_SelectSlaveMode(TIM_SLAVE, TIM_SlaveMode_External1);//Rising edges of the selected trigger (TRGI) clock the counter + TIM_ITRxExternalClockConfig(TIM_SLAVE, TIM_SLAVE_ITR);// clk = TIM_MASTER trigger out + TIM_ARRPreloadConfig(TIM_SLAVE,ENABLE); - // resolver reference signal - //TODO: move to res.comp - TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; - TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; - TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; - TIM_OCInitStructure.TIM_Pulse = 5; - TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; - TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; - TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; - TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; - - TIM_OC3Init(TIM2, &TIM_OCInitStructure); - TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); - TIM_CtrlPWMOutputs(TIM2, ENABLE); - - TIM_Cmd(TIM2, ENABLE); + TIM_Cmd(TIM_SLAVE, ENABLE); /* ADC clock enable */ RCC_APB2PeriphClockCmd(SIN_ADC_RCC | COS_ADC_RCC, ENABLE); @@ -110,7 +87,7 @@ void setup_res(){ ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//data converted will be shifted to right ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//Input voltage is converted into a 12bit number giving a maximum value of 4096 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //the conversion is continuous, the input data is converted more than once - ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T4_CC4;//trigger on rising edge of TIM4 cc4 + ADC_InitStructure.ADC_ExternalTrigConv = TIM_MASTER_ADC;//trigger on rising edge of TIM_MASTER oc ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising; ADC_InitStructure.ADC_NbrOfConversion = 1;//ADC_ANZ;//I think this one is clear :p ADC_InitStructure.ADC_ScanConvMode = ENABLE;//The scan is configured in one channel @@ -162,7 +139,7 @@ void setup_res(){ DMA_Init(DMA2_Stream0, &DMA_InitStructure); //HAL Fast realtime irq 20kHz - NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; + NVIC_InitStructure.NVIC_IRQChannel = TIM_SLAVE_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; diff --git a/src/setup.h b/src/setup.h index c31f1ec3..77fa812d 100644 --- a/src/setup.h +++ b/src/setup.h @@ -12,7 +12,7 @@ #include "misc.h" #include "version.h" #include "common.h" -#include "defines_res.h" +#include "hw/hw.h" #define U_ID ((__IO uint32_t *)0x1FFF7A10) //sample times for F4: 3,15,28,56,84,112,144,480 diff --git a/stm32_flash.ld b/stm32_flash.ld index 3f1fd2f9..1ce0dfdb 100644 --- a/stm32_flash.ld +++ b/stm32_flash.ld @@ -46,7 +46,7 @@ MEMORY BOOT (rx) : ORIGIN = 0x08000000, LENGTH = 32K/* sector 0-1 */ PARAM0 (rx) : ORIGIN = 0x08008000, LENGTH = 16K/* sector 2 */ PARAM1 (rx) : ORIGIN = 0x0800C000, LENGTH = 16K/* sector 3 */ - FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 960K/* sector 4-11 */ + FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 448K/* sector 4-11 */ CCM (xrw) : ORIGIN = 0x10000000, LENGTH = 64k RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 112K/*SRAM1*/ RAM2(xrw) : ORIGIN = 0x2001C000, LENGTH = 16K/*SRAM2*/ diff --git a/timer.txt b/timer.txt index 61efcf84..f11d7fcf 100644 --- a/timer.txt +++ b/timer.txt @@ -10,28 +10,28 @@ d: dma request b: bits APB2 DMA2 168 MHz -TIM1(ac,16b,d(cc1,cc2,cc3,cc4,up,trgo,com),adc(cc1,cc2,cc3),itr(5,2,3,4)) enc_cmd -TIM8(ac,16b,d(cc1,cc2,cc3,cc4,up,trgo,com),adc(cc1,trgo), itr(1,2,4,5)) brake/fan pwm +TIM1(ac,16b,d(cc1,cc2,cc3,cc4,up,trgo,com),adc(cc1,cc2,cc3),itr(5,2,3,4)) enc_fb1,ch3->d54 enc_cmd +TIM8(ac,16b,d(cc1,cc2,cc3,cc4,up,trgo,com),adc(cc1,trgo), itr(1,2,4,5)) brake/fan pwm TIM9(gp2,16b,itr(2,3,10,11)) TIM10(gp3,16b) TIM11(gp3,16b) -USART1 io_header,cmd_rx -USART6 +USART1 cmd 422/485 io_header,cmd_rx +USART6 fb0 APB1 DMA1 84 MHz -TIM2(gp1,32b,d(up,cc1,cc2,cc3,cc4), adc(cc2,cc3,cc4,trgo),itr(1,8,3,4)) res_slave,res_oc -TIM3(gp1,16b,d(cc1,cc2,cc3,cc3,up,trgo),adc(cc1,trgo), itr(1,2,5,4)) enc_fb -TIM4(gp1,16b,d(cc1,cc2,cc3,up), adc(cc4), itr(1,2,3,8)) res_master,adc -TIM5(gp1,32b,d(cc1,cc2,cc3,cc4,trgo), adc(cc1,cc2,cc3), itr(2,3,4,8)) +TIM2(gp1,32b,d(up,cc1,cc2,cc3,cc4), adc(cc2,cc3,cc4,trgo),itr(1,8,3,4)) enc_cmd res_slave,res_oc +TIM3(gp1,16b,d(cc1,cc2,cc3,cc3,up,trgo),adc(cc1,trgo), itr(1,2,5,4)) adc master (cmd, pair foo) enc_fb +TIM4(gp1,16b,d(cc1,cc2,cc3,up), adc(cc4), itr(1,2,3,8)) enc_fb0,ch3->d54 res_master,adc +TIM5(gp1,32b,d(cc1,cc2,cc3,cc4,trgo), adc(cc1,cc2,cc3), itr(2,3,4,8)) adc slave/frt TIM6(ba,16b,d(up)) TIM7(ba,16b,d(up)) TIM12(gp2,16b, itr(4,5,13,14)) TIM13(gp3,16b) TIM14(gp3,16b) -USART2 f1_hv -USART3 fb -UART4 -UART5 cmd +USART2 hv f1_hv +USART3 fb1 fb +UART4 (fb0) +UART5 (fb0) cmd DMA mapping: @@ -47,3 +47,8 @@ s0 adc s1 yaskawa/probe s5 ext rx/sserial s7 ext tx + + +f3 hv +bemf+dclink 181.5 adc cycles = 2.5us sampling time +temp 61.5 cycles = 0.85us sampling time