STM32 F407 测量高频方波占空比问题

2019-07-20 01:49发布

  各位老哥,我现在想测一个频率在1Mhz左右的方波的占空比,方波是由PWM输出产生,经示波器测量波形良好。我用F407如果使用输入捕获最高只能得到500Khz左右方波的占空比,再高频率的话占空比误差较大,所以想着用别的办法。目前的想法是使用两个外中断和一个定时器,两个外中断分别为上升和下降沿触发,第一个使用上升沿触发,将定时器计数值置为0,打开定时器计数,然后第二个外中断下降沿触发,关闭定时器,再读出此时的计数值,经过运算便可得到占空比。
  通过调试发现,两个外中断只能触发优先级高的那个,所以一共只会触发这一个中断,接线是从一个PWM输出口连接到另外两个不同的外中断IO口。现在这个问题令我百思不得其解,不知道到底哪里出错了,或者说不能这样做?两个IO口我初始化为输入模式,上拉。代码如下:
void LED_Init(void)
{             
  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);                  

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//输入对应引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//输入对应引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
}

void EXTIX_Init(void)
{
        EXTI_InitTypeDef   EXTI_InitStructure;
        NVIC_InitTypeDef   NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
       

        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource2);//PA2 连接到中断线2
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource4);//PA4 连接到中断线4


        /* 配置EXTI_Line2*/
        EXTI_InitStructure.EXTI_Line = EXTI_Line2;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  EXTI_Init(&EXTI_InitStructure);//配置
        /* 配置EXTI_Line3*/
        EXTI_InitStructure.EXTI_Line = EXTI_Line4;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  EXTI_Init(&EXTI_InitStructure);//配置

        NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//外部中断2
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置
       
       
        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//外部中断4
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;//子优先级1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置


}
//外部中断2服务程序 上升沿触发
void EXTI2_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
        {
                EXTI_ClearITPendingBit(EXTI_Line2);//清除LINE2上的中断标志位
                TIM5->CNT=0;   //计数器清零
                TIM_Cmd(TIM5, ENABLE); //开始计数
        }
}
//外部中断4服务程序 下降沿触发
void EXTI4_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line4)!=RESET)
        {
                EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位
                TIM_Cmd(TIM5, DISABLE); //关闭计数
                capture_value = TIM_GetCounter(TIM5);
        }
}

  
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-07-20 07:40
 精彩回答 2  元偷偷看……
zxy543040659
2楼-- · 2019-07-20 10:04
 精彩回答 2  元偷偷看……
ndzhzsdw
3楼-- · 2019-07-20 10:10
帮顶一下
正点原子
4楼-- · 2019-07-20 14:20
 精彩回答 2  元偷偷看……
zxy543040659
5楼-- · 2019-07-20 15:20
正点原子 发表于 2018-7-11 02:06
试试PWM输入模式。可以直接用定时器测量PWM的占空比。
这样你只需要处理一次中断,就可以得到占空比。

原子哥  我想测得2M频率脉冲的占空比及频率,PWM输入模式会不会出现高频时捕获不准的问题,我之前使用输入捕获,当频率大于500KHZ时,同时测占空比和频率,频率可以测出来但是占空比误差很大!
zxy543040659
6楼-- · 2019-07-20 18:24
最后使用ADC+DMA实现了高频占空比的测量。感谢原子哥的回复

一周热门 更多>