找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32F103定时器输入捕获解码9148遥控器程序

[复制链接]
跳转到指定楼层
楼主
ID:668227 发表于 2019-12-20 11:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一,定时器初始化
/*******************************************************************************
* 函 数 名         : time1_init
* 函数功能                   : 定时器1端口初始化函数           
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void time1_init()
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;         //声明一个结构体变量,用来初始化GPIO

        TIM_ICInitTypeDef TIM1_ICInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        /* 开启定时器1时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

        TIM_ClearITPendingBit(TIM1,TIM_IT_Update);//清除TIMx的中断待处理位:TIM 中断源
        TIM_TimeBaseInitStructure.TIM_Period =9999;//设置自动重装载寄存器周期的值100MS
        TIM_TimeBaseInitStructure.TIM_Prescaler = 719;//设置用来作为TIMx时钟频率预分频值,100Khz计数频率
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);        

        /* 设置中断参数,并打开中断 */
        TIM1_ICInitStructure.TIM_Channel = TIM_Channel_4; //捕获通道
        TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //xia沿捕获
        TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //直接映射
        TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //不分频每个变化捕获
        TIM1_ICInitStructure.TIM_ICFilter = 0x00;//不滤波
        TIM_ICInit(TIM1, &TIM1_ICInitStructure);               
        
        /* 设置NVIC参数 */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
        NVIC_InitStructure.NVIC_IRQChannel=TIM1_CC_IRQn; ////TIM1 捕获中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;        //抢占优先级为0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;  //响应优先级为1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能
        NVIC_Init(&NVIC_InitStructure);        

        TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC4,ENABLE);       //使能更新中断和捕获中断

        TIM_Cmd(TIM1, ENABLE);         //使能定时器//使能或者失能TIMx外设
        
  TIM_ClearITPendingBit(TIM1, TIM_IT_Update|TIM_IT_CC4 );     //清除标识        
}
二、中断处理

/* 遥控器解码

*/
void TIM1_CC_IRQHandler(void)         
{        
  if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查TIM1更新中断标识
  {

                          overflow++;
  }

  if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET) //检查TIM1通道4捕获标识
  {
                if(state==WAIT_FALLING)   // 捕获下降沿
                {
                        TIM1CH4_CAPTURE_VAL = TIM_GetCapture4(TIM1);//获得输入捕获的值
                        yktimvalue = TIM1CH4_CAPTURE_VAL + (overflow*720);
                        //判断高电平持续时间 大于 208a-87776vs  80a=33760vs/3520  a=422vs                        3a=1266 vs
                        if(yktimvalue>8770)
                        {
                                ykaj_num = 0;        
                                ykaj_value= 0;                                                               
                        }        
                        overflow = 0;
                        TIM_SetCounter(TIM1,0);
                        state = WAIT_RISING;
                        TIM_OC4PolarityConfig(TIM1,TIM_ICPolarity_Rising); //设置上升沿触发        
                }
                else if(state==WAIT_RISING)   //捕获上升沿
                {
                        TIM1CH4_CAPTURE_VAL = TIM_GetCapture4(TIM1);     
                        yktimvalue = TIM1CH4_CAPTURE_VAL;        
                        
                        //判断低电平持续时间 422 1266 vs
                        if(yktimvalue>40 && yktimvalue<50)
                        {
                                ykaj_bit=0;//收到数据 0
                        }
                        else if(yktimvalue>125 && yktimvalue<135)
                        {
                                ykaj_bit=1;//收到数据 1
                        }
                        ykaj_value<<=1;
                        ykaj_value+=ykaj_bit;               
                        ykaj_num++;        
                        if(ykaj_num>=24)
                        {
                                yk_keys        =(u16)ykaj_value;
                                yk_keys&=0x0fff;
                                ykaj_value>>=12;
                                if(yk_keys==(u16)ykaj_value)
                                {               
                                        ykaj_bzok=1;
                                }
                                else
                                {               
                                        ykaj_num = 0;        
                                        ykaj_value= 0;        
                                }                                
                        }                                
                        if(yktimvalue<40 || yktimvalue>135)
                        {
                                ykaj_num = 0;        
                                ykaj_value= 0;               
                        }                        
                        
                        overflow = 0;
                        TIM_SetCounter(TIM1,0);
                        state = WAIT_FALLING;
                        TIM_OC4PolarityConfig(TIM1,TIM_ICPolarity_Falling); //设置下降沿触发
                }
  }

  TIM_ClearITPendingBit(TIM1, TIM_IT_Update|TIM_IT_CC4 );     //清除标识

}

工程模板 - 遥控.7z

216.63 KB, 下载次数: 39, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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