1、 燕山大学 课程设计说明书 课程名称 嵌入式单片机原理及应用 题 目 基于电磁导线路径检测的 智能循迹小车设计 _ 学院(系) 电气工程学院 _ 年级专业 14 级检测 2 班 _ 学生姓名 张鹏程 黄力 张艺龄 _ 指导教师 温江涛 _ 教师职称 副教授 _ 燕山大学嵌入式单片机原理及应用课程设计任务书 院(系):电气工程学院 基层教学单位:仪器科学与工程系 学 号 140103020146 学生姓名 张鹏程 专业(班级) 检测 14-2 140103020208 黄力 检测 14-2 140103020151 张艺龄 检测 14-2 设计题目 基于 电磁导线路径检测 的智能循迹小车设计 设
2、 计 技 术 参 数 设计一 款 循迹小车, 实现 如下设计参数 : 1. 准确性要求:能 实现小车从规定区域出发, 沿 规定赛道行进,并停止在终点区域。 2. 在满足准确性要求的基础上, 用 时尽可能短。 设 计 要 求 1 使用统一发放的小车底盘( 含 标准轮胎、 电机 、减速齿轮组、 电机 驱动模块),要求四轮驱动。 2 要求使用自制的电感传感器( 数量 不限) ,若 使用购置的电磁 传感器, 则 本课设总成绩按 80%计分 。自制传感器的认定标准为“基板是万用板”。 3 设计报告中要求综合比较两种以上的方案( 可以 是其他原理循迹方案,或电感原理的其他设计方案), 评价 各方案优缺点。
3、 4 设计报告中要求 给出 所使用电感传感器的关键参数。 5 设计报告中要求必须包含整体结构图、程序流程图、引脚连接图。 6 设计报告中要求包含关键芯片、 模块 的 Datasheet 关键页 ,并在打印版上用彩色笔圈出设计参考的关键内容( 如 某运放的供电电压等)。 7 要求提交工作日志, 要求 同传感器课程设计。 工 作 计 划 第 18 周周日下发设计要求; 第 19 周周一开始课程设计, 至 第 20 周周六结束; 第 20 周周五进行设计验收答辩。 参 考 资 料 嵌入式单片机 STM32 设计及应用技术 张淑清 国防工业出版社 STM32 数据手册 STM32 固件库函数手册 C
4、语言编程相关书籍 指导教师签字 基层教学单位主任签字 说明:此表一式四份,学生、指导教师、基层教学单位、系部各 一份。 2017年 1月 13 日 单片机课程设计报告 I 摘要 为了实现智能小车的自动循迹,本文设计了一种基于电磁传感器的智能车控制系统,系统采用 32位 STM32F103ZET6 为核心控制器,设计了电源模块电路、单片机控制电路、电动机驱动模块电路及信号采集电路等相关电路。系统利用两个电磁传感器采集赛道信息,单片机采用控制算法调节智能循迹小车的行驶路径,实现了智能车自动循迹行驶功能。实验证明,该智能循迹小车能够准确快速地对道路轨道进行辨识和跟踪,具有适应性强,实时性好,速度快的
5、优点。 关键词: 单片机;自动循迹;电磁传感器; 单片机课程设计报告 II Abstract In order to realize the automatic tracking of intelligent vehicle, this paper designs a kind of intelligent vehicle control system based on electromagnetic sensor.The system uses 32 bit STM32F103ZET6 as the core controller, and designs the circuit of po
6、wer supply module, MCU control module circuit, motor drive module circuit and signal acquisition circuit.We use two electromagnetic sensors to collect and track information, MCU control the intelligent tracking cars driving path by using control algorithm.System realize the automatic tracking functi
7、on of smart car driving.Experiments show that the intelligent tracking car can quickly and accurately identify and track the road track, has strong adaptability, good real-time, fast speed. Key word: MCU;Automatic tracking;Electromagnetic sensor; 单片机课程设计报告 I 目 录 摘要 第 1章 设计总体规划 .1 1.1 设计要求分解 . 1 1.2
8、设计规划及团队分工 . .1 第 2章 系统的主要硬件电路的设计及介绍 2 2.1 系统的总体设计方案 .2 2.1.1 系统的总体构架 .2 2.1.2 STM32 的简介 .2 2.2 系统模块电路介绍 3 2.2.1 电源模块 .3 2.2.2 单片机控制电路模块 5 2.2.3 电磁传感器 模块 .6 2.2.4 电动机驱动模块 .7 2.2.5 OLED 显示模块 .7 2.2.6 干簧管模块 .8 第 3章 软件设计 .9 3.1 主程序软件设计 .9 3.2 子程序软件设计 .9 3.2.1 ADC 采集 与传输 模块 10 3.2.2 小车 循迹控制模块 10 3.2.3 定时
9、器中断 12 3.2.4 PWM 输出 12 总结与致谢 .13 参考文献 .14 附录 1 C 语言程序 . .15 附录 2 实物图 . .34 评审意见 单片机课程设计报告 - 1 - 第 1 章 设计总体规划 1.1 设计要求分解 根据设计要求,我们将整体方案制定为如下步骤: 1.将给定的各模块组装在车上,测试各模块能否正常工作,确保后续工作顺利进行。 2.设计电感传感器距离车体的距离、距离地面的高度等有关安装位置的参数。 3.确定各部分工作电压,合理设计电源模块,保证各个模块能被良好供电。 4.编写程序,测试电机不同占空比情况下电机的驱动能力。 5.调试程序,改变车速,使得车体能够平
10、稳运行。 6.编写程序,使得小车在偏离轨道时能够根据 AD 采集的电压值自动调整路径。 7.调整参数,记录变化,进而找出最佳配置。 8.根据数据完善小车硬件设计、优化算法和程序设计。 1.2 设计规划及团队分工 人员 分 工 贡献比例 张鹏程 制定整体方案,编写程序,程序调试,焊接电路板 36% 黄力 编写程序,硬件调试,撰写报告,制作 PPT 32% 张艺龄 硬件调试,撰写报告,制作 PPT 32% 单片机课程设计报告 - 2 - 第 2 章 系统的主要硬件电路的设计及介绍 2.1 系统的总体设计方案 2.1.1 系统的总体框架 系统主要由电源模块、电磁传感器模块、 L298N 电机驱动模块
11、、 OLED 显示模块和单片机控制模块五大部分组成。 可充电锂电池的 12V电压 经过降压、 稳压 后 可调节成稳定的 5V 直流电压,然后供给 STM32F103ZET6 单片机控制板和电磁传感器 ,而 L298N 电机驱动模块采用锂电池直接供电。 单片机将传感器采集到的电压值转换成数字 AD 值使其实时显示在 OLED 显示屏上,同时通过简单的算法处理后去控制电机驱动模块, 进而 控制小车的运行状态。 图 2-1 系统的总体结构框图 2.1.2 STM32F103ZET6 的简介 STM32F103ZET6 是基于 ARM 内核的 512 字节闪存的微控制器,其内部资源丰富,包括一个 32
12、 位内部处理器单元, 512kBFlash, 3 个 12 位 ADC, 4 个 12 位通用定时器和 2个 PWM定时器,如图 2-2所示为 STM32F103ZET6 的部分性能指标。 单片机课程设计报告 - 3 - 图 2-2 STM32F103ZET6 部分性能指标 2.2 系统模块电路 介绍 2.2.1 电源模块 电源模块的功能就是对电池电压进行电压调节,为各个模块正常工作提供可靠的工作电压。智能车电路系统由许多模块组成,各个模块所需电压也都不相同。 12V 可充电锂电池图片及其参数如图 2-3所示。 STM32F103ZET6 单片机开发板需要 5v电压、电机驱动模块采用 12v供
13、电、电磁传感器采用 5v供电。而本系统全部硬件电路的电源由 3000mA的 12v可充电锂电池提供,因此需要将电池电压转按照需求进行转换。为了满足各模块的供电需求,我们使用降压模块 LM2596s 将 12v 电压降低到 8v,再利用稳压模块AMS1117-5.0将输出电压进一步稳定到 5v,给单片机开发板和电磁传感器供电。由于单片机控制电路可以将 5v 电压降压到 3.3v,所以外部只需 5v电压即可。图 2-4和图 2-5分别为 LM2596S 和 AMS1117-5.0 输出电压的相关参数。 L298N 驱动模块直接采用电池的12V电压供电。 电源模块 实物图如图 2-5所示。 单片机课
14、程设计报告 - 4 - 图 3-3 12V锂电池参数图 图 2-4 LM2596S 相关参数 图 2-5 AMS1117-5.0 相关参数 单片机课程设计报告 - 5 - 图 2-6 电源模块电路 2.2.2 单片机控制 模块 考虑到处理器芯片需要对传感器阵列所采集的大量数据进行存储和处理,因此选用主控芯片为 STM32F103ZET6 的单片机 控制板。 如图 2-7所示为开发板结构 示意图。 将单片机的 PD.10、 PD.11、 PD.14、 PD.15 作为电机转动方向控制端口, PB.7、 PB.9 作为使能端输出 PWM, PD.3、 PD.4、 PD.5、 PD.6、 PD.7、
15、 +3.3V、 GND连接 OLED 显示屏, PA.0,PA.1作为传感器的输入端口, PA.2、 PA.3为干簧管控制端。 具体连接情况如表 1所示。 图 2-7 STM32F103ZET6 开发板结构示意图 单片机课程设计报告 - 6 - 表 1 各模块和单片机接口连接 模块名称 模块引脚 单片机引脚 接入电源引脚 传感器(右 ) OUT PA0 GND GND VCC +5V 传感器(左) OUT PA1 GND GND VCC +5V L298N IN1 PD11 IN2 PD10 IN3 PD15 IN4 PD14 ENA PB9 ENB PB7 VCC +12V GND GND
16、OLED GND GND VCC +3.3V D0 PD6 D1 PD7 RES PD4 DC PD5 CS PD3 干簧管 1 1 PA2 2 GND 干簧管 2 1 PA3 2 GND 2.2.3 电磁传感器 模块 电磁传感器 模块是系统信息输入的重要来源,主要负责将小车前面的赛道信息输出给主控芯片进行处理,本系统采用传感器课程设计的两个电感传感器采集赛道信息。如图 2-8所示为电磁传感器 电路,电感传感器检测赛道信息的原理是通过电感和电容组成的 LC谐振电路检测赛道的信号,然后将检测到的信号通过运算放大器 LM386进行放大,最后再通过检波电路使得输出的信号为直流,以便 AD 对信号进行
17、采集。在小车中轴线前方对称安装两个电感传感器,使其呈一字形均匀对称分布。在理想情况下,通电导线正好穿过小车的中心轴,则车身两端电磁传感器产生大小相等、方向相同的感应电动势,单片机课程设计报告 - 7 - 其差值为零。如果小车在形式过程中偏移了方向,两边的电磁传感器会产生电动势差值,通过 AD 转换器将电动势差值转换成数字信号由单片机进行处理,从而调整小 车的行驶方向。 图 2-8 信号采集电路 2.2.4 电动机驱动模块 小车采用 L298N 驱动模块控制电机运行状态 。 L298N 是一个具有高电压大电流的全桥驱动芯片,它响应频率高,一片 L298N可以分别控制四个直流电机,而且还带有控制使
18、能端。用该芯片作为电机驱动,驱动能力大,操作方便,稳定性好,性能优良。利用电机专用驱动芯片 L298N 进行电机驱动控制,它的使能端可以外接高低电平,也可利用单片机进行软件控制,极大的满足了各种复杂电路需要。另外, L298N的驱动功率较大,能够根据输入电压的大小输出不同的电压和功率,解决了负载能力不够的问题。 表 2为控制方式与电机状态对照表, 图 2-9所示为电动机驱动模块实物图。 表 2 控制方式与 电机状态对照表 ENA IN1 IN2 直流电机状态 0 停止 1 0 0 制动 1 0 1 正转 1 1 0 反转 1 1 1 制动 若要对直流电机进行 PWM 调速 ,需设置好 IN1I
19、N4, 确定好 电机的转动方向, 然后对使能端输出 PWM脉冲, 既可以 实现调速。 2.2.5 OLED 显示模块 考虑到车体体积, LCD 显示屏过大 、功耗也比较大会 给车造成负担, 所以本系统采单片机课程设计报告 - 8 - 用显示屏较小的 OLED来实时显示感应电动势的值。 如图 2-10所示,使用软件控制分别显示出左右两边感应电动势的值。 OLED 为自发光材料,不需用到背光板,同时视角广、画质均匀、反应速度快、用简单 驱动电路 即可达到发光 ,而且其驱动电压低、能耗低,可与集成电路等相匹配 ,更重要的优点是占用 IO口仅仅为 7个, 很节省 IO口 。 图 2-9 L298N电机
20、驱动模块 图 2-10 OLED 显示屏模块 2.2.6 干簧管模块 智能小车不能单纯的只会循迹, 也要有 自动停车功能 , 所以 停车信号尤为重要。停车方案有两种: 一 、红外遥控器控制。 二 、 干簧管 与永磁体组合。 考虑到 红外遥控灵敏度以及遥控器的通用性对控制精度有很大的影响,所以我们决定采用干簧管与永磁体的组合来做停车信号检测。 干簧管 和永磁体图片分别如图 2-11、 2-12 所示。 将两只干簧管横向放在车下且在同一直线上, 相 距 10mm。 离 赛道的高度为 12mm,这个也是 永磁体吸引力满足要求的最佳的距离。 将永磁 体 粘贴在起跑线上,两块磁铁均距离中心线 3cm,小
21、车经过时磁铁刚好在干簧管的下方。 图 2-11 干簧管实物图 图 2-12 永磁体实物图 单片机课程设计报告 - 9 - 第 3 章 系统的 软件设计 3.1 主程序软件设计 主程序主要用于定义全局 变量,给全局变量赋初值,启动定时器,为整个程序提供数据 , 处理数据 , 控制小车运行状态 , 调用显示等功能。 主程序具体的运行流程如图 3-1所示。 开始 运行后,首先进行各部分初始化(系统初始化、 延时 初始化、 定时器 初始化、 定时器 PWM初始化、 DMA初始化、 ADC初始化、OLED初始化、 OLED清屏、 GPIO初始化等 ) , 其次 开启 DMA、 软件 启动 ADC进行信号
22、采集,最后进入 while死循环进行小车状态控制并等待定时器中断显示采集到的两路 AD值及其差值。 系统程序清单见附录 1。 开始系统初始化S ys t e m I n i t ()延时初始化d e l a y _ I n i t ()定时器初始化T i m e r x _ I n i t ()P W M 初始化T I M 4 _ P W M _ I n i t ()A D C 初始化A d c _ I n i t ()各模块初始化O L E D 初始化O L E D _ I n i t ()开启 D M AD M A _ C m d ()软件开启 AD 转换A D C _ S o f t w
23、 a r e S t a r tC o n vC m d ()O L E D 显示信息G P I O 初始化S T E P _ I n i t ()进入死循环对读取到的两个传感器 AD 值求差设定电机初始状态AD _ V a l u e 1 8 0 0AD _ V a l u e 0 8 0 0AD _ V a l u e 1 = 2执行停车程序进入死循环停车结束进入中断检测定时中断请求T I M _ G e t l T S t a t u s ()中断处理内容O L E D 显示两路 AD值及其差值清除定时中断标志T I M _ C l e a r T P e n d i n g B i t
24、中断返回YES YES YESNONONOYES YESNOYESNONOYESNO主函数初始化具体步骤定时器中断图 3-1 系统程序流程图 3.2 子程序软件设计 单片机课程设计报告 - 10 - 主函数里包含了 ADC 采集与传输、小车循迹控制、定时器中断以及 PWM输出 四 大部分。 每部分环环相扣, 保证了小车的平稳运行。 下面将对每一部分进行详细介绍。 3.2.1 ADC 采集 与传输 模块 因为电磁传感器有两个,需要两个 ADC通道来读取传感器产生的电压值。所以我们配置 ADC1, 开启 PA0和 PA1两个通道 , 模式 设置为多信道扫描、连续转换模式,软件触发,数据右对齐。 又
25、考虑到 小车运行对数据采集速率与程序运行时间要求特别高, 所以为了 节省 CPU 占用时间、 保障 AD 采集与传输速率 , 采用 了 DMA 进行外设与内存之间的数据传输 。 具体程序见附录 1。 3.2.2 小车 循迹控制模块 电磁传感器小车循迹算法有多种 ,按照简易程度可分为差值法、 比 值法、 归 一法和PID算法。 一、 PID是比例 (P)、积分 (I)、微分 (D)控制算法。但并不是必须同时具备这三种算法,也可以是 PD,PI,甚至只有 P算法控制。我以前对于闭环控制的一个最朴素的想法就只有 P控制,将当前结果反馈回来,再与目标相减,为正的话,就减速,为负的话就加速。现在知道这只
26、是最简单的闭环控制算法 。全国恩智浦智能赛车大赛电磁组绝大多数的小车都是采用了 PID 算法。 但是 此算法对小车的硬件要求是十分高的,传感器的稳定程度与采集精度、 单片机 的运行速率、 速度的反馈精度、 方向的 调节灵敏度等等。由于本课题的车模是最普通的四轮驱动小车,达不到如此高的精度。所以我们不采用此种算法。 二、 差值法的做法是将测到的左右两个电磁传感器的感应电动势做差, 将其 差值 E来反应小车与赛道中心线的偏差量(以下简称偏差 ) , 即 : E = 1 2 = 2 +( 2)2 2 +( +2)2 差值法计算得到的偏差量只在一定范围内是可信的 , 一旦小车偏离中心线的距离超出这个范
27、围 , 其偏差量便不可取 , 这也是差值法的最大弊端 。 三、 归一化对差值法进行了改进, 用 左右两个电磁传感器的感应电动势差值除以他们的和值, 将所 得的值 Error来反应偏差量, 即 : Error = 1 21 +2= 2 + ( 2)2 2 + ( + 2)22 + ( 2)2 +2 + ( + 2)2 和差值法相比, 归一化 所得的值 Error可信的取值范围有一定的增加,但在极值点之外|Error|仍然会随着 |x|的增大而减小, 该算法 无法完整地描述整个小车远离中心线的过单片机课程设计报告 - 11 - 程。 四、 比值法 的做法是: 将左右两边电感的感应电动势 1和 2分
28、别进行开根号计算, 得到 1和 2。 将 1和 2做差后, 比上 左右感应电动势值 1和 2的和, 将所得 的值 Bias作为最后的偏差值, 即 : Bias = 1 21 + 2对一个函数 进行开根号运算后, 会 使它的变化趋势趋于平缓, 因此 , 与 原先归一化法相比, 比值法 降低了分子的衰减速度,而分母的衰减速度不变, 这样 所得的偏差值 Bias随距离 x的变化就更加贴近小车的实际偏差。 比值法 是一种很不错的方法。 图 3-2是比值法、 归一化法 和差值法转弯效果图: 图 3- 2 三种算法转弯效果图 五、 针对本课题, 我 们采用了一种更简单且更有效的控制方法 比较法 。 比较法
29、的前提需对赛道信息进行多次、 多点 、 多区域 采集, 然后 确定好转弯和直行时的触发条件。如图 3-3 所示, 小车 刚进入弯道的时候 ,左边 传感器读取到 AD 的值为 800,右边传感器读取到 AD 值为 400,且此时是转弯最佳时机。 于是 设置判定条件: 当左面 AD 大于800右面 AD小于 400时开始左转弯。 只要 调整好左右轮的速度差值便可以完美的转过弯道。 由于小车前方的两个电磁传感器精度和对称性足够好,所以右转弯触发条件是对称的。 针对停车信号判定, 我们 放弃了使用红外遥控控制的方式, 而是 采用干簧管与永磁体的结合。事先在赛道起跑线上放好两块永磁体,由于小车起跑、 到
30、达终点 需要两次经过起跑线,所以定义一个变量, 用来 存放经过起跑线的 次数。 当 满足变量值大于等于 2的时候, 小车 便紧急制动。 单片机课程设计报告 - 12 - 为防止小车出现意外冲出赛道后撞坏传感器, 我们 又加入了意外停车判定程序: 当两个传感器读取到的 AD 值同时小于 20的时候就认为小车冲出赛道,执行制动程序 。 当再次将测到信号同时大于 20的时候便会重新启动。 图 3- 2 小车转弯示意图 3.2.3 定时器中断 为了节省 主函数里程序的运行时间, 我们将 OLED的显示程序写在了 TIM3定时器中断当中, 每 50ms触发一次。 显示 内容为左右两个传感器的 AD值及其
31、差值, 具体 显示如图 3-3所示: 图 3- 3 OLED显示效果图 3.2.4 PWM 输出 差速转弯的唯一办法就是通过输出不同的 PWM 波对电机的转速进行控制 。而STM32F103 系列单片机可输出 PWM 波的定时器为 4 个通用定时器和 2个高级定时器,考虑到引脚被占用的问题, 我们 采用了 TIM4的两个 PWM输出 通道 CH2 和 CH4, 即 对应的 PB7和 PB9。设置为向上计数模式、 TIM脉冲宽度调制模式 2、计数周期为 80K。 注:系统程序清单见附录 1。 单片机课程设计报告 - 13 - 总结与致谢 智能循迹小车的设计需要涉及到许多方面,在小车的设计中,传感
32、器的设计和单片机的处理至关重要。本文主要设计了一种以 STM32F103ZET6 单片机为控制核心、电磁传感器为基础的智能小车循迹系统。在小车中,单片机根据传感器的输出信号来控制小车的行驶路径,减小了车的抖动,实现了小车能够平稳地循着轨道正常行驶和准确停车的功能。实验结果表明,此种设计方法下的小车具有很强的运行能力,能够很好的控制小车的运行过程。 通过此次做智能小车收获颇丰,首先感谢老师提供我们一个这样的机会让我们成长,借着这次课程设计,我们学会了如何在团队中和小组成员进行高效的沟通,同时也丰富了我们项目实践经验,为以后加入其他的项目奠定了基础。虽然在项目中出现了很多意外,但是小组成员通力合作
33、最终解决了一个又一个的问题。十分感谢其他组的成员在我们遇到问题时提供的宝贵建议,帮助我们渡过难关! 单片机课程设计报告 - 14 - 参考文献 1杨雪,高成恩,高攀,等 .基于电磁场检测的循迹智能车系统设计 J.单片机与嵌入式系统应用, 2011(12): 61-64 2胡长晖,叶梦君,汪曼,等 .基于电磁技术的智能车路径识别的研究 J.湖北师范学院学报:自然科学版, 2011(2): 54-58. 3李仕伯,马旭,卓晴 .基于磁场检测的循迹小车传感器布局研究 J.电子产品世界,2009(12): 41-44. 4侯代坡,孔琳琳,王烁,等 .电磁导航式智能车控制系统研究 J.机械与电子, 20
34、13(2):78-80 5周淑娟 .基于单片机智能小车的设计方案 J.工业技术与职业教育, 2011, 9(12): 15-18. 6李维军,韩小刚,李晋 .基于单片机用软件实现直流电 机 PWM 调速系统 J.机电一体化, 2004, 10(5): 49-51. 7王元哲,扈宏杰 .磁导航智能车系统的设计与实现 J.自动化仪表, 2011, 32(11): 5-8 8刘远明,李道霖,韩绪鹏,等 .感应式循迹小车的设计与实现 J,电子设计工程, 2011(10). 9张岩,裴晓敏,付韶彬,等 .基于单片机的智能循迹小车设计 J.国外电子测量技术,2014(3). 10张晓峰, 钟 一搏,李清晨
35、, 陈国定 .电磁智能车循迹算法 J.计算机系统应用,2014.23(12): 187-190 单片机课程设计报告 - 15 - 附录 1 主程序 C 语言程序清单 / / 本程序只供学习使用,未经作者许可,不得用于其它任何用途 / 七星虫德飞莱 STM32 开发板 / 主程序 代码 / 检测 14-2 五组 / 修改日期 :2017/1/8 / 版本: V3.0 / #include “delay.h“ #include “sys.h“ #include “usart1.h“ #include “adc.h“ #include “dma.h“ #include “oled.h“ #inclu
36、de “timer.h“ #include “pwm.h“ #include “step.h“ #include “math.h“ 单片机课程设计报告 - 16 - #include “run.h“ #define ADC1_DR_Address (uint32_t)0x4001244C) u16 AD_Value6; /存放读取 6路 AD值 int differ; /存放两路 AD 差值 右 -左 /*注:车的左右以 OLED 屏幕为标准,正对屏幕判断方向 */ int main() SystemInit(); delay_Init(); usart1_Init(9600); Timerx
37、_Init(499,7199); TIM4_PWM_Init(899,0); DMA_Config(DMA1_Channel1,(u32)ADC1_DR_Address,(u32) /cndtr对应所开信道个数 Adc_Init(); OLED_Init(); OLED_Clear(); STEP_Init(); DMA_Cmd(DMA1_Channel1, ENABLE); /开启DMA ADC_SoftwareStartConvCmd(ADC1, ENABLE); /软件启动 AD转单片机课程设计报告 - 17 - 换 OLED_ShowString(0,0,“AD_DIF: “); OL
38、ED_ShowString(0,2,“LEFT_ADC : “); OLED_ShowString(0,4,“RIGHT_ADC: “); while(1) differ = AD_Value1 - AD_Value0; /右 - 左 IN1_1 = 1; IN2_1 = 0; IN3_1 = 0; IN4_1 = 1; TIM_SetCompare2(TIM4,335); TIM_SetCompare4(TIM4,335); RUN_Left(AD_Value0,AD_Value1); /左转函数 RUN_Right(AD_Value0,AD_Value1); /右转函数 RUN_Line(
39、AD_Value0,AD_Value1); /直行函数 STOP(AD_Value0,AD_Value1); /停车函数 定时器中断 C 语言程序清单 / 单片机课程设计报告 - 18 - / 本程序只供学习使用,未经作者许可,不得用于其它任何用途 / 七星虫德飞莱 STM32 开发板 / 定时器中断代码 / 检测 14-2 五组 / 修改日期 :2017/1/8 / 版本: V3.0 / #include “timer.h“ #include “oled.h“ #include “math.h“ /通用定时器中断初始化 /arr:自动重装值。 /psc:时钟预分频数 /这里使用的是定时器 3
40、! void Timerx_Init(u16 arr,u16 psc) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; 单片机课程设计报告 - 19 - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = arr; /设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到 5000为500ms TIM_TimeBaseStructure.TIM_
41、Prescaler =psc; /设置用来作为 TIMx 时钟频率除 数的预分频值 10Khz 的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = 0; /设置时钟分割 :TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /TIM 向上计数模式 TIM_TimeBaseInit(TIM3, /根据 TIM_TimeBaseInitStruct 中指定的参数初始化 TIMx的时间 基数单位 /* TIM_IT enable */ TIM_ITConfig
42、 ( /使能或者失能指定的 TIM中断 TIM3, /TIM3 TIM_IT_Update | /TIM 中断源 TIM_IT_Trigger, /TIM 触发中断源 单片机课程设计报告 - 20 - ENABLE /使能 ); /* Enable the TIM3 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; /TIM3 中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /先占优先级 0 级 NVIC_InitStructure.N
43、VIC_IRQChannelSubPriority = 3; /从优先级 3 级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /IRQ 通道被使能 NVIC_Init( /根据NVIC_InitStruct 中指定的参数初始化外设 NVIC 寄存器 TIM_Cmd(TIM3, ENABLE); /使能 TIMx 外设 void TIM3_IRQHandler(void) /TIM3 中断 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) /检查指定的 TIM 中断发生与否 :TIM 中断源
44、单片机课程设计报告 - 21 - OLED_ShowNum(80,2,AD_Value0,4,16); OLED_ShowNum(80,4,AD_Value1,4,16); if(differ ADC1 /cndtr对应所开的信道数目 void DMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr) DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA_CHx); /将 DMA 的通道 1 寄存器重设为缺省值 DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; /DMA 外设 ADC 基地址 DMA_InitStructure.DMA_MemoryBaseAddr = cmar; /DMA 内存基地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /内存作为数据传输的目的地