赞
踩
目录


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


Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。