新手上路
- 积分
- 22
- 金钱
- 22
- 注册时间
- 2016-1-20
- 在线时间
- 5 小时
|
1金钱
[mw_shl_code=c,true]void TIM1_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
Pwm_period_num = 7200 - 1;
//Pwm_period_num = 4096 - 1; //2ο¼stim32f10x_stdperiph_example_6steps
/*-----------------------Clock and GPIOConfiguration------------------------------*/
#ifdef GPIO_TIM1_CHx_REMAP
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE); //TIM1íêè«ÖØó3éä
/*------------------------TIM_CHx Configruation------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/*------------------------TIM_CHxN Configruation------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/*------------------------BKIN Configruation----------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
#else
/*****************************************************************************
**PA82»DèòaÖØó3éäÖ±½ó×÷ÎaTIM1_CH1μÄòy½Å,óéóúPA9¡¢PA10òѾ-±»UART1ê1óã¬1ê¶ø2»Äü
**×÷ÎaTIM1_CH2¡¢TIM1_CH3òy½Åà′ê1óã¬′Ë′|óÃóú2aêÔTIM1_PWM1ÅäÖÃêÇ·ñÕyè·¡£
*******************************************************************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
#endif
/*------------------------TIM_Counter Configruation------------------------*/
TIM_TimeBaseStructure.TIM_Period = Pwm_period_num;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/*------------------------PWM Configruation---------------------------------*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
// TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //2ο¼stim32f10x_stdperiph_example_6steps
/*-----------èç1ûTIM_OutputStateûóDê1ÄüPWM2»ÄüÕy3£êä3ö WMDÅoÅ---------------*/
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //±è½Ïêä3öê1Äü
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; //ê1Äü»¥21¶Ëêä3ö
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //êä3ö¼«DÔ:TIMêä3ö±è½Ï¼«DÔ¸ß
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //»¥21¶Ëêä3ö¼«DÔ
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //ËàÇøoóêä3ö×′ì¬
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; //ËàÇøoó»¥21¶Ëêä3ö×′ì¬
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_Pulse = 360 - 1; //éèÖÃÕ¼¿Õ±èê±¼ä
TIM_OCInitStructure.TIM_Pulse = 360 - 1;
TIM_OCInitStructure.TIM_Pulse = 360 - 1;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
/*------------------------DeadTime and Break Configruation---------------------*/
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; //ÔËDDÄ£ê½ÏÂêä3öÑ¡Ôñ
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; //¿ÕÏDÄ£ê½ÏÂêä3öÑ¡Ôñ
TIM_BDTRInitStructure.TIM_LOCKLevel= TIM_LOCKLevel_OFF; //Ëø¶¨éèÖÃ
TIM_BDTRInitStructure.TIM_DeadTime = 0x78; //ËàÇøê±¼ä
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable; //2ο¼stim32f10x_stdperiph_example_6steps
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low; //é23μêäè뼫DÔ
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; //×Ô¶ˉêä3öê1Äü
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Trigger);
TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);
TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1, ENABLE);
TIM_ITConfig(TIM1,TIM_IT_Break|TIM_IT_COM|TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3, ENABLE);
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
/********************************************
**********************************************/
void BLDC_Hall_Convert(u16 step)
{
printf("step is %d\r\n", step);
switch(step)
{
/*----CH1-PWM CH1N-High CH2-High CH2N-Low CH3-Low CH3N-Low----*/
case 1:
TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
TIM_ForcedOC2Config(TIM1,TIM_ForcedAction_Active);
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
TIM_ForcedOC3Config(TIM1,TIM_ForcedAction_InActive);
break;
/*----CH1-PWM CH1N-High CH2-Low CH2N-Low CH3-High CH3N-Low----*/
case 2:
TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
TIM_ForcedOC2Config(TIM1,TIM_ForcedAction_InActive);
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);
TIM_ForcedOC3Config(TIM1,TIM_ForcedAction_Active);
break;
/*----CH1-Low CH1N-Low CH2-PWM CH2N-High CH3-High CH3N-Low----*/
case 3:
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_InActive);
TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);
TIM_ForcedOC3Config(TIM1,TIM_ForcedAction_Active);
break;
/*----CH1-High CH1N-Low CH2-PWM CH2N-High CH3-Low CH3N-Low----*/
case 4:
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);
TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_Active);
TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
TIM_ForcedOC3Config(TIM1,TIM_ForcedAction_InActive);
break;
/*----CH1-High CH1N-Low CH2-Low CH2N-Low CH3-PWM CH3N-High----*/
case 5:
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);
TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_Active);
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
TIM_ForcedOC2Config(TIM1,TIM_ForcedAction_InActive);
TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
break;
case 6:
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_InActive);
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
TIM_ForcedOC2Config(TIM1,TIM_ForcedAction_Active);
TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
break;
}
}
/********************************************
*
**********************************************/
void TIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;//êäèë2¶»ñ
TIM_OCInitTypeDef TIM_OCInitStructure;//±è½Ïêä3ö
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ê1ÄüTIM3¶¨ê±Æ÷ê±Öó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7; //PA6Îa±àÂëUêäèë,PA7Îa±àÂëvêäèë
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ; //éèÖÃÎa¸′óø¡¿Õêä3ö
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PB0Îa±àÂëwêäèë
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ; //éèÖø′óø¡¿Õêä3ö
GPIO_Init(GPIOB,&GPIO_InitStructure);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 0xffff; // ¼Çμ½10000?1s
TIM_TimeBaseStructure.TIM_Prescaler = 720-1;//100usò»′Î
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //éÏéyÑØ¼Æêy
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//½«TIM3μÄ2í¨μàÅäÖÃ3éPWM2Ä£ê½
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse = 1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//±è½Ïêä3ö¸ßμçÆ½
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
//½«TIM3μÄ1í¨μàÅäÖÃ3éêäèë2¶»ñÄ£ê½
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; // Ñ¡Ôñí¨μà1Îaêäèë2¶»ñí¨μà
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising|TIM_ICPolarity_Falling; //Ñ¡Ôñ
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC; //Direct connecte
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //register every rising edages
TIM_ICInitStructure.TIM_ICFilter = 0x03; //used 3 period to wait for Ïμí3DÅoŽóêÕÕy3£
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_SelectHallSensor(TIM3, ENABLE); //′ò¿a»ô¶û½ó¿ú£¬êμ¼êé϶¨ê±Æ÷í¨μàμÄêäèëòì»òÃÅ
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1F_ED); //Ñ¡Ôñê±Öó′¥·¢Ô′,TIM TL1 ±ßÑØì½2aÆ÷
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//¸′λÄ£ê½
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //Æô¶ˉ¶¨ê±Æ÷μĸ′λÄ£ê½
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref);//Ñ¡ÔñOC2REF×÷ÎaTRGOéÏμÄ′¥·¢êä3ö
TIM_SetCompare1(TIM3, 0); //éèÖÃ2¶»ñ¼ÆêyÆ÷3õÖμ
TIM_ITConfig(TIM3, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_Update, ENABLE); //¿aÆôí¨μà1μÄ2¶»ñÖD¶Ï,oíí¨μà2μıè½ÏÆ¥ÅäÖD¶Ï
/* TIM3 enable counter */
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
u16 holl_value=0;
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//TIM1é23μÖD¶Ï
NVIC_InitStructure.NVIC_IRQChannel =TIM1_BRK_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//TIM1′¥·¢comê¼t
NVIC_InitStructure.NVIC_IRQChannel =TIM1_TRG_COM_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//TIM1òç3öÖD¶Ï,
NVIC_InitStructure.NVIC_IRQChannel =TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//TIM1òç3öÖD¶ÏÅäÖÃ,
NVIC_InitStructure.NVIC_IRQChannel =TIM1_CC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//TIM3í¨μà1êäèë2¶»ñÖD¶Ïoíí¨μà2μıè½ÏÆ¥ÅäÖD¶Ï
NVIC_InitStructure.NVIC_IRQChannel =TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_Init(&NVIC_InitStructure);
}
void TIM1_BRK_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1, TIM_IT_Break) != RESET)
{
TIM_ClearITPendingBit(TIM1 , TIM_IT_Break);
// fo_deal();
// m_fo = 1;//fo????
}
}
void TIM1_CC_IRQHandler(void)
{
//±è½Ï′|àí,AD2éÑù
if(TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
// ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
if(TIM_GetITStatus(TIM1, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC2);
// ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
if(TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC3);
}
}
void TIM1_TRG_COM_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_COM);
}
void TIM1_UP_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM1 , TIM_IT_Update);
}
}
void TIM3_IRQHandler(void)
{
//??????,?????????
if(TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
holl_value = 0;
holl_value = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)<<2 | GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)<<1 | GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)<<0;
printf("holl_value is %d\r\n", holl_value);
}
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
BLDC_Hall_Convert(holl_value);
}
if(TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
}
}
[/mw_shl_code] |
|