OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5627|回复: 8

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

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-7-10
在线时间
6 小时
发表于 2018-7-10 17:39:18 | 显示全部楼层 |阅读模式
5金钱
  各位老哥,我现在想测一个频率在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);
        }
}

  

最佳答案

查看完整内容[请看2#楼]

2M应该没问题的,你不要持续测量,单词测量即可出结果。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-7-10 17:39:19 | 显示全部楼层
zxy543040659 发表于 2018-7-13 23:47
原子哥  我想测得2M频率脉冲的占空比及频率,PWM输入模式会不会出现高频时捕获不准的问题,我之前使用输 ...

2M应该没问题的,你不要持续测量,单词测量即可出结果。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-7-10
在线时间
6 小时
 楼主| 发表于 2018-7-10 23:12:48 | 显示全部楼层
自顶一下啊
回复

使用道具 举报

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
发表于 2018-7-10 23:49:12 | 显示全部楼层
帮顶一下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-7-11 02:06:44 | 显示全部楼层
试试PWM输入模式。可以直接用定时器测量PWM的占空比。
这样你只需要处理一次中断,就可以得到占空比。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-7-10
在线时间
6 小时
 楼主| 发表于 2018-7-13 23:47:56 | 显示全部楼层
正点原子 发表于 2018-7-11 02:06
试试PWM输入模式。可以直接用定时器测量PWM的占空比。
这样你只需要处理一次中断,就可以得到占空比。

原子哥  我想测得2M频率脉冲的占空比及频率,PWM输入模式会不会出现高频时捕获不准的问题,我之前使用输入捕获,当频率大于500KHZ时,同时测占空比和频率,频率可以测出来但是占空比误差很大!
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-7-10
在线时间
6 小时
 楼主| 发表于 2018-7-17 17:18:13 | 显示全部楼层
最后使用ADC+DMA实现了高频占空比的测量。感谢原子哥的回复
回复

使用道具 举报

3

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2017-11-11
在线时间
30 小时
发表于 2018-8-30 10:54:13 | 显示全部楼层
老哥,说实话,我想要你那个500KHz的程序,可否给参考一下?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-5-21
在线时间
2 小时
发表于 2019-5-21 15:16:54 | 显示全部楼层
楼主有例程参考吗
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 01:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表