亚博智能论坛  
  
查看: 505|回复: 4

平衡小車程式中TIM1的用途詢問

[复制链接]

该用户从未签到

2

主题

3

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2018-3-19 18:33:04 | 显示全部楼层 |阅读模式
我嘗試將TIM1 init從main loop中mark, 但會造成小車無法平衡.所以我認為是必要的, 但TIM1中斷內確實只清除TIM1中斷Flag沒做任何事情.
所以我不理解進中斷的意義是甚麼?
PS. 我有自行利用IO Toggle 並用示波器Trigger過進中斷時間是"500ms"

官方程式中關於TIM1的設定如下
----------------------------------------------------------------------------------------------------------------------------------------------------------------
void Timerx_Init(u16 arr,u16 psc)
{   
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //TIM1时钟使能

        TIM_TimeBaseStructure.TIM_Period = 5000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到5000为500ms
        TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
        TIM_TimeBaseStructure.TIM_ClockDivision = 1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig
        (  //使能或者失能指定的TIM1中断
                TIM1, //TIM1
                TIM_IT_Update  |  //TIM1 中断源
                TIM_IT_Trigger,   //TIM1 触发中断源
                ENABLE  //使能
        );
       
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  //TIM1中断  
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  //先占优先级3级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}

void TIM1_UP_IRQHandler(void)   //TIM1中断
{
        if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查指定的TIM1中断发生与否:TIM1 中断源
        {
                TIM_ClearITPendingBit(TIM1, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM1 中断源

                GPIOC->ODR ^= (1 << 13);
        }
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------

回复

使用道具 举报

  • TA的每日心情
    萌哒
    2018-5-17 16:00
  • 176

    主题

    275

    帖子

    1103

    积分

    超级版主

    Rank: 9Rank: 9Rank: 9

    积分
    1103
    发表于 2018-3-26 15:06:59 | 显示全部楼层
    TIM1是用来测量超声波距离使用到的,在系统中断里面有使用到
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    3

    帖子

    15

    积分

    新手上路

    Rank: 1

    积分
    15
     楼主| 发表于 2018-3-29 10:48:11 | 显示全部楼层
    Master 发表于 2018-3-26 15:06
    TIM1是用来测量超声波距离使用到的,在系统中断里面有使用到 ...

    感謝大佬的回覆, 因為ˋ一開始我就把超音波mark掉所以沒注意到

    那請教一下為什麼需要開interrupt呢?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    萌哒
    2018-5-17 16:00
  • 176

    主题

    275

    帖子

    1103

    积分

    超级版主

    Rank: 9Rank: 9Rank: 9

    积分
    1103
    发表于 2018-3-29 18:28:46 | 显示全部楼层
    超声波里面的中断应该是定时器中断,用来获取echo端的高电平时间。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    萌哒
    2018-5-17 16:00
  • 176

    主题

    275

    帖子

    1103

    积分

    超级版主

    Rank: 9Rank: 9Rank: 9

    积分
    1103
    发表于 2018-3-29 18:35:40 | 显示全部楼层
    超声波测距的原理是:先使用STM32的数字引脚向TRIG脚输入至少10us的高电平信号,触发模块的测距功能。测距功能触发后,模块将自动发出 8 个 40kHz 的超声波脉冲,并自动检测是否有信号返回,一旦检测到有回波信号则ECHO引脚会输出高电平。高电平持续的时间就是超声波从发射到返回的时间。此时可以使用定时器获取高电平的时间, 并计算出距被测物体的实际距离。公式: 距离=高电平时间*声速(340M/S)/2。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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