避障小车学习2

目录

一 超声波

二  舵机 

三 电机控制

四 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 )

void TIM2_Callback()
{
		TRIG_ON;
		delay_us(10);
		TRIG_OFF;
		if(flag ==0)
		{	
			__HAL_TIM_SET_CAPTUREPOLARITY(&htim2 ,TIM_CHANNEL_3 ,TIM_INPUTCHANNELPOLARITY_RISING );//检测上升沿
			flag =1;
		}
		else if(flag ==1)
		{
		s1=__HAL_TIM_GET_COMPARE (&htim2 ,TIM_CHANNEL_3);
		__HAL_TIM_SET_CAPTUREPOLARITY(&htim2 ,TIM_CHANNEL_3 ,TIM_INPUTCHANNELPOLARITY_FALLING );//检测下降沿
		flag =2;
		}
		else if(flag ==2)
		{
		s2=__HAL_TIM_GET_COMPARE (&htim2 ,TIM_CHANNEL_3);
//  	HAL_TIM_IC_Stop_IT (&htim2 ,TIM_CHANNEL_3);
 		__HAL_TIM_SetCounter(&htim2 ,0);
		distance =fabs(s2-s1)*0.017;  //计算距离
		}
		osSemaphoreRelease (myBinarySem01Handle);//释放信号量
}

二  舵机 

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

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

void Pwm_Task (void * argument)
{
	for(;;)
	{
		if (osOK !=xSemaphoreTake(myBinarySem01Handle,10))
		{
			__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,1450);//先归中
				if(distance <=15)//如果距离小于15
				{
				   Stop_Task ();     //先停下
				   __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,500);//右转
				   osDelay (800);
					if(distance >15)//右边没有障碍物
				  {
					 Right_Task ();//右转
					 osDelay (800);
					 Forward_Task (); //前进
				  }
					else if(distance <=15) //还小于15
				  {
					 __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,2500);//左转
						osDelay (800);
						Left_Task ();//左
						osDelay (800);
						Forward_Task (); //前进
					}
				}               
				}
		osDelay (300);
		}
		
	}

三 电机控制

高低电平

void Forward_Task ()//前
{
		HAL_GPIO_WritePin (IN1_GPIO_Port ,IN1_Pin ,GPIO_PIN_RESET );
		HAL_GPIO_WritePin (IN2_GPIO_Port ,IN2_Pin ,GPIO_PIN_SET );
		HAL_GPIO_WritePin (IN3_GPIO_Port ,IN3_Pin ,GPIO_PIN_RESET );
		HAL_GPIO_WritePin (IN4_GPIO_Port ,IN4_Pin ,GPIO_PIN_SET );
}

void Back_Task ()//后
{
		HAL_GPIO_WritePin (IN1_GPIO_Port ,IN1_Pin ,GPIO_PIN_SET );
		HAL_GPIO_WritePin (IN2_GPIO_Port ,IN2_Pin ,GPIO_PIN_RESET );
		HAL_GPIO_WritePin (IN3_GPIO_Port ,IN3_Pin ,GPIO_PIN_SET );
		HAL_GPIO_WritePin (IN4_GPIO_Port ,IN4_Pin ,GPIO_PIN_RESET );
}

void Left_Task ()//左
{
		HAL_GPIO_WritePin (IN1_GPIO_Port ,IN1_Pin ,GPIO_PIN_RESET );
		HAL_GPIO_WritePin (IN2_GPIO_Port ,IN2_Pin ,GPIO_PIN_SET );
		HAL_GPIO_WritePin (IN3_GPIO_Port ,IN3_Pin ,GPIO_PIN_RESET );
		HAL_GPIO_WritePin (IN4_GPIO_Port ,IN4_Pin ,GPIO_PIN_RESET );
}
void Right_Task ()//右
{
		HAL_GPIO_WritePin (IN1_GPIO_Port ,IN1_Pin ,GPIO_PIN_RESET );
		HAL_GPIO_WritePin (IN2_GPIO_Port ,IN2_Pin ,GPIO_PIN_RESET );
		HAL_GPIO_WritePin (IN3_GPIO_Port ,IN3_Pin ,GPIO_PIN_RESET );
		HAL_GPIO_WritePin (IN4_GPIO_Port ,IN4_Pin ,GPIO_PIN_SET );
}
void Stop_Task ()//停
{
		HAL_GPIO_WritePin (IN1_GPIO_Port ,IN1_Pin ,GPIO_PIN_RESET );
		HAL_GPIO_WritePin (IN2_GPIO_Port ,IN2_Pin ,GPIO_PIN_RESET );
		HAL_GPIO_WritePin (IN3_GPIO_Port ,IN3_Pin ,GPIO_PIN_RESET );
		HAL_GPIO_WritePin (IN4_GPIO_Port ,IN4_Pin ,GPIO_PIN_RESET );
}

四 cube配置

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值