一、背景

前面已经构建了掌上单片机实验室的硬件基础,并选择、安装了配套的编程环境,目前要做的工作就是将它激活,即基于所选择的 Arduino IDE,在构建的硬件上,编写相应程序,使所提供的硬件可以运转,成为一个可以用的实验平台。

二、需求

实验平台包含三个部分:小车底盘、STM32核心板、Arduino IDE编程环境。

小车底盘可以抽象为:

即2组输入和输出信号组成的模块,各端口定义为:

  1. G —— 电源地线;
  2. BAT —— 电机驱动 H 桥供桥电压 5V(正极),包括检测电路LM358的供电;
  3. CT1 —— 电机控制线 CTRL1,电机控制 PWM 信号;
  4. CT2 —— 电机控制线 CTRL2,电机运行状态控制,与 CTRL3配合;
  5. CT3 —— 电机控制线 CTRL3,电机运行状态控制,与 CTRL2配合;
  6. VCC —— H 桥驱动逻辑电路74HC08的供电电压(正极);
  1. P2 —— 空腿,留给用户根据需要处置;
  2. P1 —— 码盘采样脉冲输出线
  3. G —— 信号地线,和电源地线内部相连,只是为了方便使用而增加。
  4. MI —— 电机电流检测信号输出线;
  5. VB —— 电机工作电压检测信号输出线;

根据上述对象,激活的需求为:

  1. 在Arduino IDE 下正常使用 STM32F103C8核心板
  2. 在 Arduino IDE 下编程驱动小车底盘运动
  3. 在 Arduino IDE 下编程采集小车编码器反馈信号
  4. 在 Arduino IDE 下编程采集小车驱动电机的电压和电流

完成这几步就说明实验平台上述三大部分都可以正常使用,即激活了,具备了作为实验设备的基本能力。

三、实施

3.1 使电路正常工作

安装核心板后的小车如下:

在基板上有5V和GND插针,用杜邦线将5V和GND连接到核心板对应插针上,核心板即具备了工作条件。

3.2 第一个使用STM32的Arduino程序

PC上学习编程通常是以输出“Hello World!”为开始,和PC上学习类似,单片机上的第一个程序通常是使LED闪烁。

为了验证STM32Duino的兼容性,使用Arduino标准例程中的Blink测试。

安装好Arduino IDE及STM32Duino后,在“工具”下拉菜单中设置“upload method:”为“STM32CubeProgrammer(SWD)”,以便可以正确使用 STlink 下载程序到核心板。

核心板上有相应的SWD接口,为一4芯插针,信号顺序为:VCC、DIO、DCLK、GND

核心板5V端为供电端,板上安装了一个3.3V稳压器,为MCU提供3.3V工作电压,同时可以输出,但负载不能大。基板上已经提供了3.3V电源,最大可输出800mA,建议不使用核心板的3.3V输出。

SWD端的VCC接到3.3V,作为STlink检测目标板是否正常供电的信号,不建议使用STlink通过此端子供电。

要正常使用STlink,可能需要安装相应的驱动,具体根据STlink的资料操作。

连接好STlink后,打开基板上的电源开关,给核心板供电。

运行Arduino IDE,选择好开发板和下载方式,打开Arduino标配的示例程序Blink:

// the setup function runs once when you press reset or power the board

void setup() {

// initialize digital pin LED_BUILTIN as an output.

pinMode(LED_BUILTIN, OUTPUT);

}

// the loop function runs over and over again forever

void loop() {

digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)

delay(1000);                       // wait for a second

digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW

delay(1000);                       // wait for a second

}

下载到核心板上,观察核心板上的LED是否闪烁?(核心板上有两个LED,见上图,标注POWER的是电源指示灯,标注PC13的LED是接在IO口PC13上的)。

注意:初期的Arduino示例程序Blink引脚定义用的是D13,对应UNO板上的数字IO第13脚,后来为了兼容各种开发板,将LED的引脚改为符号化定义:LED_BUILTIN。

在本开发板PILL-F103XX目录下的 variant.h 文件中,定义了:

#define LED_BUILTIN             PC13

由此保证了可以正确点亮对应类型开发板上的LED。

下载完成后,LED正常闪烁,1秒亮、1秒灭:

Blink

为了验证是否是自己所下载的程序,可以修改程序中的Delay时间(单位ms),看看闪烁的变化是否符合修改的预期。

由此可以感受到:使用Arduino IDE编写程序,实施过程十分简单,无需繁杂的准备过程,以及和程序功能不相干的辅助信息,直接切入主题。

3.3 驱动小车底盘

通过第一个程序,已经实现了核心板的数字IO输出,利用此即可尝试驱动电机转动,让小车底盘动起来。

小车底盘两侧电机驱动是相同的,使用3个端子驱动,驱动逻辑如下:

表中,Ctrl1、Ctrl2、Ctrl3对应小车框图上的CT1、CT2、CT3。Drv1、Drv2、Drv3、Drv4是H桥驱动电路中4个桥臂MOS管的状态,可以不关注;只需掌握CT1、CT2、CT3电平对应的电机状态即可。

按图所述,CT2、CT3组合,控制电机实现四个工作状态:刹车、正转、反转、惰行。

刹车是指:将电机端子短路,构成闭合回路,电机转子惯性转动时,切割定子磁力线产生反电势形成电流,按磁力学原理,会阻碍电机转动,谓之“刹车”。

惰行是指:将电机端子开路,电机转子惯性转动时,切割定子磁力线产生反电势无法形成电流,故不存在阻碍电机惯性转动的额外力矩,只有正常的摩擦阻力,此时电机断电后惯性转动时间会较长,谓之“惰行”。

CT1为电机PWM控制端,利用输出的占空比改变输出给电机的平均功率,从而改变电机的做功能力。

因为直流电机PWM驱动为常用功能,故Arduino为其封装了极其简单的驱动函数:

analogWrite(pin, value)

参数pin为输出引脚,value为PWM占空比。

对于标准的Arduino开发板,只有少数引脚支持此函数(如UNO,只支持3、5、6、9、10、11),但对于小车所选用的PILL_F103xx,似乎所有引脚都可以。

Value默认范围为 0 ~ 255,255对应100%占空比,即所谓的8位分辨率。此处只是激活硬件,不做深入探究,就按8位分辨率使用(STM32Duino支持分辨率设置,可以选择10位分辨率,即0 ~ 1023)。

按上述小车框图,驱动两个电机需要6个数字IO输出端口。

参考variant.h 中的数字IO引脚定义,选择PB4 ~ PB9 (对应Arduino定义 0 ~ 5)6个IO引脚作为驱动端口

PB4:左侧 CT1

PB5、PB6:左侧CT2、CT3

PB7:右侧 CT1

PB8、PB9:右侧CT2、CT3

基于Arduino函数(关于Arduino 函数自行参考官方文档,此处不再赘述)编写小车底盘驱动程序,实现上电后运转5秒,为避免在桌上运转时掉到地上,左右侧轮反向转动,小车原地打转。

仿照Blink程序,使用最简单的逻辑完成小车底盘驱动,程序如下:

#define CT1_Left  PB4         // 使用符号定义,程序便于理解,也便于替换引脚

#define CT2_Left  PB5

#define CT3_Left  PB6

#define CT1_Right PB7

#define CT2_Right PB8

#define CT3_Right PB9

int runTime;

void setup() {

// put your setup code here, to run once:

pinMode(CT1_Left, OUTPUT);

pinMode(CT2_Left, OUTPUT);

pinMode(CT3_Left, OUTPUT);

pinMode(CT1_Right, OUTPUT);

pinMode(CT2_Right, OUTPUT);

pinMode(CT3_Right, OUTPUT);

runTime = 5;

analogWrite(CT1_Left,0);           // 初始化输出PWM = 0, 停止电机

analogWrite(CT1_Right,0);

}

void loop() {

// put your main code here, to run repeatedly:

if(runTime>0){

digitalWrite(CT2_Left,HIGH);      // 左侧正转

digitalWrite(CT3_Left,LOW);

digitalWrite(CT2_Right,HIGH);     // 右侧正转,因为两侧电机安装方向相反,故电机转动方向相反

digitalWrite(CT3_Right,LOW);

analogWrite(CT1_Left,150);        // 启动电机

analogWrite(CT1_Right,150);

delay(1000);

runTime--;

}

else{

analogWrite(CT1_Left,0);           // 停止电机

analogWrite(CT1_Right,0);

}

}

程序下载后,小车运转正常:

使用 STM32Duino 驱动电机

虽然上述程序没有涉及到 STM32的IO初始化细节,但从单片机应用的趋势来看,厂家越来约倾向于将芯片的细节封装,引导客户用库函数、API思路进行编程,实现“与硬件无关的编程方式”。观察ST公司所提供的库函数升级过程就能看出其用意。

对硬件的了解更多侧重于工作原理和概念,就像计算机专业的课程,计算机原理只是为了让学生了解计算机是如何工作的,编程时完全不涉及到CPU硬件层面。

用Arduino编程环境,在编程中不必在耗费精力消化芯片手册;但要想用好单片机,正确的发挥其作用,还是需要对其工作原理有所了解,此时阅读的目的在于了解工作原理,而非查阅、使用那些繁杂的寄存器定义,将学习的重点上升到理解层面,而不是停留在记忆层面,被大量无需记忆的信息所困扰。

3.4 获取小车底盘运动反馈

小车底盘设计了简易的运动反馈:码盘;用轮毂上的60个齿实现(行话为60线)。

虽说精度只有:3.4mm/脉冲(车轮直径65mm)

但至少有了反馈,可以据此控制小车的运动距离、速度,作为学习素材,重点是原理而非所实现的效果。

下面就用小车底盘提供的运动反馈对小车底盘实施控制,用反馈脉冲计数代替前面的定时。

为此控制器需要增加两个数字输入端口,从variant.h 中选择:

PC14:左侧脉冲输入

PC15:右侧脉冲输入

使用Arduino提供的中断功能采集,因为转动后,脉冲速率较快,中断采集可以保证不丢失脉冲。

程序在前一程序基础上修改,将定时计数改为脉冲计数。

在原有程序上增加了左、右侧脉冲计数中断服务,初始化完成计数初值和转动方向初始化,启动电机后,在中断服务中对脉冲进行减计数,到零则停止电机运转。

Arduino封装了简单的中断初始化函数:

attachInterrupt(PULSEIN_LEFT, countLeft, RISING);

其中:

第一个参数:中断采集端口;

第二个参数:中断服务程序,中断触发后调用;

第三个参数:中断触发条件,选择输入脉冲的上升、下降沿,或者两者都触发。

逻辑十分清晰,使用很简单。

程序见附件。

采集编码器反馈演示

3.5 采集小车底盘驱动电机的电压和电流

在小车底盘电路中设计电机驱动电压和电流检测是为了两个目的:

  1. 增加学习素材,如利用电流检测保护电路,避免电机堵转造成电流过大,损坏驱动电路。
  2. 增加学习模拟量采样内容。

此处只是激活实验平台,故只是实现采集,说明硬件具备此功能,通过编程可以实现采集即可。

由于小车底盘没有显示器,采集的数据无法显示。

但Arduino IDE似乎考虑到了这一点,做了两方面努力:

  1. 在函数库上提供了方便的串口输出函数,类似于PC上的print函数,只是通过串口将要显示的数据输出。
  2. 为了输出的内容可以方便的显示,在 Arduino IDE环境中集成的类似于串口调试助手的功能:串口监视器(Monitor)

可如何将单片机的串口和PC机连上呢?

最常用的方式是用一个USB串口适配器,即可将PC的USB虚拟为一个串口,将适配器上的TTL电平串口端连接到单片机上的USART口即可。

但我们的连接对象是小车,这种有线连接会使得小车运动受限,失去了小车的功能。能否找到一个方便的无线连接方式呢?

用蓝牙透传模块即可!市场上此类产品很多,而目前大家多数使用笔记本电脑,一般会内置蓝牙,这样即可实现通过蓝牙的无线通道。

使用蓝牙还有一个好处:具备了和手机通讯的可能,可为后续实验增加较多素材,增加实验的趣味性和实用性,因为手机在很多场合已取代PC成为最常用的终端设备。

建议选择这一款蓝牙透传模块:

和控制板连接说明(使用基板上的3.3V供电),

GND —— GND

TXD —— PA10 (这是STM32Duino 默认的串口USART1)

RXD —— PA9

VCC —— 控制基板上的3.3V输出端

有了这个通道,即可将控制采集的电压、电流数值通过串口传输到PC,在串口监视器上看到。

实现方式:在上一步程序上增加两个电机电压、电流的读取,使用print函数通过串口输出到PC上。

增加4个模拟输入端口,从variant.h 中选择:

PA0 —— 左侧电压 VB

PA1 —— 左侧电流 MI

PA2 —— 右侧电压 VB

PA3 —— 右侧电流 MI

使用 Arduino 提供的函数:

analogRead(pin)

读取相应端子的输入电压,参数pin为采集端子,在variant.h 中重新定义到对应的STM32引脚上,故可以直接使用STM32的引脚名称,增加了程序的可读性。

按目前小车上的电路参数,电压测量输出当量为:0.5V/V,电流测量输出当量为:2.42mV/mA。STM32Duino的模拟读取分辨率是 1024,满量程 3.3V。据此计算程序中的测量当量应该是:

电压(单位0.1V): (((n/1024) * 3.3)/0.5)* 10  = n * 0.0644, 简化为: n/15

电流(单位1mA): (((n/1024)*3.3*1000)/ 2.42)  = n*1.3317

因测量电机工作电压、电流均是为了保护性功能,所以无需过于追求精确,且由于PWM驱动方式,电机的间断供电的,导致电流、电压均会有较大波动,精确测量也无意义。故为了减少计算量,将上述电压换算简化为整数除法运算,而非浮点运算。

按上述思路编写完程序后,顺利的得到的测量结果。(蓝牙模块的使用及准备自己查阅相关资料完成,此处就不详细说明了,只是将其作为一个无线串口通道而已)

程序详见附件。

采集电机工作电压、电流

上述三个程序只是作为硬件功能演示,具体如何应用留给学生在后续的实验中琢磨,权且把这些程序作为这个掌上单片机实验室的硬件如何使用的示例。

至此,作为实验室硬件基础的小车底盘和控制器,以及编程环境的Arduino IDE在STM32上的应用,均以“激活”,可以在此基础上展开相应的单片机学习实验了。

四、结语

通过上述激活过程,可以看出:

小车底盘可以通过 Arduino程序方便的操控,具备了良好的实验基础,可以有很多有趣的内容作为实验素材。

Arduino IDE 完美的支持了 STM32,并且由于 ST公司提供的 STM32Duino 库,使得学生既享受到了 Arduino的易用性,又得到了 STM32强大的性能支持。早期 Arduino 不被看好,有很大因素是所选择的 8位 AVR 单片机性能太弱,具体应用时局限性太大。由于STM32的加持,Arduino 完全可以胜任绝大多数应用角色。

在小车底盘基础上,可以方便的增加功能模块,实现想要的功能,如激活模拟量采集功能时,需要实现无线通讯,用现成的蓝牙透传模块,用杜邦线即可方便的使用,目前市场上各类功能模块很多,实验设计时如需要可随时添加,大大增加了实验设计的灵活性。

下面就根据此平台的特性,尝试构思几个实验内容。我不是专职老师,构思肯定不完善,只能算是抛砖引玉吧。

——————————————

文中程序下载:

链接:https://pan.baidu.com/s/1GGxIrLkBRd4Pv8MqGjd1KQ
提取码:uvzk
复制这段内容后打开百度网盘手机App,操作更方便哦

掌上单片机实验室 — 激活(4)相关推荐

  1. 掌上单片机实验室 - 实现运动功能(10)

    一.背景 前面已完成了硬件激活.编程环境选择.软件框架构建,并且基于软件框架尝试了基于 RTOS 编程,为在此软硬件环境下学习单片机编程做了充分的准备. 从本篇开始,开始以其为载体,一步步完善其功能. ...

  2. 掌上单片机实验室 – 检验自整定适应性(12A)

    一.背景 前面经过努力,将Arduino 的共享资源 PID AutoTune 自整定库用起来了,并进行了验证性测试,效果不错. 但那个验证是在我琢磨自整定库的平台上(掌上实验室小车)进行的,做完后回 ...

  3. 掌上单片机实验室 – 构想(1)

    一.背景 突如其来的疫情,打乱了大学生的正常学习氛围,传统的校园学习模式无法实施,虽说网上教学做了相应的弥补,但对于多数工科课程,只靠线上教学很难完成,单片机课程就是其中之一. 单片机这类工科课程有较 ...

  4. 掌上单片机实验室 — 编程环境(3)

    一.背景 因为单片机学习是软硬结合的,离开软件,单片机无法工作.所以需要准备合适的编程环境. 二.需求 作为学习用的编程环境,我觉得应该满足: 上手容易:不需要花很多时间学习后才能正确使用. 环境参数 ...

  5. 掌上单片机实验室 – 实现PID自整定(11)

    一.背景 上一篇实现了小车运动控制,在程序框架下,基于FreeRTOS编写了驱动任务,包含电机控制.测速.PID调速.行走距离控制等和运动相关的功能.但 PID 调速只是完成了算法,并未真正实现调速, ...

  6. 掌上单片机实验室 - 编程环境(续)(6)

    最近在帮朋友做个项目时,再次使用 STM32Duino,发现ST公司对STM32Duino做了较大的改进,前文我所抱怨的没有详细技术文档之事如今也增加了,为此,赶紧续文一篇,将此好消息与大家分享. 第 ...

  7. 掌上实验室V8系列教程(八)ADC模数转换

    目录 1 项目功能 2 ADC工作原理 3 电路原理图 4 AT32 ADC应用 4.1 ADC基础操作流程 4.2 ADC触发 4.3 ADC采样和转换时间 4.4 读取ADC转换结果 5 示例程序 ...

  8. 掌上实验室V8系列教程(七)I2C应用 HP203B

    目录 1 项目功能 2 电路原理图 3 传感器HP203B 3.1 HP203B功能 3.2 HP203B技术指标 3.3 HP203B I2C总线接口命令 4 示例代码 1 项目功能 通过HB203 ...

  9. 掌上实验室V8系列教程(九)光电编码器转速测量

    1 项目功能 通过光电编码器进行转速测量 2 光电编码器工作原理 光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器.这是应用最多的传感器,光电编码器是由光源.光码盘和 ...

  10. stm32单片机屏幕一直闪_用STM32做一个微型掌上示波器项目——终于鼓起在大牛前献丑的无比勇气...

    这是我第一次在这个论坛上发表东西,其实本人进入芯片的世界的时间并不长,从接触51单片机到现在还不到一年,所以可以算是小白啦~想了很久,总算拿出在论坛大牛前献丑的无比勇气,写起该帖:dizzy::diz ...

最新文章

  1. R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战
  2. SM37 job状态意义
  3. H5页面在iOS网页数字颜色自动被改变成蓝色
  4. python大数据运维库_大数据集群运维(10)Pycharm下安装模块
  5. C语言的关键字和详细介绍
  6. python 找质数的个数_用Python打造一款文件搜索工具,所有功能自己定义!
  7. mysql 创建数据库文件_mysql学习之通过文件创建数据库以及添加数据
  8. Cesium中级教程6 - 3D Models 三维模型
  9. java JDK8 学习笔记——第13章 时间与日期
  10. C# tif文件转jpg
  11. codeblocks快速注释多行
  12. 微信小程序生成海报分享:canvas绘制文字溢出如何换行
  13. mysql可以授予的权限包括多选题_mysql中的权限有( )。 (5.0分)_学小易找答案
  14. tomcat乱码问题解决
  15. ES mapping 详解
  16. Android高级工程师面试实战,赶快收藏备战金九银十!
  17. 2108 JAVASE每日复习总结 链接汇总
  18. js正则表达式 part1 - Kaiqisan
  19. 1.windows 应用程序开发(MessageBox 和 DialogBox 和 WM_COMMAND)
  20. QCustomPlot使用心得五:坐标轴常用属性设置

热门文章

  1. 类和结构体的内存空间占有问题
  2. 小型机 PC服务器 性能,pc服务器小型机
  3. 为什么uninapp制作微信小程序中uni.getUserInfo获取的微信名称是“微信用户“?
  4. Linux下启动Tomcat项目
  5. Fabric CA的基础知识
  6. 阿里云机器的JVM内存调优经历(菜鸟必看,大神请绕道)
  7. 计算语言学之句法理论(1)
  8. Yolov5的配置+训练(超级详细!!!)
  9. 该去大公司做螺丝钉,还是去小公司发光发热?
  10. 飞地阿拉斯加的传奇故事