嵌入式开发
嵌入式开发
学习路线
前置学习课程:模电、数电、单片机原理(51)、C++
Arduino 开发板
国内太极创客网站提供了非常详细的入门教程,的确是从零开始入门了,但是这会导致他的技术路线被拉得太长,如果有一定基础可以跳过基础部分直接看项目。
智能避障小车
- 设备材料:
设备名称 | 个数 | 单价/元 |
---|---|---|
Arduino UNO R3 开发板 | 1 | 30 |
AFMotor 电机拓展板 | 1 | 11.21 |
轮子 | 4 | 2.4 |
tt 直流电机 | 4 | 4.6 |
电池槽 (3 节) | 1 | 3.03 |
杜邦线(公对公) | 一排 | 4 |
杜邦线(母对母) | 一排 | 2.31 |
HC-R6 蓝牙模块 | 1 | 12 |
sg90 舵机 + HC-SR04 超声模块 + 支架 | 1 | 13 |
- 参考程序:github 开源
PCB 设计
PCB 设计分为原理图、PCB 板子布局、PCB 板子布线三部分。
我参考的教程:Expert 电子实验室
原理图设计
流程:元件选型、分模块且参考数据手册画电路图
- 元件选型:感觉需要多积累才能知道哪些功能需要用哪些芯片实现
目前我只停留在别人告诉我用啥我才知道用啥的阶段(元件选型后需要查找该元件数据手册,该数据手册上需要着重查看的内容包括:元件封装尺寸、元件典型电路、供电电压、工作温度、工作电压与电流。注意如果电源电压与供电电压不一致,需要用线性稳压器转换电压供电值
- 分模块画电路图:每个芯片的电路连接可以查看数据手册,分模块进行设计,比如说:主控模块,电源供电与指示模块、单片机最小实现电路、晶振电路等。
- 注意电源电流在输入进芯片时需要先进行滤波,滤波电容一般采用
100UF
与0.1UF
并联 - 在核心主控芯片连接电源时,一般会在旁边加一个
100UF
的去耦电容 - 在连接 LED 电源指示灯时,一般需要跟一个
1K
的分压电阻 - 51 单片机芯片的引脚灌电流远大于拉电流,所以在连接 LED 时,一般阴极和引脚相连
- 注意电源电流在输入进芯片时需要先进行滤波,滤波电容一般采用
PCB 布局与布线
善用嘉立创 EDA 专业版的元件跟踪(ctrl
+ x
)和快速布局(ctrl
+ Shift
+ X
)功能。属于是布局基本功了,能够根据原理图把对应的元件都提取出来,之后再根据自己的需求微调布局即可。
布线:别用锐角走线,布线尽可能对齐。注意:晶振电路与 USB 接口的电路连接需要采用差分布线,以防信号传输失真。
PCB 板子设计流程:
- 确定板框
- 确定定位孔位置,并锁定板框与定位孔
- 根据原理图,按照不同模块把电路元件提取出来(善用元件追踪与快速布局)
- 调整布局:
- 一般 USB 接口等要放置在板子边缘
- 晶振电路放在内部防止信号干扰
- 主控芯片摆在正中间位置
- 晶振与 USB 接口要方便差分布线
- 电源电流滤波时一般采用
100UF
的电容和0.1UF
的电容并联,电流先通过大电容再通过小电容最后输入进元件 - 电容电阻需要排列整齐,善用对齐工具
- 必要时可以把元件布置在底层
- 走线:
- 在
工程设计
-网络
-飞线
中先关闭电源线和地线,优先布信号线,从最关键的元件开始,布局要为走线服务; - 注意差分布线要设置差分对,误差满足设计规则
- 一般信号线线宽要求为
10mil
- 一般不在焊盘较宽处引出导线,否则会造成较大的泪滴,应该在较窄处引出
- 尽可能在顶层布线,必要时通过打过孔在底层走线
- 布置电源线需要设置较大的线宽,但是线宽不能宽于焊盘宽
- 多个电源焊盘可以通过填充区域连接,注意填充区域的网络要设置在电源网络,填充区域连接的网络标签要一致
- 在
- 铺铜
- 在板子上打多个小的地过孔,打在板子空白位置,靠近 GND 焊盘的地方也需要打孔
- 在顶层和底层分别铺铜,EDA 里有铺铜的选项
- 丝印调整
- 对于单片机最小系统芯片,需要把芯片引脚用底座引出,需要在每个引脚旁边标志引脚名称,方便后续程序调试
- 把电源指示灯的丝印调整为“Power”
- 加上自己的 logo 等个性化设计
- 导出 Gerber 方便嘉立创下单
项目实战
51 单片机核心板
元件选型:
关键芯片型号 | 作用 |
---|---|
TYPEC-C-P-DIP2X2 | 提供电源 |
AMS1117-3.3 | 将 5V 电源转化为 3.3V 电压 |
STC89C52RC 单片机 | 单片机核心芯片 |
原理图模块:电源电路(包括 TYPEC 供电、线性稳压器电压转换、开关电路)、晶振电路、复位电路、单片机最小系统电路、按键检测电路、LED 控制电路、电源引出引脚、单片机引出引脚、串口引出引脚、P0 口上拉电阻电路
USB 拓展坞
元件选型:
关键芯片型号 | 作用 |
---|---|
TYPEC-6PIN 母头 | 提供电源 |
SL2.1A | 将上行信号分配给 4 个下行 USB 接口 |
USB-A 型母座 180 度 短体 直边 | USB 接口芯片 |
1.5A 快恢复保险丝 -12.6 | 防止板子短路产生事故 |
原理图模块:TYPEC 电源电路、USB HUB 主控电路、电源指示和保险丝电路、下行 USB TYPEA 电路
注意:USB HUB 的主控电路中的晶振、4 个 USB TYPEA 模块中 DP,DM 口、TYPEC 上行口的 DP,DM 口、均需要采取差分对布线,防止信号失真。
通信协议
CAN 通信协议
全名是 Controller area network 控制器局域网通信,CAN 通信是把需要通信的设备均搭载在回路(CAN 总线)上,每个设备都配备有一个 CAN 收发器,不同设备的 CAN 的收发器上 CAN-high 和 CAN-low 接在一起,并接入 CAN 总线回路,就可以构成一个局域网。CAN 相较于串口、I2C 其好处在于,可以实现多主机多点接收的通信方式,多用于汽车上。参考的是江协科技的教程

- 每个设备上需要搭载 CAN 控制器,CAN 控制器的 TX,RX 和 CAN 收发器相连,CAN 收发器引出的 CAN-high,CAN-low 和总线的 CAN-high,CAN-low 相连
- 高速 CAN 使用闭环网络(分压电阻 120 欧),低速 CAN 使用开换网络(分压电阻 2.2 千欧),电阻用于防止回波反射,高速 CAN’里可以控制 0 和 1 信号的发射。
- CAN 总线采用差分信号,能够有效避免噪声干扰
- CAN 总线默认传输隐性电平(逻辑 1 信号)
- 数据叠加采用 “线与” 规则,一旦有一个设备拉开总线,则总线就呈现显性 0,而只有所有设备都放开总线,总线才能显示出隐性 1。
高速 CAN 规定(没写错,就是反直觉,因为 CAN 总线里传输的是电压差):
- 电压差为 0V 时表示逻辑 1(隐性电平,此时两线收紧,是默认状态,不需要干预,所以隐性)
- 电压差为 2V 时表示逻辑 0(显性电平,此时两线张开,需要干预,所以显性)
帧格式
- 数据帧:发送设备主动发送设备(广播式)
- 遥控帧:接收设备主动请求数据(请求式)
- 错误帧
- 过载帧
- 帧间隔
数据帧的标准格式
- 先把逻辑电平调至显性电平 0,打破总线空闲,作为起始帧
- 11 位的
报文ID
,表示报文功能,不能存在相同的报文 ID - 1 位的
RTR
,用于区分数据帧 or 遥控帧,数据帧为显性 0,遥控帧为隐性 1 (报文 ID 和 RTR 合起来组成一个仲裁段) - 1 位的
IDE
,区分标准格式 or 扩展格式,标准格式为显性 0,扩展格式为隐性 1 - 1 位的
R0
,必须为显性 0,保留位,为后续协议升级留出空间 - 4 位的
DLC
,表示数据长度 - 按照 DLC 指定字节数发送相对应的数据段
data
- 15 位的
CRC
,校验算法得到校验码放在这,用于判断传输是否有误 - 1 位的
ACK
槽,和 1 位的 ACK 界定符,表示应答。接收到数据的接收方要拉开总线,这时总线产生了短暂的权利交接,拉开总线,并且发送方读取到了这个显性电平,才能得知数据被正常发送且有设备收到 - 7 位的
EOF
,表示帧结束
可以分为以下部分
帧起始
仲裁段:报文 ID+1 位的 RTR
控制段:IDE+R0+4 位的 DLC
数据段:data
CRC 段:CRC 校验码+CRC 界定符
ACK 段:ACK 槽+ACK 界定符
结束段
注意:遥控帧请求数据时,没有数据帧。他的原理是,请求方向总线广播一条请求数据(包括报文 ID 和数据字节长度),拥有这个报文 ID 的设备再把该数据以数据帧的格式广播到总线上,请求方接收。其实就是两次广播。RTR 无数据段,RTR 为隐性电平 1,其他部分与数据帧相同。
位时序
一个数据位为 1bit,占据时间设定为 10Tq,Tqw=0.5us,定义为最小时间单位。
一个数据位可以被分为四段:
- SS:同步段,1Tq
- PTS:传播时间段,1-8Tq
- PBS1:相位缓冲段 1,1-8Tq
- PBS2: 相位缓冲段 2, 2-8Tq
数据采样点发生在 PBS1 和 PBS2 交界处。下面位同步所说的再同步补偿宽度值缩写是 TJW,一般取 1-4Tq,表示最大的补偿时间。如果此时的相位误差超过该最大值,则补偿最大值,如果此时相位误差不及最大值,那就补偿这个误差值,而不是 TJW。
注意的是,“补偿”指的是加或者减,如果时钟走慢了,就减;如果时钟走快了,就加。
接收方数据采样(位同步)
- CAN 总线没有时钟线(异步通信),总线上的所有设备通过约定波特率的方式确定每一个数据位的时长,发送方以约定的位时长发送数据,接收方以约定的位时长采样并接收数据,采样点需要位于数据位中心附近(可以配置,是在中心处/中心偏后/中心偏前)。
同步方式:
- 硬同步:解决”实际情况下,采样点没有对齐数据位中心附近“的问题;仅仅发生在 SOF 第一个跳变边沿
- 再同步:解决“实际情况下,接收方刚开始可能接收正确,但是由于时钟有误差,随着误差积累,采样点逐步偏离”的问题;任意一个数据跳变边沿都是再同步信号的参考边沿,通过在位时序中加入或减少再同步补偿宽度值调整采样点,进而实现采样点的校准。
仲裁
制定资源分配规则,解决多设备同时发送数据造成的资源冲突问题,保证只有一个设备在操纵总线,依次满足多设备发送需求。
- 先占先得:总线产生 11 个隐性电平时,才能认为总线空闲,此时才可以发送数据帧
- 非破坏性仲裁(多个设备的发送需求因为等待而同时到来,不存在谁先谁后):根据 ID 号进行非破坏性仲裁,ID 号小的优先发送,更大的仲裁失利后转入接收状态。实现非破坏性仲裁需要两个要求:
- 线与特性:总线上任何一个设备发送显性电平 0 时,总线就会呈现显性电平 0 状态,只有当所有设备都发送隐性电平 1 时,总线才呈现隐性电平 1 状态,即:0&X&X=0,1&1&1=1
- 回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态以确认自己发出的电平是否被真实地发送出去了,根据线与特性,发出 0 读回必然是 0,发出 1 读回不一定是 1
USART 串口通信协议
最简单的通信协议了。负责点对点的通信,全双工,时钟异步控制,单端信号(需共地)。两个设备之间的串口连线,RX 和 TX 要交叉连接。
应用:
- USB 转串口模块
- 陀螺仪测量位置姿态模块
- 蓝牙通信模块
电平标准
电平标准是指电平 1 和电平 0 代表多少电压。串口要在相同的电平标准下使用,不同的话要加装电平标准转换芯片。
电平标准 | 电平 1 的电压值 | 电平 0 的电压值 |
---|---|---|
TTL 电平 | +3.3V / +5V | 0V |
RS232 电平 | -3~-15V | +3~+15V |
RS485 电平(差分信号) | 两线压差+2~+6V | 两线压差-2~-6V |
帧格式
- 波特率:串口通信速率
- 起始位:标志数据帧的开始,固定为低电平
- 数据位:数据帧的有效载荷,从数据的低位开始发送
- 校验位:用于数据验证,奇校验/偶校验
- 停止位:用于数据帧间隔,固定为高电平
