// // Created by ZK on 2023/3/10. // #include "APP_Main.h" #include "Controller/Controller.h" #include "PreDrive.h" float32_t NowAngle; tData Data; void APP_Init() { __HAL_SPI_ENABLE(&hspi1); HAL_Delay(10); Data.Angle.EncoderModel = MT6816; Data_Init(&Data); // NowAngle = Data.Angle.getAngle(); //开启内部运放 HAL_OPAMP_Start(&hopamp1); HAL_OPAMP_Start(&hopamp2); HAL_OPAMP_Start(&hopamp3); HAL_Delay(10); while (InteriorADC_Init()); HAL_ADC_Start_DMA(&hadc1, (uint32_t *) adc1_RegularBuf, 2); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3); HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1); HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2); HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3); HAL_Delay(10); __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); HAL_Delay(10); PreDrive_Init(); GPIOE->BSRR = 1 << 7; HAL_Delay(10); TIM1->CCR1 = 0; TIM1->CCR2 = 0; TIM1->CCR3 = 0; } uint16_t ADC_VAL1, ADC_VAL2; //MCU内部温度传感器 #define TS_CAL1 ((uint16_t*) ((uint32_t) 0x1FFF75A8)) // 30摄氏度时的MCU内部温度传感器校准值 #define TS_CAL2 ((uint16_t*) ((uint32_t) 0x1FFF75CA)) //110摄氏度时的MCU内部温度传感器校准值 /*滑动平均滤波器长度*/ #define MVF_LENGTH 128 float moving_average_filtre(float xn) { static int index = -1; static float buffer[MVF_LENGTH]; static float sum = 0; float yn = 0; int i = 0; if (index == -1) { //初始化 for (i = 0; i < MVF_LENGTH; i++) { buffer[i] = xn; } sum = xn * MVF_LENGTH; index = 0; } else { sum -= buffer[index]; buffer[index] = xn; sum += xn; index++; if (index >= MVF_LENGTH) { index = 0; } } yn = sum / MVF_LENGTH; return yn; } //float Current_Temp1, ii=0.0f, iii=0.0f; //#define PWM_FREQUENCY 24000 //#define CURRENT_MEASURE_HZ PWM_FREQUENCY //#define CURRENT_MEASURE_PERIOD (float) (1.0f / (float) CURRENT_MEASURE_HZ) // //#define TIMER0_CLK_MHz 168 //#define PWM_PERIOD_CYCLES (uint16_t)((TIMER0_CLK_MHz * (uint32_t) 1000000u / ((uint32_t) (PWM_FREQUENCY))) & 0xFFFE) //#define HALF_PWM_PERIOD_CYCLES (uint16_t)(PWM_PERIOD_CYCLES / 2U) void APP_Main() { // TIM1->CCR1 = 0; // TIM1->CCR2 = 0; // TIM1->CCR3 = 100; // TIM1->CCR4 = 10; // ii += 0.000001f; //// if (ii == 0.1f) { ii = 0.1f-0.00001f; } // iii += 0.03f; // if (iii >= 360.0f) { iii = 0.0f; } // Current_Temp = ((110.0 - 30) / (*TS_CAL2 - *TS_CAL1) * (int16_t) (adc1_RegularBuf[1] * 3.3 / 3.0 - *TS_CAL1)) + 30; // Current_Temp1 = moving_average_filtre(Current_Temp * sinf(ii)); // SendCurrent_Vofa(Current_Temp * sinf(ii), Current_Temp1, 0); // Generate(0, 0.02f, iii); // SendCurrent_Vofa(FOC.dtc_a, iii,(uint16_t) (FOC.dtc_a * (float) HALF_PWM_PERIOD_CYCLES)); // TIM1->CCR1 = (uint16_t) (FOC.dtc_a * (float) HALF_PWM_PERIOD_CYCLES); // TIM1->CCR2 = (uint16_t) (FOC.dtc_b * (float) HALF_PWM_PERIOD_CYCLES); // TIM1->CCR3 = (uint16_t) (FOC.dtc_c * (float) HALF_PWM_PERIOD_CYCLES); // SendCurrent_Vofa(FOC.dtc_a, ii,0); // usb_printf("%f\r\n", NowAngle); // usb_printf("CoreTemp:%d,%d, %.2f\r\n", adc1_RegularBuf[0], adc1_RegularBuf[1], Current_Temp); // usb_printf("PhaseCurrent:%d, %d, %d\r\n", ADC1->JDR1 - 2040, ADC2->JDR1 - 2024, ADC1->JDR2 - 2024); // usb_printf("PhaseVoltage:%d, %d, %d\r\n", ADC2->JDR2, ADC2->JDR3, ADC2->JDR4); // SendCurrent_Vofa(FOC.dtc_a, FOC.dtc_b,FOC.dtc_c); // SendCurrent_Vofa(ADC1->JDR1, FOC.dtc_a, 0 ); // CurrA = ia/4096*3.3/0.005f/7.33333; // SendCurrent_Vofa((ADC1->JDR1)/4096.0f*3.3f/0.005f/7.33333f, ADC2->JDR1, ADC1->JDR2); // usb_printf("PhaseVoltage:%d\r\n", (ADC1->JDR1-2048.0f)/4096.0f*3.3f/0.005f/7.33333f); // NowAngle = Data.Angle.getAngle(); // SendCurrent_Vofa(FOC.dtc_a, NowAngle, 0); // HAL_Delay(10); } //软件循环读取ADC // HAL_ADC_Start(&hadc1); // if (HAL_OK == HAL_ADC_PollForConversion(&hadc1, 50)) { // ADC_VAL1 = HAL_ADC_GetValue(&hadc1); // }