蓝桥杯嵌入式-6:定时器输入捕获

  1. 有开发板结构图,可知PA15和PB4
  2. 在CubeMx中进行配置
  3. 参数配置
  4. key_of_timer.h中代码 
    #ifndef __KEY_OF_TIMER_H
    #define __KEY_OF_TIMER_H
    
    #include "main.h"
    
    
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
            //定时器中断处理函数声明
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
            //定时器输入捕获回调函数
    #endif
  5. key_of_timer.c中的代码
    #include "key_of_timer.h"
    
    double frq_val1 = 0,frq_val2 = 0;
    uint16_t duty_val1 = 0,duty_val2 = 0;
    float duty1=0,duty2=0;
    uint16_t frq1 = 0,frq2 = 0;
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    {
    
        if(htim->Instance == TIM2)
        {
            frq_val1 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
            duty_val1 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);
                //读取计时值
            __HAL_TIM_SetCounter(htim,0); //将计数器的值设为0
            duty1 = (duty_val1/frq_val1)*100;
            frq1=(80000000/80)/frq_val1;   //根据捕获到的值来计算频率
            HAL_TIM_IC_Start(htim,TIM_CHANNEL_1); //开启通道1
            HAL_TIM_IC_Start(htim,TIM_CHANNEL_2); //开启通道2
        }
        if(htim->Instance == TIM3)
        {
            frq_val2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
            duty_val2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);
                //读取计时值
            __HAL_TIM_SetCounter(htim,0); //将计数器的值设为0
            duty2 = (duty_val2/frq_val2)*100;
            frq2=(80000000/80)/frq_val2;   //根据捕获到的值来计算频率
            HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
            HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);
        }
    }

  6. main中的代码
    #include "tim.h"
    #include "key_of_timer.h"
    
    
    extern uint16_t frq1,frq2;
    extern float duty1,duty2;
    char lcd_text[30];
    uint8_t pa6_duty = 10;
    uint8_t pa7_duty = 10;
    
    int main(void)
    {    
            //打开输入捕获的定时器
            HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
            HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
            HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
            HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
         while(1)
         {
             //按键测试代码:
          if(key[1].single_flag == 1)
          {
            pa6_duty += 10;
            if(pa6_duty >= 100)
            {
                pa6_duty = 10;
            }
            __HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);
            key[1].single_flag = 0;
          }
          if(key[2].single_flag == 1)
          {
            pa7_duty += 10;
            if(pa7_duty >= 100)
            {
                pa7_duty = 10;
            }
            __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);
            key[2].single_flag = 0;
          }
             
            sprintf(lcd_text,"   frq1:%d   ",frq1);
            LCD_DisplayStringLine(Line3,(uint8_t*)lcd_text);
            sprintf(lcd_text,"   frq2:%d   ",frq2);
            LCD_DisplayStringLine(Line4,(uint8_t*)lcd_text);
            
            sprintf(lcd_text,"   duty1:%.2f   ",duty1);
            LCD_DisplayStringLine(Line5,(uint8_t*)lcd_text);
            sprintf(lcd_text,"   duty2:%.2f   ",duty2);
            LCD_DisplayStringLine(Line6,(uint8_t*)lcd_text);     
         }
    }
  • 25
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值