|
不知道为什么,我用tim9做PWM输入捕获时,定时器会自己停止。哪位大神帮忙看看呀?
中断里面做PWM频率输出和占空比输出。每次进入中断都要重新打开定时器TIM_Cmd(ADVANCE_TIM, ENABLE);,不然捕获为零。
void ADVANCE_TIM_IRQHandler (void)
{
/* Çå3y¶¨ê±Æ÷2¶»ñ/±è½Ï1ÖD¶Ï */
TIM_ClearITPendingBit(ADVANCE_TIM, TIM_IT_CC1);
TIM_Cmd(ADVANCE_TIM, ENABLE);
/* »ñè¡êäèë2¶»ñÖμ */
IC1Value = TIM_GetCapture1(ADVANCE_TIM);
IC2Value = TIM_GetCapture2(ADVANCE_TIM);
//printf("IC1Value = %d IC2Value = %d ",IC1Value,IC2Value);
if (IC1Value != 0)
{
/* Õ¼¿Õ±è¼ÆËã */
DutyCycle = (float)(IC2Value * 100) / IC1Value;
/* ÆμÂê¼ÆËã */
Frequency = 180000000/30/(float)IC1Value;
printf("Õ¼¿Õ±è£o%0.2f%% ÆμÂê£o%0.2fHz\n",DutyCycle,Frequency);
}
else
{
DutyCycle = 0;
Frequency = 0;
}
}
定时器设置如下:
static void TIMx_GPIO_Config(void)
{
/*¶¨òåò»¸öGPIO_InitTypeDefààDíμĽá11ìå*/
GPIO_InitTypeDef GPIO_InitStructure;
/*¿aÆôLEDÏà1ØμÄGPIOíaéèê±Öó*/
// RCC_AHB1PeriphClockCmd (GENERAL_OCPWM_GPIO_CLK, ENABLE);
RCC_AHB1PeriphClockCmd (ADVANCE_ICPWM_GPIO_CLK, ENABLE);
/* ¶¨ê±Æ÷¸′óÃòy½Å */
// GPIO_PinAFConfig(GENERAL_OCPWM_GPIO_PORT,GENERAL_OCPWM_PINSOURCE,GENERAL_OCPWM_AF);
GPIO_PinAFConfig(ADVANCE_ICPWM_GPIO_PORT,ADVANCE_ICPWM_PINSOURCE,ADVANCE_ICPWM_AF);
/* í¨óö¨ê±Æ÷PWMêä3öòy½Å */
// GPIO_InitStructure.GPIO_Pin = GENERAL_OCPWM_PIN;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
// GPIO_Init(GENERAL_OCPWM_GPIO_PORT, &GPIO_InitStructure);
/* ¸ß¼¶¿ØÖƶ¨ê±Æ÷PWMêäèë2¶»ñòy½Å */
GPIO_InitStructure.GPIO_Pin = ADVANCE_ICPWM_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(ADVANCE_ICPWM_GPIO_PORT, &GPIO_InitStructure);
}
static void TIMx_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// éèÖÃÖD¶Ï×éÎa0
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
// éèÖÃÖD¶Ïà′Ô′
NVIC_InitStructure.NVIC_IRQChannel = ADVANCE_TIM_IRQn;
// éèÖÃÇàÕ¼óÅÏè¼¶
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
// éèÖÃ×óóÅÏè¼¶
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
static void TIM_PWMINPUT_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
// ¿aÆôTIMx_CLK,x[1,8]
RCC_APB2PeriphClockCmd(ADVANCE_TIM_CLK, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 0xFFFF-1;
// ¸ß¼¶¿ØÖƶ¨ê±Æ÷ê±ÖóÔ′TIMxCLK = HCLK=180MHz
// é趨¶¨ê±Æ÷ÆμÂêÎa=TIMxCLK/(TIM_Prescaler+1)=100KHz
TIM_TimeBaseStructure.TIM_Prescaler = 30-1;
// ¼Æêy·½ê½
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
// 3õê¼»ˉ¶¨ê±Æ÷TIMx, x[1,8]
TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);
/* IC12¶»ñ£oéÏéyÑØ′¥·¢ TI1FP1 */
TIM_ICInitStructure.TIM_Channel = ADVANCE_IC1PWM_CHANNEL;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);
// /* IC22¶»ñ£oϽμÑØ′¥·¢ TI1FP2 */
// TIM_ICInitStructure.TIM_Channel = ADVANCE_IC2PWM_CHANNEL;
// TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
// TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
// TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
// TIM_ICInitStructure.TIM_ICFilter = 0x0;
// TIM_PWMIConfig(ADVANCE_TIM, &TIM_ICInitStructure);
/* Ñ¡Ôñ¶¨ê±Æ÷êäèë′¥·¢: TI1FP1 */
TIM_SelectInputTrigger(ADVANCE_TIM, TIM_TS_TI1FP1);
/* Ñ¡Ôñ′óÄ£ê½: ¸′λÄ£ê½ */
TIM_SelectSlaveMode(ADVANCE_TIM, TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(ADVANCE_TIM,TIM_MasterSlaveMode_Enable);
/* ê1Äü¸ß¼¶¿ØÖƶ¨ê±Æ÷ */
TIM_Cmd(ADVANCE_TIM, ENABLE);
/* ê1Äü2¶»ñ/±è½Ï2ÖD¶ÏÇëÇó */
TIM_ITConfig(ADVANCE_TIM, TIM_IT_CC1, ENABLE);
}
void TIMx_Configuration(void)
{
TIMx_GPIO_Config();
TIMx_NVIC_Configuration();
//TIM_PWMOUTPUT_Config();
TIM_PWMINPUT_Config();
}
与之相关的是TIM3输出一个控制一个模块使他输入一个PWM波形用TIM9来测量。 |
|