STM32开发 您所在的位置:网站首页 实时汽车测速 STM32开发

STM32开发

2023-11-04 10:08| 来源: 网络整理| 查看: 265

目录

1.循迹小车

1.1CubeMX配置

 1.2函数代码

2.避障小车

3.小车测速

1.循迹小车

需求:用左右轮实现PWM调速、红外传感器获取道路信息改变方向。

左边红外D0——PB12 右边红外D0——PB13

1.1CubeMX配置

 1.2函数代码

motor.c代码

#include "gpio.h" #include "tim.h" #define rightcon1A_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET) #define rightcon1A_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET) #define rightcon1B_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET) #define rightcon1B_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET) #define leftcon1A_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET) #define leftcon1A_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET) #define leftcon1B_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET) #define leftcon1B_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET) void go_forward() { __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 150); __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 150); } void go_left() { __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 85); __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 150); } void go_right() { __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 115); __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 85); } void go_backward() { leftcon1A_high; leftcon1B_low; rightcon1A_high; rightcon1B_low; } void stop() { __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 0); __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 0); }

main.c

#include "motor.h" #define xunj_left_valve HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12) #define xunj_right_valve HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13) //main HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2); while (1) { if(xunj_left_valve==GPIO_PIN_RESET && xunj_right_valve==GPIO_PIN_RESET){ //直行 朿夿199 go_forward(); } if(xunj_left_valve==GPIO_PIN_SET && xunj_right_valve==GPIO_PIN_RESET){ //左转 go_left(); } if(xunj_left_valve==GPIO_PIN_RESET && xunj_right_valve==GPIO_PIN_SET){ //右转 go_right(); } if(xunj_left_valve==GPIO_PIN_SET && xunj_right_valve==GPIO_PIN_SET){ //停止轿 stop(); } } 2.避障小车

tim1:定时1us(超声波测距) tim2:产生PWM波20ms(左右轮调速ch1、ch2) 产生PWM波20ms(舵机ch3)  7199、199

motor.c代码相同

main.c

double left_dis,right_dis,mid_dis; float distance,left_distance,right_distance; void TIM1_Delay_us(uint16_t n_us) { // 使能定时噿1计数 // __HAL_TIM_ENABLE(&htim1); __HAL_TIM_SetCounter(&htim1, 0); while(__HAL_TIM_GetCounter(&htim1) < ((1 * n_us)-1) ); // 关闭定时噿1计数 // __HAL_TIM_DISABLE(&htim1); } float sound_range(void) //返回个距禿? { uint16_t cnt; //1. Trig ,给Trig端口至少10us的高电平 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); TIM1_Delay_us(15); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //2. echo由低电平跳转到高电平,表示开始发送波 //波发出去的那丿下,弿始启动定时器 while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5) == GPIO_PIN_RESET); __HAL_TIM_SetCounter(&htim1,0); //定时器计数记得复使 运行了,感觉要不要都可以 HAL_TIM_Base_Start(&htim1); //也可以用启动定时器函数__HAL_TIM_ENABLE(&htim2) 后面用disable //3. 由高电平跳转回低电平,表示波回来 //波回来的那一下,我们始停止定时器 while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5) == GPIO_PIN_SET); HAL_TIM_Base_Stop(&htim1); //4. 计算出中间经过多少时 cnt=__HAL_TIM_GetCounter(&htim1); //5. 距离 = 速度 340m/s* 时间/2(计1次表1us return (340*cnt*0.000001/2*100); //返回的是cm } //main中代码 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_3,0); //保持中间使5 中间18 右边55 distance=sound_range(); //用超声波棿测是否到达某个距禿 distance 10 ){ //距离大于10cm go_forward(); }else{ //距离


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有