initial v4 port

This commit is contained in:
Rene Hopf
2017-01-03 22:51:05 +01:00
parent 20cf7f07a2
commit e6241231ee
15 changed files with 506 additions and 398 deletions
+1 -1
View File
@@ -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
+3 -11
View File
@@ -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;
+45 -47
View File
@@ -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;
+19 -20
View File
@@ -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;
+8 -15
View File
@@ -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;
+168
View File
@@ -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;
+31 -15
View File
@@ -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;
+1 -1
View File
@@ -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;
-213
View File
@@ -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
+169
View File
@@ -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
+20 -16
View File
@@ -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");
+22 -45
View File
@@ -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;
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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*/
+17 -12
View File
@@ -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