OpenEdv-开源电子网

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

用输入捕获测高电平的时间,,能不能每一个高电平都捕捉到啊

[复制链接]

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
发表于 2018-12-13 00:19:58 | 显示全部楼层 |阅读模式
30金钱
用STM32F7板子 的输入捕获进行高电平时间长短的测量,,能不能每一个高电平都捕捉到测量啊,频率最高50K,占空比50%,也就是高电平的时间是20微秒,虽然能测到但是老是丢失高电平的个数,基本上就是1K丢失一个高电平,测到的时间数就会少这一个,到50K的时候基本就会丢失20几个数了,不知道是输入捕获的问题还是我程序配置的问题啊,输入捕获最高能测到多高的频率啊,求教原子哥解答,,或者原子哥能给指导一下,有没有另一种思路啊,,谢谢原子哥了

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-13 02:52:39 | 显示全部楼层
你要每个都捕获到做什么用?
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-13 19:40:11 | 显示全部楼层
正点原子 发表于 2018-12-13 02:52
你要每个都捕获到做什么用?

我想每次都捕捉到,然后判断每一次的时间是否都相同,先谢谢原子哥解答,,感觉输入捕获在那么高的频率下,不是每一次都能捕获到,不知道是不是这样
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-14 02:07:47 | 显示全部楼层
13969873363 发表于 2018-12-13 19:40
我想每次都捕捉到,然后判断每一次的时间是否都相同,先谢谢原子哥解答,,感觉输入捕获在那么高的频率下 ...

用pwm输入模式,另外,频率不能高,高了估计也捕获不了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-14 20:16:46 | 显示全部楼层
正点原子 发表于 2018-12-14 02:07
用pwm输入模式,另外,频率不能高,高了估计也捕获不了

谢谢原子哥,,我配一下试试
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-16 00:38:10 | 显示全部楼层
只要你开设了捕获中断,而且没有更高优先级的中断频繁发生,理论上50k应该很轻松地捕获啊。
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-16 09:21:52 | 显示全部楼层
bucker 发表于 2018-12-16 00:38
只要你开设了捕获中断,而且没有更高优先级的中断频繁发生,理论上50k应该很轻松地捕获啊。

我开了捕获中断,其他中断也都设置成最低,,但就是会丢数啊,能给指导一下吗
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-17 21:23:51 | 显示全部楼层
13969873363 发表于 2018-12-16 09:21
我开了捕获中断,其他中断也都设置成最低,,但就是会丢数啊,能给指导一下吗

有一个问题是存在的,我发现STM32中断延迟是比较大的,0.3uS~0.5uS是可能有的,你可以做个试验,让定时器发生溢出中断,然后在中断服务程序第一条命令关闭该定时器,看看此刻计数器CNT的只是多少,STM32F103RC似乎40个计数值。即使采用汇编来写中断服务程序也好不到哪里去。如果你的捕捉丢失很严重,不知是不是中断延迟导致漏掉了一次捕捉。
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-17 21:51:55 | 显示全部楼层
bucker 发表于 2018-12-17 21:23
有一个问题是存在的,我发现STM32中断延迟是比较大的,0.3uS~0.5uS是可能有的,你可以做个试验,让定时器 ...

现在我把频率降到了1K,有时会一秒丢一个,有时不丢,,那这样我用三路同时采集的话,捕获中断是不是应该是所有中断当中最高的,而且这三路中断的优先级是不是应该相同?谢谢你的指导
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-17 23:02:40 | 显示全部楼层
先建议你这样做,贴上定时器的初始化和算法的源码,贴出初始化后KEIL中此定时器的寄存器值,别人才有可能帮着找原因。
我的理解是除了原子介绍的PWM方式外,同一个引脚需要先设置捕捉上升沿,在中断服务程序中将捕获方式改为下降沿,在下一次中断后还要改为捕捉上升沿才可以,不知你是怎么处理的。
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-18 10:21:09 | 显示全部楼层
[mw_shl_code=applescript,true]定时器5的初始化代码 、(参照例程改的) 还有初始化后的定时器5的寄存器值,希望大家能帮我找一找错误

#include "timer5.h"
#include "stdio.h"
#include "sys.h"
int TIMSRAM5[50000] __attribute__((at(0XCFF00000)));//测试用数组
u32 ts5=0;
int temp5=0;
//int TIMSRAM5[10000];
/***************************************************************************
****************************************************************************
  下面是输入捕获相关源码实验相关函数源码
****************************************************************************
****************************************************************************/

TIM_HandleTypeDef TIM5_Handler;         //定时器5句柄

//定时器5通道1输入捕获配置
//arr:自动重装值(TIM2,TIM5是32位的!!)
//psc:时钟预分频数
void TIM5_CH1_Cap_Init(u32 arr,u16 psc)
{  
    TIM_IC_InitTypeDef TIM5_CH1Config;  
    GPIO_InitTypeDef GPIO_Initure;
       
    TIM5_Handler.Instance=TIM5;                          //通用定时器5
    TIM5_Handler.Init.Prescaler=psc;                     //分频
    TIM5_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM5_Handler.Init.Period=arr;                        //自动装载值
    TIM5_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
//    HAL_TIM_IC_Init(&TIM5_Handler);
          assert_param(IS_TIM_INSTANCE(TIM5_Handler->Instance));
    assert_param(IS_TIM_COUNTER_MODE(TIM5_Handler->Init.CounterMode));
    assert_param(IS_TIM_CLOCKDIVISION_DIV(TIM5_Handler->Init.ClockDivision));
        if(TIM5_Handler.State == HAL_TIM_STATE_RESET)
         {
                TIM5_Handler.Lock = HAL_UNLOCKED;
       
    __HAL_RCC_TIM5_CLK_ENABLE();            //使能TIM5时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();                        //开启GPIOA时钟
       
    GPIO_Initure.Pin=GPIO_PIN_0 ;            //PA0  PA1
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;      //复用推挽输出
    GPIO_Initure.Pull=GPIO_PULLDOWN;        //下拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    GPIO_Initure.Alternate=GPIO_AF2_TIM5 ;   //PA0复用为TIM5通道1  
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
   
          HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
    HAL_NVIC_SetPriority(TIM5_IRQn,0,0);    //设置中断优先级,抢占优先级2,子优先级0
    HAL_NVIC_EnableIRQ(TIM5_IRQn);          //开启ITM5中断   
         }
         
          TIM5_Handler.State = HAL_TIM_STATE_BUSY;
    TIM_Base_SetConfig(TIM5_Handler.Instance, &TIM5_Handler.Init);
    TIM5_Handler.State= HAL_TIM_STATE_READY;         
       
    TIM5_CH1Config.ICPolarity=TIM_ICPOLARITY_RISING;    //上升沿捕获
    TIM5_CH1Config.ICSelection=TIM_ICSELECTION_DIRECTTI;//映射到TI1上
    TIM5_CH1Config.ICPrescaler=TIM_ICPSC_DIV1;          //配置输入分频,不分频
    TIM5_CH1Config.ICFilter=0;                          //配置输入滤波器,不滤波
    HAL_TIM_IC_ConfigChannel(&TIM5_Handler,&TIM5_CH1Config,TIM_CHANNEL_1);//配置TIM5通道1
    HAL_TIM_IC_Start_IT(&TIM5_Handler,TIM_CHANNEL_1);   //开始捕获TIM5的通道1
    __HAL_TIM_ENABLE_IT(&TIM5_Handler,TIM_IT_UPDATE);   //使能更新中断
}

//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294秒)
u8  TIM5CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
u32        TIM5CH1_CAPTURE_VAL;        //输入捕获值(TIM2/TIM5是32位)


//定时器5中断服务函数
void TIM5_IRQHandler(void)
{
        //溢出中断
        if(__HAL_TIM_GET_FLAG(&TIM5_Handler, TIM_FLAG_UPDATE) != RESET)
  {
    if(__HAL_TIM_GET_IT_SOURCE(&TIM5_Handler, TIM_IT_UPDATE) !=RESET)
    {
      __HAL_TIM_CLEAR_IT(&TIM5_Handler, TIM_IT_UPDATE);
                        if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
            {
                         if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                         {
                                if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获了一次
                                        TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;
                                }else TIM5CH1_CAPTURE_STA++;
                         }         
            }
                }
        }
       
        //捕获更新
         if(__HAL_TIM_GET_FLAG(&TIM5_Handler, TIM_FLAG_CC1) != RESET)
        {
                if(__HAL_TIM_GET_IT_SOURCE(&TIM5_Handler, TIM_IT_CC1) !=RESET)
                {
                        {
                        __HAL_TIM_CLEAR_IT(&TIM5_Handler, TIM_IT_CC1);
                        TIM5_Handler.Channel = HAL_TIM_ACTIVE_CHANNEL_1;
                       
                        if((TIM5_Handler.Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00)
      {
                           if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
                                {
                                        if(TIM5CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                
                                                {                                 
                                                        TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
                                                                                        TIM5CH1_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&TIM5_Handler,TIM_CHANNEL_1);//获取当前的捕获值.
                                                                if(TIM5CH1_CAPTURE_STA &0X80)   //成功捕获到高电平
                                                                                        {
                                                                                                temp5=TIM5CH1_CAPTURE_VAL&0X3F;  
                                                                                                temp5*=0xffffffff;    //溢出时间总和
                                                                                                temp5+=TIM5CH1_CAPTURE_VAL;    //得到总的高电平时间
                                                                                                TIMSRAM5[ts5]=temp5;
                                                                                                ts5++;    //下一位
                                                                                                TIM5CH1_CAPTURE_STA=0;      //开启下一次捕获
                                                                                        }
                                                                                        TIM_RESET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1);   //一定要先清除原来的设置!!
                                                                                        TIM_SET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//配置TIM5通道1上升沿捕获
                                                }else                                                                  //还未开始,第一次捕获上升沿
                                                {
                                                        TIM5CH1_CAPTURE_STA=0;                        //清空
                                                        TIM5CH1_CAPTURE_VAL=0;
                                                        TIM5CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                                                        __HAL_TIM_DISABLE(&TIM5_Handler);        //关闭定时器5
                                                        __HAL_TIM_SET_COUNTER(&TIM5_Handler,0);
                                                        TIM_RESET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1);   //一定要先清除原来的设置!!
                                                        TIM_SET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定时器5通道1设置为下降沿捕获
                                                        __HAL_TIM_ENABLE(&TIM5_Handler);//使能定时器5
                                                }                    
                                }       
                  }
           }
    }
        }
}

[/mw_shl_code] 捕获.PNG
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-18 21:25:56 | 显示全部楼层
本帖最后由 bucker 于 2018-12-18 21:30 编辑
13969873363 发表于 2018-12-18 10:21
[mw_shl_code=applescript,true]定时器5的初始化代码 、(参照例程改的) 还有初始化后的定时器5的寄存器值 ...

因为我没有407的板子可调试,只能看你的寄存器配置后的值了,从截图看是只能捕捉上升沿吧,你需要测量高电平时间其实就是测量脉宽,还需要在上升沿捕获后将CCER置为捕捉下降沿,不知你是否这样设置了。 微信截图_20181218212624.jpg
还有,建议你参考上图来设置你的定时器
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-19 09:22:47 | 显示全部楼层
bucker 发表于 2018-12-18 21:25
因为我没有407的板子可调试,只能看你的寄存器配置后的值了,从截图看是只能捕捉上升沿吧,你需要测量高 ...

嗯嗯,我是在中断里将定时器改为下降沿捕获的,脉宽测得是对的,但就是丢数,我再检查一下,谢谢你哈
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-19 18:19:16 | 显示全部楼层
本帖最后由 bucker 于 2018-12-19 18:22 编辑
13969873363 发表于 2018-12-19 09:22
嗯嗯,我是在中断里将定时器改为下降沿捕获的,脉宽测得是对的,但就是丢数,我再检查一下,谢谢你哈

我喜欢寄存器方式的,有点老顽固,对于hal库我是实在不了解。从硬件角度看,50k的频率不应该丢中断,应该不用怀疑硬件。想了解下,你为何需要连续测高电平时间呢,难道高电平时间(其实就是脉宽)是变化的吗?PS:你的中断是否存在处理溢出中断测试SR时无意清除了捕获标志?先搞个暂存器保存下SR的值试试
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
发表于 2018-12-19 19:04:49 来自手机 | 显示全部楼层
stm32的中断速度是1us(绝大多数); 部分处于纳秒级; 以前用407做ESP8266底层,串口2250000(2.5MByte不丢字节(频率2250000*(8+2)))
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-19 20:41:28 | 显示全部楼层
bucker 发表于 2018-12-19 18:19
我喜欢寄存器方式的,有点老顽固,对于hal库我是实在不了解。从硬件角度看,50k的频率不应该丢中断,应该 ...

我高电平的时间是固定的,但就是如果有一个时刻脉宽发生变化了,我要测到这个脉宽的时间是多少,我在检查一下我的中断处理部分看看,谢谢您的指导哈
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-19 20:43:04 | 显示全部楼层
wlq390934605 发表于 2018-12-19 19:04
stm32的中断速度是1us(绝大多数); 部分处于纳秒级; 以前用407做ESP8266底层,串口2250000(2.5MByte不丢字节 ...

我觉着是我的程序问题,不知道是哪个地方错了,但就是找不出来啊
回复

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
发表于 2018-12-19 22:24:13 来自手机 | 显示全部楼层
我提的的中断响,并没有想过要解决你的问题,你高阻高速示波器,测工作波形的状态,或许有收获,如无就只能改代码,如,中断处理简洁,用寄存器处理中断,中断内先清状态再处理等等等
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-20 20:42:18 | 显示全部楼层
本帖最后由 bucker 于 2018-12-20 20:47 编辑
13969873363 发表于 2018-12-19 20:41
我高电平的时间是固定的,但就是如果有一个时刻脉宽发生变化了,我要测到这个脉宽的时间是多少,我在检查 ...

你测的高电平时间只有10US,CPU几乎是频繁被中断。你可以改用两个引脚,一个监视上升沿另一监视下降沿,这样有个好处,你只需设置下降沿中断就可以了,下降沿中断时,因为上升沿的记忆值还在寄存器中不会被覆盖,只需在下降沿中断一起读出来。
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-20 21:08:26 | 显示全部楼层
bucker 发表于 2018-12-20 20:42
你测的高电平时间只有10US,CPU几乎是频繁被中断。你可以改用两个引脚,一个监视上升沿另一监视下降沿, ...

这样的话不得将同一路信号分为两路?我使用了映射,这样就会有两个寄存器来存储数据,只是在中断里频繁改上升沿下降沿捕获而且用了一个引脚,会不会是这里影产生响
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-20 21:09:27 | 显示全部楼层
wlq390934605 发表于 2018-12-19 22:24
我提的的中断响,并没有想过要解决你的问题,你高阻高速示波器,测工作波形的状态,或许有收获,如无就只能 ...

嗯,我试试,谢谢指导啊哈
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-20 22:15:28 | 显示全部楼层
本帖最后由 bucker 于 2018-12-20 22:17 编辑
13969873363 发表于 2018-12-20 21:08
这样的话不得将同一路信号分为两路?我使用了映射,这样就会有两个寄存器来存储数据,只是在中断里频繁改 ...

用了2个寄存器只需要一个负责上升沿,另一个负责下降沿的捕获,后面那个捕获中断一次就应该可以了,也不用频繁修改捕获方向,你的上升沿在前,那么只需要下降沿的触发中断。
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-22 19:48:16 | 显示全部楼层
bucker 发表于 2018-12-20 22:15
用了2个寄存器只需要一个负责上升沿,另一个负责下降沿的捕获,后面那个捕获中断一次就应该可以了,也不 ...

我再考虑一下哈,手册上说映射到TI,我不是很明白,,到底是用了两个寄存器还是别的?
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-22 22:38:17 | 显示全部楼层
13969873363 发表于 2018-12-22 19:48
我再考虑一下哈,手册上说映射到TI,我不是很明白,,到底是用了两个寄存器还是别的?

QQ截图20181222223644.jpg QQ截图20181222223709.jpg
本来想这么试试的,可惜没平台试验。
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-23 10:54:08 | 显示全部楼层
bucker 发表于 2018-12-22 22:38
本来想这么试试的,可惜没平台试验。

我自己试过,但是F1还行,,网上也有资料啥的,,可惜F7资料好少
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-23 18:24:49 | 显示全部楼层
本帖最后由 bucker 于 2018-12-23 18:31 编辑
13969873363 发表于 2018-12-23 10:54
我自己试过,但是F1还行,,网上也有资料啥的,,可惜F7资料好少

似乎ST的产品都差不多,主要的改进在内核,外设基本变不了多少。 微信截图_20181223182724.jpg

这是F7的资料,差异不大吧。
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-23 22:12:17 | 显示全部楼层
bucker 发表于 2018-12-23 18:24
似乎ST的产品都差不多,主要的改进在内核,外设基本变不了多少。

这是F7的资料,差异不大吧。

我感觉在库函数里差别好大
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-27 19:44:06 | 显示全部楼层
13969873363 发表于 2018-12-23 22:12
我感觉在库函数里差别好大

不知你解决的怎么样了。
微信图片_20181227193004.jpg
今天找了个103RC的板子做了PWM输入试验。用的是PB11/TIM2_CH4作为100KHz的PWM输出,占空比从10%~90%都做了测试。
输入捕获引脚用的是PC6/TIM3_CH1负责上升沿,CH2映射到CH1,用于复位及下降沿捕获。测试数据如图。
说明:
  • 芯片主频72MHz,捕获的周期应为10uS,捕获值应为720,但由于硬件每周期复位,实际捕获值变为718,非常稳定。但首次捕获值不准,这也好理解,因为起点的原因。
  • 10%的下降沿未捕获成功,其余占空比基本符合比例。
  • 只各捕获上升沿及下降沿各20次,没发生丢失数据现象。
Cap.rar (6.56 MB, 下载次数: 4)
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-29 21:02:24 | 显示全部楼层
今天为了解决占空比为10%时未能捕捉到下降沿的问题。分析原因在于上下沿都触发中断可能导致上升沿中断未处理完时发生了下降沿中断,结果下降沿中断信号被清除。解决的方法是只允许下降沿中断,上升沿只捕捉不中断,在下降沿中断服务程序将上升沿时间一起读出,取得了满意的效果。 Cap.rar (6.56 MB, 下载次数: 7)
回复

使用道具 举报

16

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-4-9
在线时间
111 小时
 楼主| 发表于 2018-12-29 21:09:26 | 显示全部楼层
bucker 发表于 2018-12-27 19:44
不知你解决的怎么样了。

今天找了个103RC的板子做了PWM输入试验。用的是PB11/TIM2_CH4作为100KHz的PWM ...

最近几天一直在复习考试,,之前把频率稳定在了1K,同时测了三路,,测了三路数据同时存到SD卡里,基本最低要求吧算是 但丢数问题还是解决不了,,这几天也没弄
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2018-12-29 21:14:32 | 显示全部楼层
本帖最后由 bucker 于 2018-12-29 21:16 编辑
13969873363 发表于 2018-12-29 21:09
最近几天一直在复习考试,,之前把频率稳定在了1K,同时测了三路,,测了三路数据同时存到SD卡里,基本最 ...

我用的是F103做的实验,目前捕捉100kHz频率10%~90%占空比都没问题了,思路和前面给的建议是一直的,我也是初学HAL库,感到还是挺方便的,据地测量代码只有几行,你可以看看我的例程。main.c和stm32f1xx_it.c都各有几行而已。如果你是连续测量,还要把数据写入SD卡的话,我估计写SD卡是要影响测量的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 08:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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