湖南大学RP原创,不得转载不可盗用。
1、使用STM32控制器,了解库函数、学懂查阅数据手册、寄存器配置。
2、在了解UCOS-II的基础上利用API进行编程,至少学会使用任务、事件等操作系统的元素,体会操作系统的优点。
3、了解无刷直流电机,学会控制直流无刷电机的驱动电路和控制电路。
4、学会至少一款屏幕控制,体会点阵显示方式,学会按照数据手册写寄存器及控制IC芯片。
5、学会基本使用Proteus仿真,了解Proteus的元件库和使用方法。
本实验完成了以下功能:
1、移植UCOS-II到STM32F103R6控制器,使用操作系统运行。
2、每100ms:查询事件,若置位在LCD上打印“1”,否则打印“0”。
3、每200ms:PWM控制、CMOS电桥六步换相驱动,实现无刷直流电机转动。ADC测量BLDC_STAR反馈的角速度。
4、每500ms:GPIO通过高低电平控制LCD显示adc结果、电机转速。
5、每100ms:GPIO完成红色LED的一个周期闪烁、检查开关是否被按下,若按下,事件被置位。
6、以上任务按照优先级排列。系统共有4个功能性任务,1个事件。
基于以上功能,得到效果如图1,图1为整个系统在运行中的截图。
在proteus添加芯片后,可以发现软件已自动为芯片添加了VDD信号,能够正确进行上电运行,因此复位电路不做修改。为方便理解电路,将VDD设置为+3.3V。
以下为硬件电路中各引脚口的作用:
引脚名 | 编号 | 作用 |
---|---|---|
PWM1/2/3 | PA8/9/10 | 输出PWM信号控制电桥电路 |
IOA/B/C | PA13/14/15 | 输出高低电平控制电桥的开通和关断 |
SA/SB/SC | PB8/9/10 | 读取霍尔传感器输出,判断六步换向控制的次序 |
ADC | PA1 | 读取电机反馈角速度,形成闭环控制转速 |
LED_RED | PB1 | 红色指示灯,指示程序是否正在正常运行 |
KEY | PB0 | 读取开关状态,引发事件置位 |
LCD控制线 | PC0-13 | LCD控制总线 |
区别于直流有刷电机。我们在高中物理可以学到有刷电机,而无刷电机这没有刷,定子转子位置互换,通过电子技术来实现换向,达到不需要“刷”的功能,而在现实中,通常使用互补PMW来实现换向。
无刷电机的种类大致可以分为有感和无感两类。BLDC-STAR属于有感,即自身带有霍尔传感器(引脚口为sa,sb,sc ,霍尔传感器120° 安装不会输出“000”“111”2 个信号,通过这一点可以判断霍耳传感器的安装方式。),用于检测转子的位置,检测到的信号送到微控制器,进行判断后,用于开启MOSFET开关状态,从而控制电机换相。
由于该电机有三个定子,所以要进行六步换相。本项目使用顺时针转动,因此换相的时序可以用下表来表示:
霍尔传感器 | 通电顺序 | 开通的MOS |
---|---|---|
1 | +C,-B | Q5,Q4 |
2 | +B,-A | Q3,Q2 |
3 | +C,-A | Q5,Q2 |
4 | +A,-C | Q1,Q6 |
5 | +A,-B | Q1,Q4 |
6 | +B,-C | Q3,Q6 |
如果要对电机进行反向转动,只需要改变相电压的方向,即改变功率开关导向顺序。如果要对电机进行调速,则只需要控制功率开关导通的占空比。
在众多LCD中选择了AMPIRE 128X64,原因如下:
1、驱动程序多在51单片机中有开源。方便移植到STM32上。
2、显示方式为像素点显示,很直接。
3、网上该LCD工作介绍文档很多,资料齐全,方便自己发挥。
工程中使用的软件版本如下表:
软件 | 版本 |
---|---|
Proteus版本 | SP8.7 |
STM32库 | 正点原子整合的标准库 |
Keil版本 | uVsion5 |
UCOS版本 | UCOS-II |
打开proteus软件(要注意向下兼容问题,即使用低版本创建的工程可以被高版本软件打开并编辑,但高版本的工程不能被低版本软件打开。考虑到验收的兼容性和可移植性,实验使用了proteus 8.7。)来到启动主界面,选择“Start-New project”,打开创建新工程启动器,如下图。
然后一直选择“Next”,一直到提示是否创建带有固件的工程时,选择微控制器的型号为“STM32F103R6”,如下图。
继续选择“Next”,这样就可以创建带有控制器型号、有原理图、无PCB图(暂不创建,因为是仿真,因此暂时不需要PCB)的工程,点击“Finish”完成工程的创建。
完成创建后,可以看到控制器的右上角“NRST”端已经被连接“VDD”,即控制器能够正常供电并复位启动。下面根据本系统的功能,逐一为原理图添加相应的硬件电路。
2.1.1 在工程的器件库添加:
按左边面板上的“P”,在器件库中搜索“AMPIRE 128X64”。这是一款像素点为128X64的LCD屏幕,具有片选功能,可显示汉字及图形。
2.1.2 在原理图添加:右键点击原理图空白的地方,“Place – Component -AMPIRE128X64”,即可为原理图添加屏幕。
2.1.3 连接LCD电路:根据屏幕的说明文档(参考文献3),可以知道屏幕的引脚有如下作用:
管脚口 | 管脚名称 | 电平 | 说明 |
---|---|---|---|
1 | CS1 | H/L | 片选信号,低电平时选择前64列 |
2 | CS2 | H/L | 片选信号,低电平时选择后64列 |
3 | GND | 0V | 地 |
4 | VCC | 5.0V | 电源 |
5 | V0 | - | LCD驱动电压 |
6 | RS | H/L | 数据/指令选择 |
7 | R/W | H/L | 读/写选择 |
8 | E | H/L | 读写使能 |
9 | DB0 | H/L | 数据 |
10 | DB1 | H/L | 数据 |
11 | DB2 | H/L | 数据 |
12 | DB3 | H/L | 数据 |
13 | DB4 | H/L | 数据 |
14 | DB5 | H/L | 数据 |
15 | DB6 | H/L | 数据 |
16 | DB7 | H/L | 数据 |
17 | RST | L | 复位,低电平有效 |
18 | VOUT | -10V | LCD驱动电源 |
2.1.3.1 根据引脚功能,首先设置LCD的工作状态引脚,用到标号功能。
点击最左边工具栏的 “Terminals Mode” 选择“DEFAULT”,在原理图空白部分左键,则可以出现标号符,将其放置在对应引脚附近。放置后左键双击标号符,可以修改标号名称。两个相同名称的标号表示两点电气相连短接。相同地,使用“POWER”可以设置电源端,“GROUND”可以设置地端等。根据这个方法可以设置好LCD的1,2,3,4,6,7,8,17引脚。
2.1.3.2 然后处理LCD的5,18引脚,他们之前使用一个可调电阻相连。与2.1.1节相似,首先要在项目器件库中添加可调电阻。点击 ,在 中点击“P”按键,搜索“POT-HG”,添加。在原理图空白处右键“Place – Component - POT-HG”,添加可调电阻完成。使用导线进行必要的连接。到这一步后,得到的原理图应该如下图:
2.1.3.3 然后画出LCD的数据总线,左键点击使用 “Buses Mode”,在原理图空白处单击画出蓝色总线的开端,拖拉一段距离后单击确定节点,双击结束绘制总线。如果想要绘制任意斜率的斜线总线,只需要在拖拉时按住键盘的“Ctrl”即可完成切换。按下键盘的“a”,跳出总线名称配置窗口,修改总线中节点名称为“NET=DB#”,其中#代表递增的节点名,按下“ok”,退出配置窗口。
然后点击引脚口,布置线路到总线上,然后将鼠标悬浮到蓝色总线上,会出现手指+绿色减号方框的符号,左键点击,则可以对节点进行命名。
完成一侧总线后,还需对另一侧总线进行配置,由于LCD引脚特性,还需要在引脚出配置上拉电阻。如同2.1.2节,在项目元器件库添加排阻“RESPACK-8”,且对每一个“DB#”上拉到5V。完成后原理图如下所示:
如同2.1.1节,在 工程元器件库 添加 “LED-RED”两个LED灯,添加“CHIPRES0R”电阻阻放置限流电阻,放置后双击电阻,设置电阻阻值为330欧姆。放置电阻后,如果想将其选值角度,可以右击电阻,选中“Rotate Clockwise”顺时针旋转90度,还可以使用左侧工具栏设置不同角度的旋转。
使用 “Terminals Mode - POWER”放置电源,使用导线连接到控制器的引脚口中,完成后如下图。
如同2.1.1节在 工程元器件库 添加“BLDC-STAR”星型无刷直流电机。
由上一节对器件的分析,需要功率开关管子6个,为方便进行速度调节,需要PWM信号3路,分别控制Q1/Q3/Q5,其余管子的开关端连接GPIO口控制开通关断状态。
如同2.1.1节在 工程元器件库 添加“IRF540”NMOS型晶体管,该管子可以经过最高8A电流,适合用于做电机的驱动。按照上节的分析放置好6个功率管子,使用导线与电机连接。
使用标号 “Terminals Mode”,选择“DEFAULT”,进行对电机霍尔传感器输出与控制器的连接,以及控制器的PWM、GPIO对功率管子的连接。使用“POWER”设置功率管子电源端,“GROUND”设置地端。
使用左侧栏文字工具,在空白地方添加模块名称。这样原理图就完成了。完成后原理图如下:
软件代码工程基于正点原子公司的ucos-ii工程。使用此工程架构的原因是正点原子公司产品配套说明文档丰富且具有强教育性,易于对初学者上手,方便别人读懂代码,下面给出一份正点原子公司对ucos-ii的开发文档,本次仿真参考该文档进行。https://max.book118.com/html/2018/0521/167695865.shtm
微控制型号为STM32F103R6,具有充足的PWM、GPIO资源,因此适合本次项目。代码编写使用keil_v5版本,安装好STM32F1的DFP调试拓展包。
该工作已由正点原子代码架构完成,作为使用者,我们需要关注工程文件夹的分布和组织,这些可以使用Keil的导航栏查看。
找到main.c,写入硬件资源初始化、开始任务、创建任务等。
由于原代码工程的任务只驱动了LED,仅使用了GPIO资源,为了适配我们项目中对其他硬件资源的需求,这里需要添加其余标准库文档如ADC/TIM等。加入方法如下:
使用Keil的工具栏,点击 图标,在“Groups”中加入自行新建的两个文档
//START 任务:创建其他任务的入口//开始任务的优先级设置为最低
//LED0任务:每100ms:完成红色LED的一个周期闪烁、检测一次按键且将结果发送到事件标志组
//LCD任务:每500ms:在屏幕上显示adc、电机转速
//MOTOR任务:每200ms:控制电机换向、测量一次ADC
//LCD_KEY任务: 每100ms: 在屏幕上显示(事件)开关是否按下
在仿真过程中遇到了以下的问题,逐一解决后得到效果如下:
软件开发基于正点原子的ucos-ii工程led项目,因此在该工程上有大量中文注释。当我们尝试修改注释时,会发现因为编码问题而出现乱码、“?”等字符。解决方法可以参考以下网址,https://jingyan.baidu.com/article/5225f26bb16709e6fa0908ea.html ,但是最好是选择中文简体,如下图所示。
报错内容:Access to register of unclocked peripheral at 0x40010C00 cause BUS_FAULT [U1_CM3CORE]
观察报错信息,可见错误内容来自于[U1_CM3CORE],即器件微控制器。查网络经验,参考网址https://blog.csdn.net/weixin_42532989/article/details/107585835 可以知道,原因是没有将MCU的晶振频率定义好。查看STM32cubeMX中对时钟树的定义或者STM32F103的用户手册中对内部晶振的描述或者工程软件中
由于使用库函数,而缺少对库函数的官方说明文档,仿真开发时长有限,也没有这么多时间去读数据手册文档,很多语句会忘记添加而导致控制失败。TIM1作为高级的定时器,除了一般的使能以外,还需要特定的输出命令。在定时器开启下补充以下命令,PWM正常输出。
在proteus中,往往容易因为选不到正确的三极管或者MOS管而浪费大量时间。本次实验原本想用BJT进行,但是无奈NPN和PNP都不能正确驱动,控制器在配置成推挽输出时接到NPN的B极,仿真结果电压只有0.6V,不能开启BJT,无法实现功能。所以参考了网络资源,决定使用更方便的MOS器件来开关控制。应该要在BJT选择前,好好查阅手册,配好静态工作点才可以使用。
在写入新的.c和.h文件时,需要使用工程资源管理来在keil中加入该文件。记得在配置设置响应的Path。
解决添加路径问题:
https://jingyan.baidu.com/article/63f236284e14340208ab3d96.html
特别指出,代码中字库的编写是采用了以下软件得到的, 方法比较简单, 打开字模提取器软件,如下图。
结束设置后,下面设置字体和字体大小。因为在显示屏LCD上显示,像素有限,因此这里选用了易于使用像素展示的“方正像素12”字体,如无其他特殊需要也可以选择“宋体”等。字体大小决定了最终输出的数组数,因此字体大小按照字号数选择。
在输入框打出想要的字体:
如“速”。输入结束后输入“Ctrl+Enter”。接下来选择“取模方式”,选择“C51”格式,则可以看到“点阵生成区”自动给出了代码。将代码复制到自己创建的用于存放大量数组数据的“font_lib.c”文件中,在执行代码时调用即可。
新开的任务task函数里面不要忘记加上while(1)死循环,否则任务就只执行一次就不再执行,程序会出错,而且这种错误因为思维定势很难查出来。
有电脑配置运算速度有限,任务开太多导致不能仿真。本项目已经压缩了任务,将ADC和PWM融合起来,而事件也只开了1个。
事件发生:闭合开关,LCD打印开关状态;LED、电压、转速正常同步更新
第一次使用操作系统,觉得最大的优势是各个任务之间的独立性变强了,不再是之前使用标准库那种要苦苦安排时序以及中断的感觉。因为任务内部都是死循环,方便一直运行,所以使用操作系统处理的确很方便。
本次项目花费时间最多的是设计电桥,即无刷直流电机的驱动电路。不知道为什么使用BJT驱动一直失败,虽然有查阅到可以使用一些驱动芯片,但是本着希望系统更加简单的理念就没有使用了。
另外是事件的创建等函数不太会用,其实网上的代码多使用的是UCOS-III,所以参考网上资源有差距,还是需要自己打开
1 LCD移植到STM32时所用的51驱动原程序
https://blog.csdn.net/zjf30366/article/details/84666300
2 AMPIRE 128X64简介
https://wenku.baidu.com/view/114ff9a184868762caaed565.html
3 LCD指令表
https://wenku.baidu.com/view/e9a7f0f9fab069dc502201c9.html
4 取字模方法
https://jingyan.baidu.com/article/363872ec1316026e4ba16ff4.html
5 ucos-ii不常用,常用iii版本
https://www.cnblogs.com/wenhao-Web/p/13834687.html
6 无刷直流电机控制系统的Proteus仿真
https://wenku.baidu.com/view/43eec3491cb91a37f111f18583d049649b660e83.html
7 【BLDC理论篇】直流无刷电机控制方法
https://blog.csdn.net/zhandouhu/article/details/102858886
8 本文章配套工程资源
https://download.csdn.net/download/weixin_42717467/15008147
9 其余可能有用的链接
https://zhuanlan.zhihu.com/p/126478231
https://www.st.com/resource/en/reference_manual/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf
https://max.book118.com/html/2018/0521/167695865.shtm
http://www.openedv.com/thread-85385-1-1.html
https://blog.csdn.net/qq_45433195/article/details/97301867
https://www.cnblogs.com/wenhao-Web/p/13834687.html