OpenEdv-开源电子网

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

输入捕获、定时器中断、单脉冲整合过程的问题,求大神给点意见

[复制链接]

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
发表于 2017-9-8 17:44:56 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 Rainday 于 2017-9-8 18:01 编辑


最佳答案

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

中断用一个就够了,假设PWM捕获模式下,你TIM1 CCR1捕获上升沿,CCR2捕获下降沿。开启CCR2中断,那么当你捕获到下降沿后,产生中断。CCR2-CCR1就是t0,把t0/2赋值给TIM2的ccr。此时经过t0/2,TIM2就会切换电平。电平持续时间(单脉冲)就是TIM2的arr-ccr。 这些都是2个TIM自动完成的,你要做的是配置好TIM1的arr、ccr,然后在TIM1的ccr2中断里给TIM2 ccr与arr赋值。最好两个定时器频率一致,计算起来就比较简单了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-8 17:48:00 | 显示全部楼层
本帖最后由 Rainday 于 2017-9-8 17:56 编辑

捕获.PNG
输入脉冲波宽度是变化的,TIM5是输入捕获(一次捕获一个上升沿或者下降沿)计算时间t0,在下降沿到来时立即开启TIM3计时时间为t0/2,时间到则产生中断并开启TIM4输出单脉冲。程序在上面,测试结果是串口有正确的时间输出,示波器并没有单脉冲输出。请大家帮我看看出问题在哪里???

TIM5 PA0 输入捕获,TIM3定时器中断,TIM4 PB6 配置成单脉冲输出。
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2017-9-8 17:44:57 | 显示全部楼层
Rainday 发表于 2017-9-8 19:32
仔细分析了下你说的,就是省略了单脉冲,直接由定时器计时到t/2,产生脉冲。我的程序里面,也是把t/2作为 ...

       中断用一个就够了,假设PWM捕获模式下,你TIM1 CCR1捕获上升沿,CCR2捕获下降沿。开启CCR2中断,那么当你捕获到下降沿后,产生中断。CCR2-CCR1就是t0,把t0/2赋值给TIM2的ccr。此时经过t0/2,TIM2就会切换电平。电平持续时间(单脉冲)就是TIM2的arr-ccr。
       这些都是2个TIM自动完成的,你要做的是配置好TIM1的arr、ccr,然后在TIM1的ccr2中断里给TIM2 ccr与arr赋值。最好两个定时器频率一致,计算起来就比较简单了。
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-8 17:48:41 | 显示全部楼层
本帖最后由 Rainday 于 2017-9-11 11:28 编辑

[mw_shl_code=c,true]#include "timer.h"
#include "led.h"
#include "usart.h"
#include "sys.h"
  
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
u16 zhouqi=30;//*0.1ms
u16 gaodianping=10;//*0.1ms

void TIM4_OPMGATE_Init()
{        
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruct;
        GPIO_InitTypeDef  GPIO_InitStruct;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PC,PA端口时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能定时器2的时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用IO时钟               
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;                        
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruct);        
//        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
//        GPIO_Init(GPIOA,&GPIO_InitStruct);
        
       //TIM2工作在单脉冲下
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
        TIM_TimeBaseInitStruct.TIM_Prescaler = 7199;//预分频值,每100us计数一次
        TIM_TimeBaseInitStruct.TIM_Period = zhouqi-1; //重装值,决定单脉冲周期
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);        
        
        TIM_SelectOnePulseMode(TIM4,TIM_OPMode_Single);//设置TIM2在单脉冲模式,且是单一的脉冲,在下一个更新事件停止         
        TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_OC1Ref); //OC1REF signal is used as the trigger output (TRGO).单一模式不需要设置
        
        TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);//使能定时器2的通道1预装载寄存器
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//在向上计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//OC1输出使能
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高
        TIM_OCInitStruct.TIM_Pulse = zhouqi-gaodianping;//比较捕获1的预装载值,决定单脉冲占空比,这个20就是低电平延续的来源
        TIM_OC1Init(TIM4,&TIM_OCInitStruct);               
        TIM_Cmd(TIM4,ENABLE); //Enable the TIM Counter
        
}

//void TIM4_Open()
//{
//        TIM_Cmd(TIM4,ENABLE);//使能TIM2
//}

//定时器5通道1输入捕获配置

TIM_ICInitTypeDef  TIM5_ICInitStructure;

void TIM5_Cap_Init(u16 arr5,u16 psc5)
{         
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
         NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);        //使能TIM5时钟
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟
        
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA1 清除之前设置  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA1 输入  
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA,GPIO_Pin_0);                                                 //PA1 下拉
        
        //初始化定时器5 TIM5         
        TIM_TimeBaseStructure.TIM_Period = arr5; //设定计数器自动重装值
        TIM_TimeBaseStructure.TIM_Prescaler =psc5;         //预分频器   
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  
        //初始化TIM5输入捕获参数
        TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         选择输入端 IC1映射到TI1上
          TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
          TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
          TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
          TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
          TIM_ICInit(TIM5, &TIM5_ICInitStructure);
        
        //中断分组初始化
        NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级2级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级0级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
        
        TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断        
        
           TIM_Cmd(TIM5,ENABLE );         //使能定时器5
   
}


u8  TIM5CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值
//定时器5中断服务程序         
void TIM5_IRQHandler(void)
{
        /******************定时器更新中断***************/
         if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获        
        {         
                if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
                 
                {            
                        if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                        {
                                if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                        TIM5CH1_CAPTURE_VAL=0XFFFF;
                                }
                                else TIM5CH1_CAPTURE_STA++;
                        }         
                }
                /****************捕获中断,上升沿下降沿都会触发一次中断***********/
        if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
                {        
                        if(TIM5CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
                        {
                                TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次上升沿
                                TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
                                TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
                        }else                                                                  //还未开始,第一次捕获上升沿
                        {
                                TIM5CH1_CAPTURE_STA=0;                        //清空
                                TIM5CH1_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM5,0);
                                TIM5CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                           TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
                        }                    
                }                                                                                    
         }
        if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿                {
                        int temp=0;
                        temp=TIM5CH1_CAPTURE_STA&0X3F;
                        temp*=65536;//溢出时间总和
                        temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
                        TIM3_Int_Init((temp/2)-1,72-1);//初始化并开启TIM3,传入定时时间参数。
                        LED0=0;
                        printf("0X00\r\n");
                        printf("HIGH:%d us\r\n",temp);//打印总的高点平时间
                        TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
                }
    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

}


/*************************************************************/

void TIM3_Int_Init(u16 arr3,u16 psc3)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
        
        //定时器TIM3初始化
        TIM_TimeBaseStructure.TIM_Period = arr3; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
        TIM_TimeBaseStructure.TIM_Prescaler =psc3; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
        //中断优先级NVIC设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
}


//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
                {
                        TIM_Cmd(TIM3, DISABLE);
                        TIM4_OPMGATE_Init();
                        LED0=1;
                        printf("0XFF\r\n");
                        
                }
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
                //TIM_ClearFlag(TIM3, TIM_FLAG_Update);
               
}




/***********************************************************/

int main(void)
{         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);         //串口初始化为115200
         LED_Init();        
        //TIM4_OPMGATE_Init();
        //TIM3_Int_Init();
         TIM5_Cap_Init(0XFFFF,72-1);        //以1Mhz的频率计数
         //TIM2_Open();
           while(1)
        {

                 

        }
}
[/mw_shl_code]
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2017-9-8 18:37:23 | 显示全部楼层
搞这么复杂干嘛。高级定时器有PWM捕获模式的,你去看看资料。比如用TIM1获得一个高电平的时间t0,然后将TIM1计数器值/2赋值给TIM2 ccr寄存器(它们的频率一致),然后TIM2就能在t0/2时间后触发电平转换,输出一个高电平(单脉冲),高电平时间可以通过配置ARR=CCR+X来配置,X就是单脉冲持续时间
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-8 19:11:45 | 显示全部楼层
a3748622 发表于 2017-9-8 18:37
搞这么复杂干嘛。高级定时器有PWM捕获模式的,你去看看资料。比如用TIM1获得一个高电平的时间t0,然后将TIM ...

听起来,很不错。唉 一看到配置寄存器就够了,刚学 不怎么懂!还是谢谢你
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-8 19:32:08 | 显示全部楼层
a3748622 发表于 2017-9-8 18:37
搞这么复杂干嘛。高级定时器有PWM捕获模式的,你去看看资料。比如用TIM1获得一个高电平的时间t0,然后将TIM ...

仔细分析了下你说的,就是省略了单脉冲,直接由定时器计时到t/2,产生脉冲。我的程序里面,也是把t/2作为你说的TIM2的定时时间,只是时间到后我加了个中断。你觉得呢
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-9 15:30:44 | 显示全部楼层
a3748622 发表于 2017-9-9 11:38
中断用一个就够了,假设PWM捕获模式下,你TIM1 CCR1捕获上升沿,CCR2捕获下降沿。开启CCR2中断, ...

只知道定时时间到会产生中断,中断也是只有你加上去了才有。不知道定时时间到会切换电平。我先看看资料
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2017-9-9 15:49:48 | 显示全部楼层
Rainday 发表于 2017-9-9 15:30
只知道定时时间到会产生中断,中断也是只有你加上去了才有。不知道定时时间到会切换电平。我先看看资料

你说的没错。TIM本来就是计数到了可以产生中断。切换电平的意思就是输出PWM,如果你想要输出PWM就要配置相应的OC结构体,跟你捕获需要配置IC结构体一样的。你去看看原子的资料吧,说得很详细。
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-9 19:38:23 | 显示全部楼层
本帖最后由 Rainday 于 2017-9-9 19:40 编辑
a3748622 发表于 2017-9-9 15:49
你说的没错。TIM本来就是计数到了可以产生中断。切换电平的意思就是输出PWM,如果你想要输出PWM就要配置 ...

不好意思,想再问你个问题!下图是判断出下降沿然后开启单脉冲,下降沿和单脉冲并不重合,频率加到100Hz延迟更厉害了。问题出在哪呢?用的正点原子的程序,判断下降沿代码为
QQ截图20170909193506.png
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)
                {        
                        if(TIM5CH1_CAPTURE_STA&0X40)               
                        {
                                TIM4_Open();//单脉冲输出
                                TIM5CH1_CAPTURE_STA|=0X80;               
                                TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
                                TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);
                        }else                                                                  
                        {
                                TIM5CH1_CAPTURE_STA=0;                        
                                TIM5CH1_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM5,0);
                                TIM5CH1_CAPTURE_STA|=0X40;               
                           TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);        
                        }                    
                }                                                                                    
         }
是因为这段程序在中断里执行产生的延迟么???
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-11 09:20:20 | 显示全部楼层
我在TIM5检测到下降沿就printf("0X00"),在TIM3中断里printf("0XFF")。串口输出结果为0XFF  0X00  0X00  0X00  0X00  0X00  0X00.....
上电立即进入TIM3中断,然后一直执行捕获中断。正常应该是先捕获中断再TIM3定时中断,请问这是怎么回事呢?
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2017-9-11 09:50:14 | 显示全部楼层
Rainday 发表于 2017-9-11 09:20
我在TIM5检测到下降沿就printf("0X00"),在TIM3中断里printf("0XFF")。串口输出结果为0XFF  0X00  0X00  0X ...

TIM3中断的开启与关闭有没处理好?TIM5进入中断判断为下降沿后,开启TIM3并设定ARR CCR的值,然后计数达到ARR产生更新中断后,关闭TIM3。不关闭TIM3就一直输出单脉冲。还有ARR与CCR有没有溢出?
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-11 09:56:20 | 显示全部楼层
a3748622 发表于 2017-9-11 09:50
TIM3中断的开启与关闭有没处理好?TIM5进入中断判断为下降沿后,开启TIM3并设定ARR CCR的值,然后计数达 ...

经过我的测试排查发现,问题出在TIM3。顺序是这样的,TIM5输入捕获时间为t0,把这个t0/2传递给TIM3,TIM3只是定时器中断,另外TIM3初始化是关闭的,我还特意写了个启动的函数。我把我的代码更新了一下
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-11 11:22:38 | 显示全部楼层
本帖最后由 Rainday 于 2017-9-11 11:30 编辑

再次把程序更新了一次,这次测试感觉已经做的很好了,3个定时器是接连触发的,我把他们的初始化程序都放在中断里了依次触发。但是还是有问题:测试结果是并没有在t0/2处出现脉冲波,而是在下降沿处出现的。输入捕获和定时器中断参考的正点原子。TIM3好像依然定时失败,但是中断确实进去了
用的方波测试频率2Hz
串口输出结果:
0X00
HIGH:250007 us
0XFF
0X00
HIGH:250006 us
0XFF
0X00
HIGH:250007 us
0XFF
0X00
HIGH:250007 us
0XFF
0X00
HIGH:250007 us
0XFF
0X00
HIGH:250007 us
0XFF
0X00
HIGH:250007 us
0XFF
0X00
HIGH:250007 us
0XFF
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-11 11:34:58 | 显示全部楼层
本帖最后由 Rainday 于 2017-9-11 11:45 编辑

另外我把temp/2-1改为25000测试结果也没出现延迟,但是TIM3的中断确实进入了因为有单脉冲输出。而且进入TIM3中断我就把TIM3关闭了(具体看程序注释很清晰的),我的分析结果:TIM3初始化立即进入中断,根本没定时。  各位大神看看分析的对不对,要怎么解决呢??求指教
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2017-9-11 11:56:42 | 显示全部楼层
你是不是没有关闭影子寄存器?
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-11 12:06:01 | 显示全部楼层
刚刚参考了这个帖子https://mp.weixin.qq.com/s?__biz ... 78657eeb2d655020#rd
确实可以了,但是频率范围在4Hz-10Hz才准,其他频率飘的厉害。
下午来了接着发测试图
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-11 14:37:38 | 显示全部楼层
a3748622 发表于 2017-9-11 11:56
你是不是没有关闭影子寄存器?

差不多了,我之前的想法有个大致结果。不过频率范围很低,里面有严重的延迟,我怀疑是单脉冲一开始上电就先来一段低电平造成的。
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-11 14:39:14 | 显示全部楼层
a3748622 发表于 2017-9-11 11:56
你是不是没有关闭影子寄存器?

OK 搞定了,我把单脉冲的宽度调节到u级别这样就算是上电延迟也是u级别的时间。测试结果就对了。
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-11 15:00:28 | 显示全部楼层
本帖最后由 Rainday 于 2017-9-11 15:09 编辑

10ms 4hz.png 10ms 50hz.png 30u 5hz.png 30u 50hz.png
图1,脉宽10ms 4HZ频率 图2,脉宽10ms50HZ  出现严重漂移。
图3,脉宽30us 5HZ频率 图4,脉宽30u50HZ  未出现明显漂移。
验证自己的猜想:单脉冲开启时会有一小段低电平持续时间。

回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-11 15:32:40 | 显示全部楼层
最后一个调试,去低电平延迟。
只需把代码TIM_OCInitStruct.TIM_Pulse = zhouqi-gaodianping;改到最小为止但不能为0,等于0测试结果全都是高电平。我改为1,频率加到1K也没看到明显偏移。如过ARR=72-1那么这个1就是1u。

圆满完成!感谢大家的帮助。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 00:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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