紧急求助,关于用stm32f4discovery板子读PWM信号的占空比

[复制链接]
查看11 | 回复3 | 2021-1-27 07:17:20 | 显示全部楼层 |阅读模式
大家好,本人现在接到一个项目,目前做到用stm32f4discovery那块板子读取PWM信号的时候遇到了问题。我直接用官网上的源程序来实验,然后板子接一个信号发生器。但是在Debug模式下,我分步运行程序,但是测出来的周期和频率始终和信号发生器设置的不一样,而且数字差距非常大,占空比都超过100了,频率也读出来很不靠谱的值,这明显是错的。然后有时候进行了几十次的调试,发现偶尔会有一次能够出现正确的值。我现在是一头雾水,花了几天都没找到原因,这里恳请大家帮帮我吧,我不知道哪里出错了(理论上官方给出的代码肯定是没有问题的,但是在我这里就是读不出来正确的值)。不知道是不是哪里还少了什么重要的设置。
这里我附上代码,请大家帮帮忙,谢谢!
intmain(void)
{
/*TIMConfiguration*/
TIM_Config();
/*TIM4configuration:PWMInputmode------------------------
TheexternalsignalisconnectedtoTIM4CH2pin(PB.07),
TheRisingedgeisusedasactiveedge,
TheTIM4CCR2isusedtocomputethefrequencyvalue
TheTIM4CCR1isusedtocomputethedutycyclevalue
------------------------------------------------------------*/
TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;
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(TIM4,&TIM_ICInitStructure);
/*SelecttheTIM4InputTrigger:TI2FP2*/
TIM_SelectInputTrigger(TIM4,TIM_TS_TI2FP2);
/*SelecttheslaveMode:ResetMode*/
TIM_SelectSlaveMode(TIM4,TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);
/*TIMenablecounter*/
TIM_Cmd(TIM4,ENABLE);
/*EnabletheCC2InterruptRequest*/
TIM_ITConfig(TIM4,TIM_IT_CC2,ENABLE);
while(1);
}
voidTIM_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
NVIC_InitTypeDefNVIC_InitStructure;
/*TIM4clockenable*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
/*GPIOBclockenable*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
/*TIM4chennel2configuration:PB.07*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
/*ConnectTIMpintoAF2*/
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4);
/*EnabletheTIM4globalInterrupt*/
NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
这是中断服务程序:
voidTIM4_IRQHandler(void)
{
RCC_ClocksTypeDefRCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
/*ClearTIM4Capturecompareinterruptpendingbit*/
TIM_ClearITPendingBit(TIM4,TIM_IT_CC2);
/*GettheInputCapturevalue*/
IC2Value=TIM_GetCapture2(TIM4);
if(IC2Value!=0)
{
/*Dutycyclecomputation*/
DutyCycle=(TIM_GetCapture1(TIM4)*100)/IC2Value;
/*Frequencycomputation
TIM4counterclock=(RCC_Clocks.HCLK_Frequency)/2*/
Frequency=(RCC_Clocks.HCLK_Frequency)/2/IC2Value;
}
else
{
DutyCycle=0;
Frequency=0;
}
}
分 -->
回复

使用道具 举报

千问 | 2021-1-27 07:17:20 | 显示全部楼层
应该是没问题的,这个我们已经调过了
回复

使用道具 举报

千问 | 2021-1-27 07:17:20 | 显示全部楼层
对啊,我也很奇怪,为什么就是不能得到正确的值,理论上不应该会这样啊,就这么几句程序,但是就是找不到问题的原因,我不知道是不是还要设置什么参数才行?
回复

使用道具 举报

千问 | 2021-1-27 07:17:20 | 显示全部楼层
求帮助啊,谁能帮帮我啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行