智能小车知识点总结

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 智能小车知识点总结

目录


ARM 体系结构

GPIO

使用GEC固件库实现GPIO操作(gec_gpio.h)

电机的使用

循迹传感器的使用

中断系统


正文


ARM 体系结构


一个公司的名字(英国)

一种处理器的体系架构(精简指令集RISC==>高性能低功耗)

采用这种架构的处理器


ARM系列 ARM内核 经典芯片

Cortex-M(mcu) M0/M1/M3/M4 STM32F407

Cortex-A(Application) A5/A7/A8/A9/A53 S5P6818

Cortex-R(realtime) R4/R5/R7/R8


STM32是意法半导体公司基于Cortex-M3/M4内核研发的一款微控制器(mcu),

主用应用于控制场合、工控场景。凭借着产品多样化,极高的性价比,

简单易懂的固件库开发方式,STM32在嵌入式领域深受欢迎。


GPIO


1,问题的引入

微控制器通过引脚连接控制输入输出设备

==>

STM32 GPIO的操作


2,STM32 GPIO的概述

GPIO是什么? General Purpose Input Output 通用目的的输入输出口线

其本质就是从芯片内部引出一根复用的口线,而且可以由CPU配置成不同的功能。

如: 输出功能、输入功能,其它的复用功能。


STM32F4XX共有144根GPIO口线,分为9组,记为GPIOA,GPIOB,GPIOC,。。。GPIOI。简写为PA、PB、PC…

PI。每组管理16根GPIO口线,编号为0~15。如GPIOA这一组有16个GPIO口,分别记为GPIOA0,GPIOA1,…

GPIOA15,简写为PA0,PA1,PA2,…PA15。


3,STM32F4XX GPIO内部原理结构(请参考《STM32F4中文参考手册》第7章)

每个GPIO口内部都可以配置成:

(1)输入功能:

CPU可以获取该GPIO口的外部输入的一个电平状态。输入功能也有几种模式:

a. 带上拉的输入(input pull-up):内部接了一个上拉电阻

默认的输入状态是高电平,可以被外部拉低

b. 带下拉的输入(input pull-down):内部接了一个下拉电阻

默认的输入状态是低电平,可以被外部拉高

c. 输入悬空(input floating):内部既没有接上拉电阻,也没有接下拉电阻

输入的信号完全由外部连接决定


(2)输出功能:

CPU可以往GPIO口输出一个电平状态。输出功能也有几种模式

a. 输出推挽(Push-Pull): 即可以输出高电平,也可以输出低电平

设置为输出高电平: 有电流流出,把外部拉高

设置为输出低电平: 电流流入芯片入地,把外部拉低

b. 输出开漏(Open-Drain): 没有输出电流的能力,但是可以输出低电平

设置为输出高电平: 实际上为开路状态

设置为输出低电平: 电流流入芯片入地,把外部拉低


(3)复用功能: Alternate Function

复用功能是指GPIO口用作其它功能的口线,如I2C、UART、SPI等等

每个GPIO口可以配置成多达16种复用功能,记为AF0,AF1,…AF15。


使用GEC固件库实现GPIO操作(gec_gpio.h)


/*
Gec_GPIO_Init: 初始化一个GPIO引脚
@GPIOx: 指定GPIO分组,如:GPIOA, GPIOB,…
@GPIO_Pin: 指定GPIO引脚编号,如:GPIO_Pin_0, GPIO_Pin_1,…
@gpio_mode: 指定GPIO的模式
enum GPIO_MODE
{
GPIO_MODE_IN_FLOATING, // 输入悬空
GPIO_MODE_IN_PULLUP, //带上拉的输入
GPIO_MODE_IN_PULLDOWN, //带下拉的输入
GPIO_MODE_IN_ANALOG, //模拟输入
GPIO_MODE_OUT_PP, //输出推挽
GPIO_MODE_OUT_OD, //输出开漏
GPIO_MODE_EXTI_Rising, //外部中断 “上升沿中断”
GPIO_MODE_EXTI_Falling, //外部中断 “下降沿中断”
GPIO_MODE_EXTI_Both, //外部中断,“双边沿中断 上升沿 || 下降沿”
GPIO_MODE_UNKOWN, //未知
};
返回值:
成功返回0
失败返回-1
/
void Gec_GPIO_Init(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, enum GPIO_MODE gpio_mode);
/*
Gec_GPIO_Get_Value: 获取某个GPIO的值
@GPIOx: 指定GPIO分组,如:GPIOA, GPIOB,…
@GPIO_Pin: 指定GPIO引脚编号,如:GPIO_Pin_0, GPIO_Pin_1,…
返回值:
0 -> 低电平
1 -> 高电平
/
int Gec_GPIO_Get_Value(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin);
/*
Gec_GPIO_Set_Value: 设置某个GPIO的值
@GPIOx: 指定GPIO分组,如:GPIOA, GPIOB,…
@GPIO_Pin: 指定GPIO引脚编号,如:GPIO_Pin_0, GPIO_Pin_1,…
@value:要设置的值
0 -> 低电平
1 -> 高电平
返回值:
无。
/
void Gec_GPIO_Set_Value(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, uint16_t value);


电机的使用


(1)电机的分类

1,步进电机,可以精确的控制旋转角度和旋转圈数

2,舵机,也叫伺服机,可以精确的控制旋转角度。旋转角度是有限的,

有90度的,也有180度的。

有一定的力量可以维持某个角度,多用于机械臂或者机器人的关节部位。

3,直流电机,可以精确的调节转速,不能控制旋转角


我们的智能小车是直流电机。


(2)电机驱动模块的连线

La ==> Camera3 ==> PB7

Lb ==> Camera4 ==> PD6

Ra ==> Camera5 ==> PA4

Rb ==> Camera6 ==> PD7


(3) 小车运动控制的实现

前进:

La 高电平 Lb 低电平

Ra 高电平 Rb 低电平


后退:

La 低电平 Lb 高电平

Ra 低电平 Rb 高电平

原地左转:

La 低电平 Lb 高电平

Ra 高电平 Rb 低电平

原地右转:

La 高电平 Lb 低电平

Ra 低电平 Rb 高电平

前进左转:

前进右转:


循迹传感器的使用


当模块检测到前方障碍物信号时,电路板上红色指示灯点亮,同时 OUT

端口持续输出低电平信号,该模块检测距离 2~60cm,检测角度 35°,检测距离可

以通过电位器进行调节,顺时针调电位器,检测距离增加;逆时针调电位器,检

测距离减少。


循迹: 当模块在黑色的线路上,OUT输出高电平,指示灯不亮,当模块移除黑色线路范围时,

OUT输出低电平。指示灯亮


避障: 当模块遇到障碍物时,OUT输出低电平,LED灯亮。原理障碍物时,OUT输出高电平,LED灯熄灭


IN1 ==> Camera7 ==> PG15

IN2 ==> Camera8 ==> PC6

IN3 ==> Camera9 ==> PC7

IN4 ==> Camera10 ==> PC8


中断系统


1,问题的引入

按键 ==> 灯

但是CPU并不知道按键何时会被按下?


传统解决办法:

把按键的GPIO配置为输入模式,然后让CPU定时去查询按键的GPIO口的输入状态,从而得到按键

是按下还是弹起的状态。


这种方式称为"轮询",即轮流询问。

轮询有天生的缺陷?

1)会使程序流程阻塞到死循环里

2)浪费CPU资源


有人提出,能不能这样做,按键按下或弹起的时候,外设主动通知CPU。

==> 中断


2,什么是中断呢?

中断我们一般定义为,打断CPU执行顺序的事件。

在芯片中,打断CPU执行顺序的事件,有两种情况:

1)硬件中断(硬件事件)

在CPU指令周期的任何时刻都有可能发生的。

“异步中断” ==> 中断

2)编程错误(系统错误)

在执行某条指令时,产生的一种编程错误/系统错误

也需要打断CPU的执行顺序,去做错误处理。

“同步中断” ==> 异常


中断源: 产生中断的设备。


3,STM32F4 GEC库中断配置

#include “gec_int.h”


//中断函数类型

typedef void (*isr_t) (void);//自定义的中断处理函数类型


//注册用户级的中断处理函数

void Gec_Int_Register(unsigned int int_id, isr_t isr);

@int_id: 中断编号,用来表示是哪个中断

@isr:interrupt service routine,函数指针

//注销用户级的中断处理函数

void Gec_Int_Unregister(unsigned int int_id);


//使能中断函数

void Gec_Int_Enable(unsigned int int_id);

//禁用中断函数

void Gec_Int_Disable(unsigned int int_id);


//外部中断标志位清除函数

EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位


##我们智能小车的知识就总结到这啦,如果有所帮助,可以点赞收藏哦,也不忘给笔者点个关注吧


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
存储 芯片
第六章 半导体存储器【微机原理】2
第六章 半导体存储器【微机原理】2
818 0
|
存储 芯片 内存技术
第六章 半导体存储器【微机原理】1
第六章 半导体存储器【微机原理】1
351 0
|
6月前
|
存储 芯片
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
|
6月前
|
算法 数据处理 芯片
【期末不挂科-单片机考前速过系列P9】(第九章:6题速过单片机概述)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P9】(第九章:6题速过单片机概述)经典例题盘点(带图解析)
|
6月前
|
存储 编译器 C语言
单片机学习之路一些常见的疑问也是我的个人学习总结
单片机学习之路一些常见的疑问也是我的个人学习总结
128 0
第六章 半导体存储器【微机原理】3
第六章 半导体存储器【微机原理】3
96 0
|
存储 芯片
微机原理基础知识
微机原理基础知识
241 0
|
算法 程序员
蓝桥杯单片机快速得奖方法(分享一些实用技巧)
蓝桥杯单片机快速得奖方法(分享一些实用技巧)
346 0
蓝桥杯之单片机学习(二十二)——模拟智能灌溉(附题目和完整代码)
蓝桥杯之单片机学习(二十二)——模拟智能灌溉(附题目和完整代码)
190 0
蓝桥杯之单片机学习(二十二)——模拟智能灌溉(附题目和完整代码)