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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版