你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

IO口外部中断计算PWM波形的占空比和频率

[复制链接]
flyinggirlxhx 提问时间:2016-7-6 09:14 /
大家好!
最近开始接触STM32F103ZE开发板,计划利用IO口外部中断的方法计算PWM波形的占空比和频率。出现了一些问题,还请大神们指点一二,万分感激!!!!
EXTI初始化设置如下:
EXTI_InitTypeDef EXTI_InitStructure;
void EXTI1_Config_Rising(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //ʹÄܸ´Óù¦ÄÜʱÖÓ

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);
EXTI_InitStructure.EXTI_Line=EXTI_Line1;//PC1,EXTI1
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
#if 1
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//双边沿触发
#else
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发
#endif

EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

首先,采用双边沿触发,进入中断之后判断引脚电平从而再次确定是哪种边沿触发。代码如下,但是一旦PWM波形的频率和占空比较低的话,此方法完全无效
TIMER_CNT Count[2]={0};//Count[0] is sample value, Count[1] is return value.
u16 TITimer=0;
void EXTI1_IRQHandler(void)
{
//using EXTI_Trigger_Rising_Falling as EXTI source.
if (EXTI_GetITStatus(EXTI_Line1) != RESET)
{
   if (PCin(PWM_PIN))//rising edge
   {
    TITimer++;
    if(TITimer==1)//with interrupt
    {
           TIM_SetCounter(TIM2,0);//set count=0, and start count timer.
    }
    else if(TITimer==3)
    {
          Count[0].Cnt[1]=TIM_GetCounter(TIM2);//周期时间
        Count[1]=Count[0];
          TITimer=0;
    }
   }
   else   //falling edge
   {
    if(TITimer==2)
    {
          Count[0].Cnt[0]=TIM_GetCounter(TIM2);//高电平持续时间
   }
   }
   EXTI_ClearITPendingBit(EXTI_Line1);
}
//占空比=Count[0].Cnt[0]/Count[0].Cnt[1]

如果采用单边沿触发的方法,在中断处理函数里面转换触发边沿,断点测试出来是触发边沿转换无效,所以,测得的周期是实际的2倍,也不能检测到另一种边沿。下面代码:
TIMER_CNT Count[2]={0};//Count[0] is sample value, Count[1] is return value.
u8 EXTI1_STA = 0;
void EXTI1_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line1) != RESET)
{
   if(EXTI1_STA == 0)//1st risng edge interrupt
   {
    TIM_SetCounter(TIM2,0);
    EXTI1_STA =0x40;
    EXTI1_Config_Falling();
   }
   else if(EXTI1_STA & 0x40) //2ed falling edge,无法进入!!!!!!
  {
    Count[0].Cnt[0]=TIM_GetCounter(TIM2);
    EXTI1_STA =0x80;
    EXTI1_Config_Rising();
   }
   else if(EXTI1_STA & 0xC0)//3rd rising edge
   {
    Count[0].Cnt[1]=TIM_GetCounter(TIM2);
    Count[1]=Count[0];
    EXTI1_STA=0;
   }
   //EXTI_Init(&EXTI_InitStructure);
   EXTI_ClearITPendingBit(EXTI_Line1);
}

收藏 评论0 发布时间:2016-7-6 09:14

举报

0个回答

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版