找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2448|回复: 0
打印 上一主题 下一主题
收起左侧

做航模接收4路PWM时自己改的代码,模仿正点原子的程序所写。20ms的更新周期

[复制链接]
跳转到指定楼层
楼主
ID:231761 发表于 2018-1-29 18:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一下便为4路PWM输入捕获:
#include "capture.h"
#include "usart.h"
#include "led.h"
#include "delay.h"
TIM_ICInitTypeDef  TIM3_ICInitStructure;   
void  TIM3_Capture(u16 arr,u16 psc)   //接收函数的初始化工作,比较基础,不做详细概述
{   GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
           NVIC_InitTypeDef NVIC_InitStructure;
       
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
       
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
       
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;  //输入
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
        //GPIO_InitStructure.GPIO_Speed=2»Dèòa
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);  //注意要将捕获的引脚做到下拉,再进行捕获
       
TIM_TimeBaseStructure.TIM_Period=arr;
TIM_TimeBaseStructure.TIM_Prescaler=psc;
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);   //¶¨ê±Æ÷3ÅäÖÃ


//3õê¼»ˉTIM3êäèë2¶»ñμÄ2Îêy


TIM3_ICInitStructure.TIM_Channel=TIM_Channel_1;
TIM3_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM3_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM3_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM3_ICInitStructure.TIM_ICFilter=0x00;//ÅäÖÃÂË2¨Æ÷ £¬2»ÂË2¨
TIM_ICInit(TIM3,&TIM3_ICInitStructure);


TIM3_ICInitStructure.TIM_Channel=TIM_Channel_2;
TIM3_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM3_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM3_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM3_ICInitStructure.TIM_ICFilter=0x00;
TIM_ICInit(TIM3,&TIM3_ICInitStructure);


TIM3_ICInitStructure.TIM_Channel=TIM_Channel_3;
TIM3_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM3_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM3_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM3_ICInitStructure.TIM_ICFilter=0x00;
TIM_ICInit(TIM3,&TIM3_ICInitStructure);


TIM3_ICInitStructure.TIM_Channel=TIM_Channel_4;
TIM3_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM3_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM3_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM3_ICInitStructure.TIM_ICFilter=0x00;
TIM_ICInit(TIM3,&TIM3_ICInitStructure);


TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE); //ÔêDíCC1IE2¶»ñÖD¶Ï
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC2,ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC3,ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC4,ENABLE);


TIM_Cmd(TIM3,ENABLE);

        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//í¨μàéèÖÃÎaTIM3
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//ÇàÕ¼0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//Ïìó|2
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//′ò¿aÖD¶Ïí¨μà
        NVIC_Init(&NVIC_InitStructure);


}


u8  TIM3CH1_CAPTURE_STA=0;        //高两位做捕获标志,低六位做溢出计数
u16 TIM3CH1_CAPTURE_VAL; //  
u32 temp1=0;


u8  TIM3CH2_CAPTURE_STA=0;          
u16 TIM3CH2_CAPTURE_VAL;  
u32 temp2=0;


u8  TIM3CH3_CAPTURE_STA=0;
u16 TIM3CH3_CAPTURE_VAL;  
u32 temp3=0;


u8  TIM3CH4_CAPTURE_STA=0;          
u16 TIM3CH4_CAPTURE_VAL;  
u32 temp4=0;
void  CaptureGesture(void)//接收姿态解算
{  
         if(TIM3CH1_CAPTURE_STA&0x80)
         {temp1=TIM3CH1_CAPTURE_STA&0X3F; //更新中断的次数
          temp1*=20000;  //20000的自动重装载值。
          TIM3CH1_CAPTURE_VAL+=temp1;  //当前的VAL值加上若有更新中断的值
         CA_CH.ROLL=TIM3CH1_CAPTURE_VAL;
          TIM3CH1_CAPTURE_STA=0;
         }
   if(TIM3CH2_CAPTURE_STA&0x80)
                {temp2=TIM3CH2_CAPTURE_STA&0X3F;
           temp2*=20000;
           TIM3CH2_CAPTURE_VAL+=temp2;
     CA_CH.PITCH=TIM3CH2_CAPTURE_VAL;
     TIM3CH2_CAPTURE_STA=0;
                }
          if(TIM3CH3_CAPTURE_STA&0x80)
                {temp3=TIM3CH3_CAPTURE_STA&0X3F;
           temp3*=20000;
           TIM3CH3_CAPTURE_VAL+=temp3;
     CA_CH.YAW=TIM3CH3_CAPTURE_VAL;
           TIM3CH3_CAPTURE_STA=0;
                }
                if(TIM3CH4_CAPTURE_STA&0x80)
                {temp4=TIM3CH4_CAPTURE_STA&0X3F;
           temp4*=20000;
           TIM3CH4_CAPTURE_VAL+=temp4;
     CA_CH.THROTTLE=TIM3CH4_CAPTURE_VAL;
     TIM3CH4_CAPTURE_STA=0;
                }
}


//TIM_SetCounter(TIM5,0);  ¼ÆêyÆ÷μÄÖμÇåáã¡£¸Ãoˉêy¿éòÔÇåáã¼ÆêyÆ÷¼Ä′æÆ÷μÄÖμ¡£  
void TIM3_IRQHandler(void)
{
//CC1
        if((TIM3CH1_CAPTURE_STA&0X80)==0)//还没捕获成功
        {          
                if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
                 
                {            TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
                        if(TIM3CH1_CAPTURE_STA&0X40)//ò已经捕获到高电平了
                        {
                                if((TIM3CH1_CAPTURE_STA&0X3F)==0X3F)/高电平太长了
                                {
                                        TIM3CH1_CAPTURE_STA|=0X80;//标记成功捕获依次
                                        TIM3CH1_CAPTURE_VAL=20000;
                                }else TIM3CH1_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
                {        TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
                        if(TIM3CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                
                        {                                 
                                TIM3CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一个下降沿
                                TIM3CH1_CAPTURE_VAL=TIM_GetCapture1(TIM3);
                                   TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
                        }else  //还未开始,第一次上升沿捕获
                        {
                                TIM3CH1_CAPTURE_STA=0;                        //清空
                                TIM3CH1_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM3,0);
                                TIM3CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿,下次捕获下降沿
                                   TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
                        }                    
                }                                                                                   
        }
       
        //CC2
                if((TIM3CH2_CAPTURE_STA&0X80)==0)
        {          
                if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
                 
                {             TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
                        if(TIM3CH2_CAPTURE_STA&0X40)
                        {
                                if((TIM3CH2_CAPTURE_STA&0X3F)==0X3F)
                                {
                                        TIM3CH2_CAPTURE_STA|=0X80;
                                        TIM3CH2_CAPTURE_VAL=20000;
                                }else TIM3CH2_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
                {        TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);
                        if(TIM3CH2_CAPTURE_STA&0X40)                       
                        {                                 
                                TIM3CH2_CAPTURE_STA|=0X80;               
                                TIM3CH2_CAPTURE_VAL=TIM_GetCapture2(TIM3);
                                   TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Rising);
                        }else                                                 
                        {
                                TIM3CH2_CAPTURE_STA=0;                       
                                TIM3CH2_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM3,0);
                                TIM3CH2_CAPTURE_STA|=0X40;               
                                   TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Falling);               
                        }                    
                }               
        }


               
//CC3       
                        if((TIM3CH3_CAPTURE_STA&0X80)==0)
        {          
                if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
                 
                {             TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
                        if(TIM3CH3_CAPTURE_STA&0X40)
                        {
                                if((TIM3CH3_CAPTURE_STA&0X3F)==0X3F)
                                {
                                        TIM3CH3_CAPTURE_STA|=0X80;
                                        TIM3CH3_CAPTURE_VAL=20000;
                                }else TIM3CH3_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
                {        TIM_ClearITPendingBit(TIM3,TIM_IT_CC3);
                        if(TIM3CH3_CAPTURE_STA&0X40)                       
                        {                                 
                                TIM3CH3_CAPTURE_STA|=0X80;               
                                TIM3CH3_CAPTURE_VAL=TIM_GetCapture3(TIM3);
                                   TIM_OC3PolarityConfig(TIM3,TIM_ICPolarity_Rising);
                        }else                                                 
                        {
                                TIM3CH3_CAPTURE_STA=0;                       
                                TIM3CH3_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM3,0);
                                TIM3CH3_CAPTURE_STA|=0X40;               
                                   TIM_OC3PolarityConfig(TIM3,TIM_ICPolarity_Falling);               
                        }                    
                }               
        }


//CC4       
                        if((TIM3CH4_CAPTURE_STA&0X80)==0)
        {          
                if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
                 
                {             TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
                        if(TIM3CH4_CAPTURE_STA&0X40)
                        {
                                if((TIM3CH4_CAPTURE_STA&0X3F)==0X3F)
                                {
                                        TIM3CH4_CAPTURE_STA|=0X80;
                                        TIM3CH4_CAPTURE_VAL=20000;
                                }else TIM3CH4_CAPTURE_STA++;
                        }         
                }
        if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
                {        TIM_ClearITPendingBit(TIM3,TIM_IT_CC4);
                        if(TIM3CH4_CAPTURE_STA&0X40)                               
                        {                                 
                                TIM3CH4_CAPTURE_STA|=0X80;               
                                TIM3CH4_CAPTURE_VAL=TIM_GetCapture4(TIM3);
                                   TIM_OC4PolarityConfig(TIM5,TIM_ICPolarity_Rising);
                        }else                                                                 
                                {TIM3CH4_CAPTURE_STA=0;                       
                                TIM3CH4_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM3,0);
                                TIM3CH4_CAPTURE_STA|=0X40;               
                                   TIM_OC4PolarityConfig(TIM3,TIM_ICPolarity_Falling);               
                        }                    
                }                                                                                   


}
CaptureGesture();
}


  以上便为核心函数。不同的单片机还需稍加改变。大家可以通过串口通信来检测捕获是否成功。可以利用printf函数打印到串口上,相对比较方便。
在主函数中  初始化串口再初始化定时器输入捕获,就可以通过串口通信来检测是否成功捕获。希望大家可以采纳。本人刚刚起步,若有错误,多多指教。



评分

参与人数 2黑币 +58 收起 理由
ytteria0001 + 8 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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