目录
一 超声波
用输入捕获的方法,原理:先设置输入捕获为上升沿检测,记录发生上升沿时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 );
}