在MCU的选型上,在一开始我就比较倾向于自己熟悉的STM32系列。从成本和加工工艺角度考虑,BGA封装的MCU是第一时间排除掉的,QFP封装的是首选。
如何选择MCU呢?对这辆小车来说,我觉得只要满足下面几个条件即可:
1)定时器资源足够,并且支持PWM、输入捕获功能
2)IO引脚足够
3)IO需要兼容3.3V和5 V
4)RAM和ROM够用
上一节已经列出了大致需要的IO资源,定时器资源数量需求如下:
序号 | 工作方式 | 功能模块 | 定时器数量 | TIMER作用 | 备注 |
1 | SYSTICK | 系统时钟 | 1 | 系统1ms定时器,供延时处理和OS tick使用 | 独立定时器 |
2 | ADC | 避障、循迹、光敏、电压检测 | 1 | 定时触发采样 | 可复用 |
3 | TIM-PWM | 电机驱动 | 2 | PWM输出 | 独立定时器 |
4 | TIM-CAP | 码盘测速 | 4 | 接收捕获 | 可复用 |
5 | USART | WIFI/预留串口 | 2 | 接收超时 | 独立定时器,后来用IDLE检测方式,节省定时器做预留它用 |
6 | TIM-CNT | 超声波 | 1 | 超声波行程时间计算 | 可复用 |
7 | PWM | 舵机 | 1~2 | 20msPWM输出 | 独立定时器 |
8 | 红外发射 | 红外周期发射 | 1 | 预留给车身指示用 | 可复用 |
从表中可以看出,需要独立的定时器有系统时钟、电驱PWM(8通道)、舵机(最少2通道,尽量预留更多通道)、其他TIMER可以复用或者独立使用。很明显,STM32全系列的都能找到,有些同学喜欢用freescale(NXP)的,也很容易找到能满足的MCU。
接下来去翻datesheet或者官方的选型表,找几种型号对别下资源找下RAM和ROM是否够用。ROM根据经验,一般不会超过100K,考虑到BOOT+IAP,256K的够用了,RAM越大越好,因为如果用OS的话,OS自身还要占用部分RAM。
(图片来自ST官网)
对熟悉和用过某个系列芯片的同学来讲上述这张图大致能敲定某个系列的,比如我选的是STM32F1系列的,主频为72MHz,RAM和ROM、定时器和IO数量这些资源信息在datasheet中会详细列出。而且Mainstream和High performance系列的MCU之间有些是可以做简单的兼容设计就可以做到pin-to-pin兼容,可以提前做好兼容设计。
更详细的选型可以在官网上看到更详细的MCU规格信息,如下图
(图片来自ST官网)
我根据经验直接在STM32F1系列中进行选择了,72MHz主频估计应该够用,该系列资源情况如下表所示:
(图片来自st芯片datasheet)
到这里,我基本上已经倾向与选STM32F103Rx了,但是上一节我们统计过需要58个IO,多了7个怎么办呢,那就减少扩展功能呗,预留太多也是一种负担:)
最终我分配好的定时器资源如下:
TIMER | 主功能 | 复用功能 |
SYSTICK | 1ms TICK时间 |
|
TIMER1 | 电机-后驱 |
|
TIMER2 | ADC 采样触发(TIM2_CH2) |
|
TIMER3 | TIM3_CH2:红外周期发射 | TIM3_CH1:舵机 |
TIMER4 | TIM4_CH1:左编码器 | TIM4_CH1:舵机 |
TIMER5 | 超声波时间计算 |
|
TIMER6 | 空闲 |
|
TIMER8 | 电机-前驱 |
|
分配好的IO引脚如下(引脚定义就不写中文了,英文应该容易看得懂):
引脚编号 | 引脚名称 | PIN脚定义 |
2 | PC13 | CPU_LED_RED |
3 | PC14 | CPU_LED_GREEN |
4 | PC15 | CPU_LED_BLUE |
7 | NRST | 复位输入 |
8 | PC0 | ADC_INF_OBS_MIDDLE_FRONT |
9 | PC1 | CPU_SPI2_CS1 |
10 | PC2 | ADC_INF_OBS_LEFT_FRONT |
11 | PC3 | ADC_INF_OBS_RIGHT_FRONT |
14 | PA0 | ADC_LIGHT_FRONT |
15 | PA1 | ADC_INF_OBS_RIGHT_REAR |
16 | PA2 | CPU_MODEM_USART_TX |
17 | PA3 | CPU_MODEM_USART_RX |
20 | PA4 | ADC_PWR_SUPPLY |
21 | PA5 | ADC_INF_OBS_LEFT_REAR |
22 | PA6 | ADC_INF_OBS_MIDDLE_REAR |
23 | PA7 | CPU_INF_FOLLOW_TX_TIM1_CH1N |
24 | PC4 | ADC_TRC_INF_MF |
25 | PC5 | ADC_TRC_INF_RF |
26 | PB0 | ADC_TRC_INF_LF |
27 | PB1 | CPU_ULTRASONIC_ECHO_F |
28 | PB2/BOOT1 | CPU_ULTRASONIC_TRIG_F |
29 | PB10 | CPU_I2C2_SCL |
30 | PB11 | CPU_I2C2_SDA |
33 | PB12 | CPU_SPI2_CS0 |
34 | PB13 | CPU_SPI2_SCK |
35 | PB14 | CPU_SPI2_MISO |
36 | PB15 | CPU_SPI2_MOSI |
37 | PC6 | CPU_MOTO_LEFTA |
38 | PC7 | CPU_MOTO_LEFTB |
39 | PC8 | CPU_MOTO_RIGHTA |
40 | PC9 | CPU_MOTO_RIGHTB |
41 | PA8 | CPU_BACK_MOTO_LEFTA |
42 | PA9 | CPU_BACK_MOTO_RIGHTA |
43 | PA10 | CPU_BACK_MOTO_RIGHTB |
44 | PA11 | CPU_BACK_MOTO_LEFTB |
45 | PA12 | CPU_ESP-07_NRST |
50 | JTDI | CPU_SPI1_CS0 |
51 | PC10 | CPU_LED_LF |
52 | PC11 | CPU_LED_RF |
53 | PC12 | CPU_LED_LR |
54 | PD2 | CPU_LED_RR |
55 | JTDO | CPU_SPI1_SCK |
56 | NJTRST | CPU_SPI1_MISO |
57 | PB5 | CPU_SPI1_MOSI |
58 | PB6 | CPU_ENCODER_CH1_TIM4_CH1 |
59 | PB7 | CPU_ENCODER_CH2_TIM4_CH |
61 | PB8 | ADC_INF_RECEIVER |
62 | PB9 | CPU_SERVO1_PWM_TIM4_CH4 |
到此,集成小车的功能、方案和选型就全部敲定了。
接下来就可以动手画原理图、PCB和coding了。
后续章节把一些有分享价值的写出来供大家参考,硬件和软件会结合在一起分享。
另外,下周没那么多时间写博客,代码写得有些乱,直接放出来怕大家拍我砖,让我整理下。我会尽快把集成小车的内容分享完,顺便把资料放在大家都能访问到的地方(暂定github,最近访问有点慢)。
有问题请大家在讨论区留言,有空就会作答。