/** * @brief Main function * @return None */ int main(void) { COMM_Init(COMM_BAUD_RATE); // initialize communication with PC println("***********************************************"); println("Starting program"); // Print a string to terminal TIMER_Init(SYSTICK_FREQ); // Initialize timer // Add a soft timer with callback running every 1000ms int8_t timerID = TIMER_AddSoftTimer(1000, softTimerCallback); TIMER_StartSoftTimer(timerID); // start the timer LED_Init(LED0); // Add an LED LED_Init(LED1); // Add an LED LED_Init(LED2); // Add an LED LED_Init(LED3); // Add an LED LED_Init(LED5); // Add nonexising LED for test LED_ChangeState(LED5, LED_ON); KEYS_Init(); // Initialize matrix keyboard uint8_t buf[255]; // buffer for receiving commands from PC uint8_t len; // length of command // test another way of measuring time delays uint32_t softTimer = TIMER_GetTime(); // get start time for delay SD_Init(); // FAT_Init(SD_Init, SD_ReadSectors, SD_WriteSectors); // Initialize USB device stack USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_MSC_cb, &USR_cb); while (1) { // test delay method if (TIMER_DelayTimer(1000, softTimer)) { LED_Toggle(LED3); softTimer = TIMER_GetTime(); // get start time for delay } // check for new frames from PC if (!COMM_GetFrame(buf, &len)) { println("Got frame of length %d: %s", (int)len, (char*)buf); // control LED0 from terminal if (!strcmp((char*)buf, ":LED0 ON")) { LED_ChangeState(LED0, LED_ON); } if (!strcmp((char*)buf, ":LED0 OFF")) { LED_ChangeState(LED0, LED_OFF); } } TIMER_SoftTimersUpdate(); // run timers key = KEYS_Update(); // run keyboard } }
/******************************************************************************* * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None *******************************************************************************/ int main(void) { SystemInit(); /*速度反馈初始化*/ ENC_Init( ); /*电流反馈初始化*/ SVPWM_3ShuntInit(); /*时基初始化,并启动TIM6计算速度,初始化PID*/ TB_Init( ); Tim6_Init( ); PID_Init(&PID_Torque_InitStructure, &PID_Flux_InitStructure, &PID_Speed_InitStructure); /*温度,电压数组初始化*/ MCL_Init_Arrays(); /*交互界面初始化*/ KEYS_Init( ); LCD_Display_init(); /*-------------------*/ Res_f=1; //上电完成 //串口示波器初始化 usart_init(115200); while(1) { /*UI显示,以及电源报警,用户管理*/ Display_LCD( ); MCL_ChkPowerStage( ); KEYS_process( ); /*状态机开启运行*/ switch (State) { case IDLE: //通过sel按键进入INIT ,在WAIT和FAULT中进入IDEL break; case INIT: MCL_Init( );//初始化电机控制层 TB_Set_StartUp_Timeout(3000); State = START; break; case START: //passage to state RUN is performed by startup functions; break; case RUN: //电机运行过程中,检测速度反馈是否存在问题 if(ENC_ErrorOnFeedback() == TRUE) { MCL_SetFault(SPEED_FEEDBACK); } break; case STOP: //关闭TIM1的输出,状态转为等待,停止电流检测,设置Valpha和Vbeta为0,计算三相占空比 TIM_CtrlPWMOutputs(TIM1, DISABLE); State = WAIT; SVPWM_3ShuntAdvCurrentReading(DISABLE); Stat_Volt_alfa_beta.qV_Component1 = Stat_Volt_alfa_beta.qV_Component2 = 0; SVPWM_3ShuntCalcDutyCycles(Stat_Volt_alfa_beta); TB_Set_Delay_500us(2000); // 1 sec delay break; case WAIT: // 等待速度为零时,将状态转为IDEL if (TB_Delay_IsElapsed( ) == TRUE) { if(ENC_Get_Mechanical_Speed( ) ==0) { State = IDLE; } } break; case FAULT: //状态变为IDEL,全局变量设为第一次启动 if (MCL_ClearFault( ) == TRUE) { if(wGlobal_Flags & SPEED_CONTROL == SPEED_CONTROL) { //速度控制模式 bMenu_index = CONTROL_MODE_MENU_1; } else { //力矩控制模式 bMenu_index = CONTROL_MODE_MENU_6; } State = IDLE; wGlobal_Flags |= FIRST_START; Hall_Start_flag=0; } break; default: break; } usart_watcher(Speed_Iq_Id_watch); /********End of Usart_watch**************/ } }