当前位置:   article > 正文

避障小车学习2___hal_tim_get_compare

__hal_tim_get_compare

目录

一 超声波

二  舵机 

三 电机控制

四 cube配置

 

超声波

 用输入捕获的方法,原理:先设置输入捕获为上升沿检测,记录发生上升沿时TIMx_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来的时候发生捕获,并记录此时的TIMx_CNT的值。这样,前后两次TIMx_CNT的值之差就是高电平的脉宽。同时根据TIM的计数频率,我们就能知道高电平脉宽的准确时间。写在了自己写的回调里,因为输入捕获有一个自己的回调,它不会进定时器中断回调。

打开定时器:HAL_TIM_Base_Start_IT(&htim2 ); 

打开输入捕获:HAL_TIM_IC_Start(&htim2 ,TIM_CHANNEL_3);

宏定义:

#define TRIG_ON     HAL_GPIO_WritePin (TRIG_GPIO_Port ,TRIG_Pin ,GPIO_PIN_SET )
#define TRIG_OFF     HAL_GPIO_WritePin (TRIG_GPIO_Port ,TRIG_Pin ,GPIO_PIN_RESET )

  1. void TIM2_Callback()
  2. {
  3. TRIG_ON;
  4. delay_us(10);
  5. TRIG_OFF;
  6. if(flag ==0)
  7. {
  8. __HAL_TIM_SET_CAPTUREPOLARITY(&htim2 ,TIM_CHANNEL_3 ,TIM_INPUTCHANNELPOLARITY_RISING );//检测上升沿
  9. flag =1;
  10. }
  11. else if(flag ==1)
  12. {
  13. s1=__HAL_TIM_GET_COMPARE (&htim2 ,TIM_CHANNEL_3);
  14. __HAL_TIM_SET_CAPTUREPOLARITY(&htim2 ,TIM_CHANNEL_3 ,TIM_INPUTCHANNELPOLARITY_FALLING );//检测下降沿
  15. flag =2;
  16. }
  17. else if(flag ==2)
  18. {
  19. s2=__HAL_TIM_GET_COMPARE (&htim2 ,TIM_CHANNEL_3);
  20. // HAL_TIM_IC_Stop_IT (&htim2 ,TIM_CHANNEL_3);
  21. __HAL_TIM_SetCounter(&htim2 ,0);
  22. distance =fabs(s2-s1)*0.017; //计算距离
  23. }
  24. osSemaphoreRelease (myBinarySem01Handle);//释放信号量
  25. }

二  舵机 

打开pwm:  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); 用的是定时器1 通道1。

输出pwm:   __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,2500);  放到一个函数里就不行。

  1. void Pwm_Task (void * argument)
  2. {
  3. for(;;)
  4. {
  5. if (osOK !=xSemaphoreTake(myBinarySem01Handle,10))
  6. {
  7. __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,1450);//先归中
  8. if(distance <=15)//如果距离小于15
  9. {
  10. Stop_Task (); //先停下
  11. __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,500);//右转
  12. osDelay (800);
  13. if(distance >15)//右边没有障碍物
  14. {
  15. Right_Task ();//右转
  16. osDelay (800);
  17. Forward_Task (); //前进
  18. }
  19. else if(distance <=15) //还小于15
  20. {
  21. __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,2500);//左转
  22. osDelay (800);
  23. Left_Task ();//
  24. osDelay (800);
  25. Forward_Task (); //前进
  26. }
  27. }
  28. }
  29. osDelay (300);
  30. }
  31. }

电机控制

高低电平

  1. void Forward_Task ()//
  2. {
  3. HAL_GPIO_WritePin (IN1_GPIO_Port ,IN1_Pin ,GPIO_PIN_RESET );
  4. HAL_GPIO_WritePin (IN2_GPIO_Port ,IN2_Pin ,GPIO_PIN_SET );
  5. HAL_GPIO_WritePin (IN3_GPIO_Port ,IN3_Pin ,GPIO_PIN_RESET );
  6. HAL_GPIO_WritePin (IN4_GPIO_Port ,IN4_Pin ,GPIO_PIN_SET );
  7. }
  8. void Back_Task ()//
  9. {
  10. HAL_GPIO_WritePin (IN1_GPIO_Port ,IN1_Pin ,GPIO_PIN_SET );
  11. HAL_GPIO_WritePin (IN2_GPIO_Port ,IN2_Pin ,GPIO_PIN_RESET );
  12. HAL_GPIO_WritePin (IN3_GPIO_Port ,IN3_Pin ,GPIO_PIN_SET );
  13. HAL_GPIO_WritePin (IN4_GPIO_Port ,IN4_Pin ,GPIO_PIN_RESET );
  14. }
  15. void Left_Task ()//
  16. {
  17. HAL_GPIO_WritePin (IN1_GPIO_Port ,IN1_Pin ,GPIO_PIN_RESET );
  18. HAL_GPIO_WritePin (IN2_GPIO_Port ,IN2_Pin ,GPIO_PIN_SET );
  19. HAL_GPIO_WritePin (IN3_GPIO_Port ,IN3_Pin ,GPIO_PIN_RESET );
  20. HAL_GPIO_WritePin (IN4_GPIO_Port ,IN4_Pin ,GPIO_PIN_RESET );
  21. }
  22. void Right_Task ()//
  23. {
  24. HAL_GPIO_WritePin (IN1_GPIO_Port ,IN1_Pin ,GPIO_PIN_RESET );
  25. HAL_GPIO_WritePin (IN2_GPIO_Port ,IN2_Pin ,GPIO_PIN_RESET );
  26. HAL_GPIO_WritePin (IN3_GPIO_Port ,IN3_Pin ,GPIO_PIN_RESET );
  27. HAL_GPIO_WritePin (IN4_GPIO_Port ,IN4_Pin ,GPIO_PIN_SET );
  28. }
  29. void Stop_Task ()//
  30. {
  31. HAL_GPIO_WritePin (IN1_GPIO_Port ,IN1_Pin ,GPIO_PIN_RESET );
  32. HAL_GPIO_WritePin (IN2_GPIO_Port ,IN2_Pin ,GPIO_PIN_RESET );
  33. HAL_GPIO_WritePin (IN3_GPIO_Port ,IN3_Pin ,GPIO_PIN_RESET );
  34. HAL_GPIO_WritePin (IN4_GPIO_Port ,IN4_Pin ,GPIO_PIN_RESET );
  35. }

四 cube配置

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/46277
推荐阅读
相关标签
  

闽ICP备14008679号