STM32F103C8T6第7天:

news2024/9/24 7:15:04

1. 智能小车:让小车动起来(360.64)

硬件接线

  • B-2A – PB0
  • B-1A – PB1
  • A-1B – PB2
  • A-1A – PB10
  • 其余接线参考上官一号小车项目。

cubemx配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 代码(28.smartCar_project1/MDK-ARM)

2. 智能小车:串口控制小车(361.65)

  • 在 smartCar_project1 的基础上:
    在这里插入图片描述
  • 代码(28.smartCar_project2/MDK-ARM)(拷贝 4g_led_project 中串口接收数据相关的代码)

3. 智能小车:点动控制小车(362.66)

  • 提升滴答定时器的优先级,降低串口的优先级
    在这里插入图片描述
    在这里插入图片描述
  • 代码(28.smartCar_project3/MDK-ARM)(添加延时函数)
    在这里插入图片描述

4. 智能小车:硬件PWM调速(363.67)

硬件接线

  • B-1A – PA0
  • A-1A – PA1
  • B-1A – PB1
  • A-1A – PB10
    在这里插入图片描述

在这里插入图片描述

  • 代码(28.smartCar_project4/MDK-ARM)(修改arr即可调速)
    在这里插入图片描述
  • 将控制车轮的4个 GPIO 口配置修改如下,否则小车动不起来。
  • 原因:L9110每个控制口需要一高一低才可以动起来,如果PWM有效电平为高电平,则另一个GPIO口则需要输出低电平才可以驱动轮子。
    在这里插入图片描述

5. 智能小车:左右轮各自调速(364.68)

  • 代码(28.smartCar_project5/MDK-ARM)
//main.c
while (1)
  {
		__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,80);
		__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,150);
		HAL_Delay(1000);
		__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,150);
		__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,80);
		HAL_Delay(1000);
  }

6. 智能小车:循迹小车基本实现(365.69)

硬件接线

  • B-2A – PB0
  • B-1A – PB1
  • A-1B – PB2
  • A-1A – PB10
  • 循迹模块(左)DO – PB3
  • 循迹模块(右)DO – PB4

代码实现

  • 基于 smartCar_project1
  • 代码(28.smartCar_project6/MDK-ARM)
//main.c
#define LeftWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3)
#define RightWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)

while (1)
{
	if (LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value ==  GPIO_PIN_RESET)
    	goForward();
	if (LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value ==  GPIO_PIN_RESET)
    	goLeft();
    if (LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value ==  GPIO_PIN_SET)
    	goRight();
	if (LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value ==  GPIO_PIN_SET)
  		stop();
}

7. 智能小车:循迹小车解决转弯不平滑问题(366.70)

硬件接线

  • B-1A – PA0
  • A-1A – PA1
  • B-1A – PB1
  • A-1A – PB10

代码实现

  • 基于smartCar_project5(因为用到pwm)
    在这里插入图片描述
  • 代码(28.smartCar_project7/MDK-ARM)
//main.c
#define LeftWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3)
#define RightWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)
 while (1)
  {
		if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_RESET)
		{
			__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,199);
			__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,199);
		}
		if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_RESET)
		{
			__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,150);
			__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,80);
		}
		if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_SET)
		{
			__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,80);
			__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,150);
		}
		if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_SET)
		{
			__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,0);
			__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,0);
		}
  }
}

8. 智能小车:跟随小车的实现(367.71)

硬件接线

  • B-2A – PB0
  • B-1A – PB1
  • A-1B – PB2
  • A-1A – PB10
  • 红外跟随模块(左)OUT – PB5
  • 红外跟随模块(右)OUT – PB6

代码实现

  • 基于smartCar_project6(基本一致)
    在这里插入图片描述
  • 代码(28.smartCar_project8/MDK-ARM)
//main.c
#define LeftWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)
#define RightWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6)
 while (1)
  {
		if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_RESET)
			goForward();
		if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_RESET)
			goRight();
		if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_SET)
			goLeft();
		if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_SET)
			stop();
  }
}

9. 智能小车:摇头避障小车舵机封装(368.72)

硬件接线

  • sg90 – PB9

cubeMX配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 代码(28.smartCar_project9_1/MDK-ARM)
//sg90.c
#include "sg90.h"
#include "gpio.h"
#include "tim.h"
void initSG90(void)
{
  HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4); //启动定时器4
  __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 15); //将舵机置为90度
}
void sgMiddle(void)
{
  __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 15); //将舵机置为90度
}
void sgRight(void)
{
  __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 5); //将舵机置为0度
}
void sgLeft(void)
{
  __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 25); //将舵机置为180度
}
//main.c
initSG90();
HAL_Delay(1000);
while (1)
{
  sgLeft();
  HAL_Delay(1000);
  sgMiddle();
  HAL_Delay(1000);
  sgRight();
  HAL_Delay(1000);
  sgMiddle();
  HAL_Delay(1000);
}

10. 智能小车:摇头避障小车超声波传感器封装(369.73)

硬件接线

  • Trig – PB7
  • Echo – PB8

cubeMX配置

  • 基于 smartCar_project9_1
    在这里插入图片描述

代码实现

  • 代码(28.smartCar_project9_2/MDK-ARM)
//sr04.c
#include "sr04.h"
#include "gpio.h"
#include "tim.h"
//使用TIM2来做us级延时函数
void TIM2_Delay_us(uint16_t n_us)
{
  /* 使能定时器2计数 */
  __HAL_TIM_ENABLE(&htim2);
  __HAL_TIM_SetCounter(&htim2, 0);
  while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );
  /* 关闭定时器2计数 */
  __HAL_TIM_DISABLE(&htim2);
}
double get_distance(void)
{
    int cnt=0;
    //1. Trig ,给Trig端口至少10us的高电平
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);//拉高
    TIM2_Delay_us(20);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);//拉低
    //2. echo由低电平跳转到高电平,表示开始发送波
    //波发出去的那一下,开始启动定时器
    while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_RESET);//等待输入电平拉高
    HAL_TIM_Base_Start(&htim2);
    __HAL_TIM_SetCounter(&htim2,0);
    //3. 由高电平跳转回低电平,表示波回来了
    while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_SET);//等待输入电平变低
    //波回来的那一下,我们开始停止定时器
    HAL_TIM_Base_Stop(&htim2);
    //4. 计算出中间经过多少时间
    cnt = __HAL_TIM_GetCounter(&htim2);
    //5. 距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)
    return (cnt*340/2*0.000001*100); //单位:cm
}
//main.c
while (1)
{
  if(dir != MIDDLE){
    sgMiddle();
    dir = MIDDLE;
    HAL_Delay(300);
}
  disMiddle = get_distance();
  if(disMiddle > 35){
    //前进
 }
  else
 {
    //停止
    //测左边距离
    sgLeft();
    HAL_Delay(300);
    disLeft = get_distance();
    sgMiddle();
    HAL_Delay(300);
    sgRight();
    dir = RIGHT;
    HAL_Delay(300);
    disRight = get_distance();
 }
}

11. 智能小车:摇头避障小车封装电机驱动模块(370.74)

硬件接线

  • B-2A – PB0
  • B-1A – PB1
  • A-1B – PB2
  • A-1A – PB10

代码实现

  • 基于 smartCar_project9_2
    在这里插入图片描述
  • 代码(28.smartCar_project9_3/MDK-ARM)
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
  if(dir != MIDDLE){
    sgMiddle();
    dir = MIDDLE;
    HAL_Delay(300);
}
  disMiddle = get_distance();
  if(disMiddle > 35){
    //前进
    goForward();
 }else if(disMiddle < 10){
    goBack();
 }else
 {
    //停止
    stop();
    //测左边距离
    sgLeft();
    HAL_Delay(300);
    disLeft = get_distance();
    sgMiddle();
    HAL_Delay(300);
    sgRight();
    dir = RIGHT;
    HAL_Delay(300);
    disRight = get_distance();
    if(disLeft < disRight){
      goRight();
      HAL_Delay(150);
      stop();
   }
    if(disRight < disLeft){
      goLeft();
      HAL_Delay(150);
      stop();
   }
 }
  HAL_Delay(50);//防止卡死
}

12. 智能小车:测速数据通过串口发送到上位机(371.75)

硬件接线

  • 测速模块:
  • VCC – 3.3V (不能接 5V,否则遮挡一次会触发 3 次中断)
  • OUT – PB14

代码实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 代码(28.smartCar_project10/MDK-ARM)
//main.c
unsigned int speedCnt = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//外部中断源回调函数
{
	if(GPIO_Pin == GPIO_PIN_14)
		if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) == GPIO_PIN_RESET)
			speedCnt++;
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器中断回调函数
{
	printf("speed: %d\r\n", speedCnt);
	speedCnt = 0;
}
//main函数中:
HAL_TIM_Base_Start_IT(&htim2);//开启定时器中断

在这里插入图片描述

13. 智能小车:OLED代码二次开发(372.76)

硬件接线

  • SCL – PB6
  • SDA – PB7

封装Oled模块

  • 代码(28.smartCar_project11_1/MDK-ARM)

14. 智能小车:实现测速并使用Oled显示速度(373.77)

  • 代码(28.smartCar_project11_2/MDK-ARM)
    在这里插入图片描述
    在这里插入图片描述

15. 智能小车:Wifi测速小车并本地Oled显示(374.78)

硬件接线

  • 把 esp8266 插进串口1

代码实现

在这里插入图片描述
在这里插入图片描述

  • 代码(28.smartCar_project12/MDK-ARM)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1263728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python爬虫进阶教程之如何正确的使用cookie

文章目录 前言一、获取cookie二、程序实现三、动态获取cookie四、其他关于Python爬虫技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Pytho…

自学成为android framework工程师需要准备哪些装备-千里马车载车机系统开发学习

背景 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;经常有很多学员买课同学都会问到需要准备哪些装备&#xff0c;我也回答了很多学员了&#xff0c;今天就搞一篇文章来统一说明一下&#xff0c;告诉一下大家如果你想从一个framework新手变成一个framework开发的高…

微服务--04--SpringCloudGateway 网关

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.网关路由1.1 认识网关在SpringCloud当中&#xff0c;提供了两种网关实现方案&#xff1a; 1.2.快速入门1.3.路由过滤 2.网关登录校验2.1.鉴权思路分析2.2.网关过滤…

vue+echarts实现依赖关系无向网络拓扑结图节点折叠展开策略

目录 引言 一、设计 1. 树状图&#xff08;不方便呈现节点之间的关系&#xff0c;次要考虑&#xff09; 2. 力引导依赖关系图 二、力引导关系图 三、如何实现节点的Open Or Fold 1. 设计逻辑 节点展开细节 节点收缩细节 代码实现 四、结果呈现 五、完整代码 引言 我…

使用Kafka、Flink、Druid构建实时数据系统架构

1. 背景 对于很多数据团队来说&#xff0c;要满足实时需求并不容易。为什么&#xff1f;因为作流程&#xff08;数据采集、预处理、分析、结果保存&#xff09;涉及大量等待。等待数据发送到 ETL 工具&#xff0c;等待数据批量处理&#xff0c;等待数据加载到数据仓库中&#…

数据库的增删查改(CRUD)基础版

CRUD: create增加、retrieve查询、update更新、delete删除 注意一点&#xff1a;MySQL对大小写是不敏感的 目录 新增&#xff08;create&#xff09; 全列插入 指定列插入 多行插入 查询&#xff08;Retrieve&#xff09; 列查询 全列查询 指定列查询 表达式查询 …

【蓝桥杯 LCA 差分】 砍树

题目分析&#xff1a; 这道题还是比较裸的一道书上差分的题目了 对于每一对标记点(x,y) 他们之间的路径就是 x − > L C A ( x , y ) − > y x->LCA(x,y)->y x−>LCA(x,y)−>y 这条路径上的每一条边都要经过。 那么对于一条边&#xff0c;什么时候砍掉这条…

网工内推 | 外企网工,五险一金,弹性工作,最高30k*14薪

01 金蝶软件&#xff08;中国&#xff09;有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、合理规划公司网络&#xff0c;保障网络架构的合理性、可靠性及前瞻性&#xff1b; 2、负责公司网络运维&#xff0c;处理日常运维事件&#xff0c;保障网络的稳定可…

Leetcode算法系列| 3. 无重复字符的最长子串

目录 1.题目2.题解C# 解法一&#xff1a;滑动窗口算法C# 解法二&#xff1a;索引寻找Java 解法一&#xff1a;滑动窗口算法Java 解法二&#xff1a;遍历字符串 1.题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例1: 输入: s "ab…

springboot中4级配置文件优先级

springboot中4级配置文件优先级

C++STL库常用详解与原理

CSTL库 学习方法&#xff1a;使用STL的三个境界&#xff1a;能用&#xff0c;明理&#xff0c;能扩展。 常用库 库名称所需头文件数据结构string#include<string>串vector#include<vector>动态数组list#include<list>带头双向循环链表queue#include<queu…

双馈风机频率二次跌落,永磁风机一次调频火电水电光伏储能直流一次调频,虚拟惯性下垂控制,虚拟同步机VSG控制,二次调频也可继续深入研究

双馈风机(永磁同步风机)虚拟惯性控制下垂控制参与系统一次调频的Matlab/Simulink模型&#xff0c;调频结束后转速回复&#xff0c;造成频率二次跌落SFD。 系统为三机九节点模型&#xff08;可更换为四机两区域&#xff0c;十机39节点&#xff0c;IEEE39节点&#xff0c;IEEE11…

WIN10 x86环境部署ARM虚拟机(银河麒麟)

我们经常使用的是x86架构的cpu&#xff0c;而对于不同cpu架构的arm架构的操作系统&#xff0c;我们可以通过QEMU模拟器来进行模拟一个arm环境 1、部署前的准备 arm的镜像&#xff1a; 以此镜像为例&#xff1a;Kylin-Server-10-SP2-aarch64-Release-Build09-20210524.iso QE…

Codeforces Round #911 (Div. 2)

A.Cover in Water 题意&#xff1a; 有一个 1 n 1 \times n 1n的水池&#xff0c;里面有些格子可以加水&#xff0c;有些格子是被堵上的&#xff0c;你可以进行以下两种操作&#xff1a; 1.往一个空的格子里加水 2.移除一个有水的格子中的水&#xff0c;并将这些水添加到另…

智能优化算法应用:基于混合蛙跳算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于混合蛙跳算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于混合蛙跳算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.混合蛙跳算法4.实验参数设定5.算法结果6.参考…

Selenium+Python做web端自动化测试框架与实例详解教程

最近受到万点暴击&#xff0c;由于公司业务出现问题&#xff0c;工作任务没那么繁重&#xff0c;有时间摸索seleniumpython自动化测试&#xff0c;结合网上查到的资料自己编写出适合web自动化测试的框架&#xff0c;由于本人也是刚刚开始学习python&#xff0c;这套自动化框架目…

Roll-A-Ball 游戏

Roll-A-Ball 游戏 1&#xff09;学习资料 b站视频教程&#xff1a;https://www.bilibili.com/video/BV18W411671S/文档&#xff1a; * Roll-A-Ball 教程&#xff08;一)&#xff0c; * Roll-A-Ball 教程&#xff08;二)线上体验roll-a-ball成品 * http://www-personal.umich.e…

从裸机启动开始运行一个C++程序(十五)

前序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;十四&#xff09; 从裸机启动开始运行一个C程序&#xff08;十三&#xff09; 从裸机启动开始运行一个C程序&#xff08;十二&#xff09; 从裸机启动开始运行一个C程序&#xff08;十一&#xff09; 从裸机启…

金字塔原理 读书笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言第1篇 表达的逻辑第1章 为什么要用金字塔结构归类分组&#xff0c;将思想组织成金字塔自上而下表达&#xff0c;结论先行自下而上思考&#xff0c;总结概括 第2…