📄 main.c
字号:
/******************************************************************************
* 文件名 : main.c
* 功能描述 : 主程序
******************************************************************************/
/* 头文件*/
#include "stm32f10x.h"
#include "stm32f10x_MClib.h"
#include "MC_Globals.h"
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void RCC_Configuration(void);
int main(void)
{
u8 i = 0;
#ifdef DEBUG
debug();
#endif
NVIC_Configuration(); /*使用片内NOR FLSAH */
GPIO_Configuration(); /*1个LED */
#ifdef THREE_SHUNT
SVPWM_3ShuntInit();
#elif defined ICS_SENSORS
SVPWM_IcsInit();
#elif defined SINGLE_SHUNT
/*设定使用单电阻模式,里面包含AD模块、TIM1模块、DMA模块的初始化*/
SVPWM_1ShuntInit();
#endif
#ifdef ENCODER
ENC_Init();
#ifdef OBSERVER_GAIN_TUNING
STO_StateObserverInterface_Init();
STO_Init();
#endif
#elif defined HALL_SENSORS/*设定HALL传感器模式*/
HALL_HallTimerInit();
#ifdef OBSERVER_GAIN_TUNING
STO_StateObserverInterface_Init();
STO_Init();
#endif
#elif defined NO_SPEED_SENSORS /*设定使用无传感器模式*/
STO_StateObserverInterface_Init();
STO_Init();
#ifdef VIEW_ENCODER_FEEDBACK
ENC_Init();
#elif defined VIEW_HALL_FEEDBACK
HALL_HallTimerInit();
#endif
#endif
#ifdef DAC_FUNCTIONALITY
MCDAC_Init();
#endif
TB_Init();
/*扭矩,磁通,速度PID初始化*/
PID_Init(&PID_Torque_InitStructure, &PID_Flux_InitStructure, &PID_Speed_InitStructure);
#ifdef BRAKE_RESISTOR
MCL_Brake_Init();/*刹车*/
#endif
/*初始化风扇和蜂鸣器*/
MCL_Fan_Init();
MCL_Bell_Init();
// MCL_Fault_Reset_Init();
/* 当内核停止工作时TIM1计数器时钟停止 */
DBGMCU_Config(DBGMCU_TIM1_STOP, ENABLE);
/*初始化母线电压及温度控制*/
MCL_Init_Arrays();
/*TFT_LCD初始化以及测试*/
LCD_Init();
LCD_Clear(Blue2);
LCD_SetTextColor(Blue);
LCD_SetBackColor(White);
Test_Color();
TB_Wait(2000); /*延时2S*/
AT45_INIT(); /*初始化AT45DB_FLASH汉字库接口*/
KEYS_SEG_Init(); /*初始化键盘和数码管*/
Display_Welcome_Message(); /*显示版权信息*/
while(1)
{
/*刷新LCD,刷新频率为0.5ms *400 = 200ms*/
Display_LCD();
/*检测母线电压和温度*/
MCL_ChkPowerStage();
/*键盘处理函数 */
KEYS_process();
switch (State)
{
case IDLE: /*Idle state ,按下SEL按钮,转到INIT状态*/
break;
case INIT:
/*初始化各个模块,最后打开AD转换中断,等待从中断里面完成系统启动*/
MCL_Init();
/*启动时间设为:500 * 2 * 0.5ms = 500ms*/
TB_Set_StartUp_Timeout(5000);
/*转到START状态*/
State = START;
break;
/*等待系统稳定转到RUN状态,启动是由AD中断子程序完成的,*/
/*使用HALL时,直接转到RUN。*/
case START:
break;
/*电机运行*/
case RUN:
#ifdef ENCODER
if(ENC_ErrorOnFeedback() == TRUE)
{
MCL_SetFault(SPEED_FEEDBACK);
}
#elif defined HALL_SENSORS
if(HALL_IsTimedOut())
{
MCL_SetFault(SPEED_FEEDBACK);
}
if (HALL_GetSpeed() == HALL_MAX_SPEED) /*通过DPP速度计算转子速度(HZ)*/
{
MCL_SetFault(SPEED_FEEDBACK);
}
#elif defined NO_SPEED_SENSORS
#endif
break;
case STOP: /*电机停止*/
/* PWM输出禁止 */
TIM_CtrlPWMOutputs(TIM1, DISABLE);
State = WAIT;
#ifdef THREE_SHUNT
SVPWM_3ShuntAdvCurrentReading(DISABLE);
#endif
#ifdef SINGLE_SHUNT
SVPWM_1ShuntAdvCurrentReading(DISABLE);
#endif
Stat_Volt_alfa_beta.qV_Component1 = Stat_Volt_alfa_beta.qV_Component2 = 0;
#ifdef ICS_SENSORS
SVPWM_IcsCalcDutyCycles(Stat_Volt_alfa_beta);
#elif defined THREE_SHUNT
SVPWM_3ShuntCalcDutyCycles(Stat_Volt_alfa_beta);
#endif
TB_Set_Delay_500us(1000);
break;
case WAIT:
if (TB_Delay_IsElapsed() == TRUE)
{
#ifdef ENCODER
if(ENC_Get_Mechanical_Speed() ==0)
{
State = IDLE;
}
#elif defined HALL_SENSORS
if (HALL_IsTimedOut())
{
State=IDLE;
}
#elif defined NO_SPEED_SENSORS
STO_InitSpeedBuffer();
State=IDLE;
#endif
}
break;
case FAULT:
/*如果能够复位FAULT标志,那么系统转到IDLE状态*/
if (MCL_ClearFault() == TRUE)
{
if(wGlobal_Flags & SPEED_CONTROL == SPEED_CONTROL)
{
bMenu_index = CONTROL_MODE_MENU_1;
}
else
{
bMenu_index = CONTROL_MODE_MENU_6;
}
#if defined NO_SPEED_SENSORS
STO_InitSpeedBuffer();
#endif
State = IDLE;
wGlobal_Flags |= FIRST_START;
}
break;
default:
break;
}
}
}
/*******************************************************************************
* 函数名 : GPIO_Configuration
* 功能描述 : 配置GPIO引脚TIM1 Pins.
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void GPIO_Configuration(void)
{
u8 temp = 0xff;
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能GPIO时钟 */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE);
/*SPI1口重映射*/
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_DeInit(GPIOC);
GPIO_StructInit(&GPIO_InitStructure); /*3个LED*/
/* 配置PC10,PC11,PC12为推挽输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; /*DIN4*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/*浮空输入*/
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_DeInit(GPIOA);
GPIO_StructInit(&GPIO_InitStructure); /*1个LED*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;/*推挽输出*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_DeInit(GPIOB);
GPIO_StructInit(&GPIO_InitStructure); /*DIN3*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/*浮空输入*/
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_DeInit(GPIOD);
GPIO_StructInit(&GPIO_InitStructure); /*DIN1,DIN2*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/*浮空输入*/
GPIO_Init(GPIOD, &GPIO_InitStructure);
/*关闭LCD背光 */
GPIO_ResetBits(GPIOD, GPIO_Pin_14);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;/*推挽输出*/
GPIO_Init(GPIOD, &GPIO_InitStructure);
/*输入检测第一位*/
if((GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_8))==RESET)
GPIO_ResetBits(GPIOA, GPIO_Pin_15);
else
GPIO_SetBits(GPIOA, GPIO_Pin_15);
/*输入检测第二位*/
if((GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9))==RESET)
GPIO_ResetBits(GPIOC, GPIO_Pin_10);
else
GPIO_SetBits(GPIOC, GPIO_Pin_10);
/*输入检测第三位*/
if((GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9))==RESET)
GPIO_ResetBits(GPIOC, GPIO_Pin_11);
else
GPIO_SetBits(GPIOC, GPIO_Pin_11);
/*输入检测第四位*/
if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13))==RESET)
GPIO_ResetBits(GPIOC, GPIO_Pin_12);
else
GPIO_SetBits(GPIOC, GPIO_Pin_12);
}
/*******************************************************************************
* 函数名 : RCC_Configuration
* 功能描述 : 配置系统和复位时钟.
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
/*******************************************************************************
* 函数名 : NVIC_Configuration
* 功能描述 : 配置向量地址.
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
#ifdef DEBUG
/*******************************************************************************
* 函数名 : assert_failed
* 功能描述 : Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* 输入 : - file: pointer to the source file name
* - line: assert_param error line source number
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void assert_failed(u8* file, u32 line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
//printf("Wrong parameters value: file %s on line %d\r\n", file, line);
}
}
#endif
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -