直立小车设计报告

合集下载

双轮直立智能车设计

双轮直立智能车设计

双轮直立智能车设计
●系统组成:
1.硬件电路设计:电源、嵌入式微控制器、传感器、电机和控制电路、数据通信的综合系

2.机械结构设计:由双轮直立智能车构成的工作平台、承载硬件电路、
3.平衡控制模块:要求自平衡、数据采集、手动控制装置、
4.软件设计和调试控制
●系统功能:
1.硬件设计:减少不必要的调试麻烦
2.平衡信号监测处理:快速检测倾斜信号,保证平衡和倾斜后的调节能力
3.单片机:分析处理检测到的信号,通过相应的c语言实现
●电路图
驱动电路:
电源模块电路:
陀螺仪电路:
速度传感器电路:
CAN总线原理图:
串口与458接口原理图:
USB转串口原理图:
人机互接口电路:
软件设计:
小车平衡依靠软件设计,软件设计主要包括以下几点:
1.建立软件工程,分配个模块功能并考虑实时调试
2.编写单片机软件程序框架,建立软件编译、下载、调试的环境
3.实施并调试各个子模块的功能的正确性
4.进行车模整体运行性能测试与提高。

直立式双轮自平衡运动小车

直立式双轮自平衡运动小车

长春工业大学电子设计大赛题目:直立式双轮自平衡运动小车(C)编号:日期:摘要车模直立行走比赛是要求仿照两轮自平衡电动车的行进模式,让车模以两个后轮驱动进行直立行走。

近年来,两轮自平衡电动车以其行走灵活、便利、节能等特点得到了很大的发展。

国内外有很多这方面的研究,也有相应的产品。

在电磁组比赛中,利用了原来C型车模双后轮驱动的特点,实现两轮自平衡行走。

相对于传统的四轮行走的车模竞赛模式,车模直立行走在车体检测、控制算法等方面提出了更高的要求。

本设计采用ATMEL公司推出的MEGA16 单片机作为“双轮直立自平衡小车”的微控制器,用以处理任意时刻传感器的数据;通过软件滤波和自动控制理论算法使得小车能够在任意时刻进行自我调整以达到平衡状态。

该系统的传感器采用角度传SCA61T,和陀螺仪采集小车车身的水平状态值和小车的加速度值。

并且采用了LM298双桥大功率集成驱动芯片来驱动电机,无线遥控来控制小车的数据传输。

依靠这些设备和可靠的硬件设计,我们使用了一套PID 闭环控制算法和比较稳定的卡尔曼滤波算法,使得整个硬件结构和软件系统能顺利匹配。

从而使得我们的小车能保持直立自平衡状态。

模糊PID控制具有良好控制效果的关键是要有一个完善的控制规则。

但由于模糊规则是人们对过程或对象模糊信息的归纳,对高阶、非线性、大时滞、时变参数以及随机干扰严重的复杂控制过程,人们的认识往往比较贫乏或难以总结完整的经验,这就使得单纯的模糊控制在某些情况下很粗糙,难以适应不同的运行状态,影响了控制效果。

常规模糊控制的两个主要问题在于:改进稳态控制精度和提高智能水平与适应能力。

在实际应用中,往往是将模糊控制或模糊推理的思想,与其它相对成熟的控制理论或方法结合起来,发挥各自的长处,从而获得理想的控制效果。

关键字:自平衡小车 ATMEGA16单片机直立行走模糊PID一、总体设计方案1.1设计思路:题目要求设计并制作一个单轴两轮自平衡小车。

对于小车能保持平衡,直立行走。

智能直立车设计与控制

智能直立车设计与控制

智能直立车设计与控制发布时间:2021-04-20T04:04:39.891Z 来源:《学习与科普》2021年1期作者:刘辉赵浩张璇钱超卢承领杨旭[导读] 本项目以电磁研究为背景,设计了直立车模电磁循迹系统。

系统设计采用了自顶向下的整体设计思想,以Freescale微控制芯片MCF5225X为核心,并以CodeWarriorIDE为系统的开发平台。

皖西学院电气与光电工程学院安徽省六安市 237012摘要:本项目以电磁研究为背景,设计了直立车模电磁循迹系统。

系统设计采用了自顶向下的整体设计思想,以Freescale微控制芯片MCF5225X为核心,并以CodeWarriorIDE为系统的开发平台。

硬件部分采用自主设计的主板电路、传感器电路以及驱动电路。

传感器电路采用LM358运放实现微弱信号放大,采用速度传感器MMA7260和加速度传感器陀螺仪(ENC-03)实现对车模状态的检测,驱动电路采用集成驱动芯片BTS7960B来实现对电机的有效驱动。

关键词:智能小车;电磁;循迹;主板电路;传感器1.前言智能小车,是一个集环境感知、规划决策,自动行驶等功能于一体的综合系统,它集中地运用了计算机、传感、信息、通信、导航及白动控制等技术,是典型的高新技术综合体。

智能车辆也叫无人车辆,是一个集环境感知、规划决策和多等级辅助驾驶等功能于一体的综合系统。

它具有道路障碍自动识别、自动报警、自动制动、自动保持安全距离、车速和巡航控制等功能。

智能车辆的主要特点是在复杂的道路情况下,能自动地操纵和驾驶车辆绕开障碍物并沿着预定的道路(轨迹)行进。

2.系统结构电磁设计项目组比赛要求车模在直立的状态下以两个轮子着地沿着场地进行比赛,这势必增加了控制难度,算法也相对复杂,我们将控制分为三个基本方面:直立控制,速度控制和方向控制,分别进行算法控制,最终将三方面融合实现目标控制。

为实现上述要求,设计电磁车体系结构如图1。

根据功能不同,电磁车体系结构大致包括传感器、控制、执行机构、人机接口和电源五大部分。

自平衡小车设计报告

自平衡小车设计报告

自平衡小车设计汇报摘要.......................................................................... 错误!未定义书签。

一、系统完毕旳功能............................................... 错误!未定义书签。

二、系统总体设计原理框架图 ............................... 错误!未定义书签。

三.系统硬件各个构成部分简介 ............................. 错误!未定义书签。

四、软件设计 .......................................................... 错误!未定义书签。

五、制作困难 .......................................................... 错误!未定义书签。

六.总结..................................................................... 错误!未定义书签。

摘要:本作品采用STM32单片机作为主控制器,用一种陀螺仪传感器来检测车旳状态,通过TB6612控制小车两个电机,来使小车保持平衡状态,通过蓝牙与小车上蓝牙模块连接以控制小车运行状态。

关键字:智能小车;单片机;陀螺仪;蓝牙模块。

一、系统完毕旳功能根据老师旳指导规定,在规定旳时间内,由团体合作完毕两轮自平衡小车旳制作,使小车在一定期间内可以自助站立并且自由行走,以和原地转圈,上坡和送高处跃下站立。

二、系统总体设计原理框架图图2.1 系统总体框图三.系统硬件各个构成部分简介3.1.STM32单片机简介(stm32rbt6)主控模块旳STM32单片机是控制器旳关键部分。

该单片机是ST意法半导体企业生产旳32位高性能、低成本和低功耗旳增强型单片机,它旳内核采用ARM企业最新生产旳Cortex—M3架构,最高工作频率可达72MHz,256K旳程序存储空间、48K旳RAM,8个定期器/计数器、两个看门狗和一种实时时钟RTC,片上集成通信接口有两个I2C、3个SPI、5个USART、一种USB、一种CAN、两个和一种SDIO,并集成有3个ADC和一种DAC,具有80个I/0端口。

基于KL25的直立智能车设计

基于KL25的直立智能车设计

基于KL25的直立智能车设计翁祥俊【摘要】文章采用了蓝宙电子KL25Z单片机作为控制芯片,实现小车直立、循迹、避障等多任务行驶。

利用陀螺仪和加速度计传感器测量角速度与重力加速度,通过卡尔曼滤波对其输出的信号进行融合,得到准确的倾角信息,从而稳定的控制小车的直立。

采用线性CCD传感器获取赛道信息,实现小车循迹。

利用编码器采集直立小车行驶速度信号,实现速度闭环控制。

通过一定的控制策略,小车能够顺利完成任务。

%This system utilizes a LanZhou KL25Z microcontroller as control core, implementing the car upright, tracking and obstacle avoidance of multitasking. Using gyroscope and accelerometer sensors measuring angular velocity and acceleration of gravity, through the kalman iflter tothe output signal of fusion, get accurate Angle information. That achieves the purpose of stable control of the car upright. The car is realized by using linear CCD sensors track information, tracking.Collection using encoder upright car speed signal to realize speed closed-loopcontrol.Through certain control strategy, the car would be able to complete the task.【期刊名称】《无线互联科技》【年(卷),期】2015(000)017【总页数】2页(P118-119)【关键词】KL25Z;传感器;PID控制算法;卡尔曼滤波【作者】翁祥俊【作者单位】浙江海洋学院,浙江舟山 316022【正文语种】中文随着现代电子技术的发展,智能化越来越成为我们生活中的焦点,智能直立小车也悄无声息的进入了人们的视野。

倒立小车设计与实现

倒立小车设计与实现

自动控制原理倒立小车的设计与实现目录一、倒立小车设计方案 (4)1.1任务 (4)1.2 过程方案 (4)二、系统设计 (4)2.1硬件电路设计 (4)2.2 车模组装 (7)三、理论分析 (9)3.1倒立小车系统平衡控制分析 (9)3、2倒立小车系统建模及控制分析 (9)四、设备元器件选型 (21)4.1 K60单片机系统 (21)4.1.1 K60处理器简介 (22)4.2电源驱动电路设计 (22)4.3 双电机驱动模块 (23)4.3.1 模块特性 (23)4.3.2 接口说明 (24)4.3.3 电机驱动模块原理图 (24)4.3.4 3.3V辅助电源 (24)4.3.5电机隔离电路 (25)4.3.6 插接件引脚定义图 (25)4.4 landzo飞思卡尔智能车3轴3ENC-03陀螺仪+3轴模拟加速度传感器MMA7361介绍 (26)4.4.1 模块特性 (26)4.4.2 模块结构说明 (26)4.4.3 模块使用方法 (26)一、倒立小车设计要求1.1任务:设计并制作一个倒立小车控制系统,其外形结构如图1所示,要求系统可由两个后轮驱动进行自平衡(基本要求)。

维持小车自平衡的动力都来自于小车的两个后车轮,两个后轮由两个直流电机驱动其转动。

小车的倾角和倾角速度可以通过安装在小车上的加速度传感器和陀螺仪实现。

图1 倒立小车控制系统外形结构1.2 过程方案(1)建立被控对象数学模型;(2)控制系统的理论设计;(3)小车电路设计;(4)小车的系统搭建;(5)小车自平衡程序设计;(6)完成小车的自平衡控制调试。

二、系统设计2.1硬件电路设计2.1.1整体电路框图设计车模控制系统的电路,首先需要分析系统的输入、输出信号,然后选择合适的核心控制嵌入式计算机(单片机),逐步设计各个电路子模块,最后形成完整的控制电路。

系统的输入输出包括:(1)AD转换接口陀螺仪:(2路)一路用于检测车模倾斜角速度,一路用于检测车模转动角速度。

飞思卡尔直立平衡智能车的制作

angle _ control _ out P *err D * angular
其中:P为比例项系数,D为微分项系数小车 Nhomakorabea速度控制
检测小车当前实际运行速度的传感 器为编码器(如右上角图片所示)。 该编码器为512线编码器,即编码 器轴每转动一圈,就会产生512个 脉冲。编码器和小车轮子通过齿轮 咬合,即车轮转动编码器轴也跟着 转动,同时产生脉冲。车轮转动得 越快,产生的脉冲也就越多。通过 主控板上的单片机捕获编码器产生 的脉冲然后计算单位时间内编码器 产生的脉冲数就可以测得小车当前 的运行速度v。
direct _ control _ out P *err D * angular
其中:P为比例项系数,D为微分项系数
对小车电机的总输出
前面分析了要想让直立小车在跑道上匀速地跑需要对小车进行三个方面的 控制,这三个方面的控制对应有三个输出,分别为直立控制输出 angle_control_out、速度控制输出V_control_out和方向控制输出 direct_control_out。这三个输出的控制目标(或控制对象)虽然不同,但是 执行机构是一样的,都是小车上的一对电机。在这里,这三个控制输出线 性地叠加在一起,合成一个总的控制输出,作用在小车电机上。叠加公式 如下:
小车的速度控制
我们要求直立小车要在跑道上匀速运动,即我们期望小车的速度是恒定的 Ve。小车的速度控制实际上就是控制小车当前的实际速度接近或者达到我 们预先设定的期望速度。这里,我们采用PID控制策略中的P(比例)I(积分) 控制来控制小车的速度。 给定一个小车的期望速度Ve,同时由编码器测得小车当前的实际速度V,小 车的期望速度与实际速度作一个比较,得到速度偏差err。其中,速度偏差 err作为PI控制中P项的输入。PID控制策略中的积分项(即I项)实际上就是 偏差的累加再乘以一个积分系数I。设integration为速度偏差err的累积结果, 则速度偏差累积结果integration作为PI控制中I项的输入。得到以下速度PI控 制的公式:

飞思卡尔直立车经验总结范本(2篇)

飞思卡尔直立车经验总结范本先静下心来看几篇技术报告,可以是几个人一起看,边看边讨论,大致了解智能车制作的过程及所要完成的任务。

看完报告之后,对智能车也有了大概的了解,其实总结起来,要完成的任务也很简单,即输入模块-控制-输出。

(1)输入模块。

各种传感器(光电,电磁,摄像头),原理不同,但功能都一样,都是用来采集赛道的信息。

这里面就包含各种传感器的原理,选用,传感器电路的连接,还有传感器的____、传感器的抗干扰等等需要大家去解决的问题。

(2)控制模块。

传感器得到了我们想要的信息,进行相应的ad转换后,就把它输入到单片机中,单片机负责对信息的处理,如除噪,筛选合适的点等等,然后对不同的赛道信息做出相应的控制,这也是智能车制作过程中最为艰难的过程,要想出一个可行而又高效的算法,确实不是一件容易的事。

这里面就涉及到单片机的知识、c语言知识和一定的控制算法,有时为了更直观地动态控制,还得加入串口发送和接收程序等等。

(3)输出模块。

好的算法,只有通过实验证明才能算是真正的好算法。

经过分析控制,单片机做出了相应的判断,就得把控制信号输出给电机(控制速度)和舵机(控制方向),所以就得对电机和舵机模块进行学习和掌握,还有实现精确有效地控制,又得加入闭环控制,pid算法。

明确了任务后,也有了较为清晰的控制思路,接下来就着手弄懂每一个模块。

虽然看似简单,但实现起来非常得不容易,这里面要求掌握电路的知识,基本的机械硬件结构知识和单片机、编程等计算机知识。

最最困难的是,在做的过程中会遇到很多想得到以及想不到的事情发生,一定得细心地发现问题,并想办法解决这些问题。

兴趣是首要的,除此之外,一定要花充足的时间和精力在上面,毕竟,有付出就会有收获,最后要明确分工和规划好进度。

飞思卡尔直立车经验总结范本(二)飞思卡尔直立车(Segway)是一种新型的个人交通工具,它以自平衡的技术为基础,能够在不倒地的情况下前进、转弯和停止。

我在过去一年里使用了飞思卡尔直立车,并从中获得了许多宝贵的经验。

2024年飞思卡尔直立车经验总结范文(2篇)

2024年飞思卡尔直立车经验总结范文引言随着科技的不断进步和人们生活水平的提高,交通工具也在不断创新和发展。

直立车作为一种新型的个人出行工具,已经逐渐走进人们的生活。

作为飞思卡尔公司的员工,我有幸参与了2024年飞思卡尔直立车的研发和试用,并且在实际使用中积累了一些经验和体会。

本文将针对我个人的使用经验,对2024年飞思卡尔直立车进行总结。

一、产品介绍2024年飞思卡尔直立车是一种个人出行工具,采用电动动力系统,配备直立式车架和平衡系统。

该车拥有轻巧便携的特点,使用者可以通过折叠和展开车架来方便地携带。

另外,该车配备了智能平衡系统,可以感知使用者的重心变化,实现自动平衡。

除此之外,该车还采用了悬浮式轮胎和磁悬浮技术,提供了平稳、舒适的骑行体验。

二、使用体验1. 稳定性2024年飞思卡尔直立车的平衡系统非常稳定,能够准确感知使用者的动作,并根据重心的变化自动调整车身的平衡。

在骑行过程中,我几乎感受不到晃动和颠簸,给人一种非常舒适的感觉。

此外,悬浮式轮胎和磁悬浮技术的运用使得车辆在不平坦路面上也具有很好的稳定性。

2. 操控性飞思卡尔直立车的操控性非常灵活,可以通过微调身体重心来控制车辆的前进、停止和转弯。

在我使用的过程中,我发现掌握操控的技巧后,可以非常准确地控制车辆的移动和方向变化。

同时,悬浮式轮胎的设计也为车辆的操控提供了更好的反应速度和转弯性能。

3. 便携性2024年飞思卡尔直立车在便携性方面也做得非常出色。

车架采用了可折叠设计,可以方便地收起来放入背包或行李箱中。

我曾经携带该车外出旅行,在旅途中非常方便地进行出行。

此外,车辆的轻巧和可折叠的设计也为用户提供了更多的场景和用途选择。

4. 安全性飞思卡尔直立车在安全性方面也有很好的保证。

首先,平衡系统的稳定性确保了车辆在骑行过程中的安全性。

其次,车辆配备了电子刹车系统和灵敏的感应器,在使用过程中能够快速响应用户的操作,提供安全的停车和刹车效果。

最后,车辆还配备了前后防护装置和智能警示系统,提高了车辆在复杂交通环境中的安全性。

自平衡小车开题报告

哈尔滨工业大学深圳研究生院 控制科学与工程
Department of Control Science and Engineering in HIT Shenzhen平衡小车设计方案
组员 黄涛 陶玉龙 王亚龙 梁华盛
哈尔滨工业大学深圳研究生院 控制科学与工程
Department of Control Science and Engineering in HIT Shenzhen Graduate School
哈尔滨工业大学深圳研究生院 控制科学与工程
Department of Control Science and Engineering in HIT Shenzhen Graduate School
硬件电路搭建: (1) 单片机最小系统:包括AVR单片机,程序下 载调试接口等; (2) 陀螺仪与加速度计:包括传感器信号放大滤 波电路; (3) 速度检测:检测电机光电码盘脉冲频率; (4) 电机驱动:驱动两个电机运行功放电路; (5) 电源:电源电压转转换,稳压,滤波电路; (6)设置与调试:显示系统运行状态与监控
哈尔滨工业大学深圳研究生院 控制科学与工程
Department of Control Science and Engineering in HIT Shenzhen Graduate School
五.可行性分析
目前我们组的定位是首先AVR单片机控制电路实 现小车自主平衡。速度和方向控制计划用红外遥 控实现,放弃使用在软硬件设计方面要求很高的 自主寻迹。
谢谢
电机运动控制作用: 1.通过电机加速度控制实现 小车平衡稳定。 2.通过电机速度控制,实现 小车恒速运行和静止。 3.通过电机差速控制,实现 小车方向控制。
哈尔滨工业大学深圳研究生院 控制科学与工程
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

高级组直立车论文报告队长:李逸锋队员:李家兴陈庆峰原理介绍电磁组比赛要求车模在直立的状态下以两个轮子着地沿着赛道进行比赛,相比四轮着地状态,车模控制任务更为复杂。

车模运动控制任务可以分解成以下三个基本任务:(1)控制车模直立:通过控制电机正反向运动保持车模直立状态;(2)控制车模速度:通过控制两个电机转速速度实现车模行进控制;车模倾角测量控制车模直立的算法是通过测量车模的倾角和倾角通过测量车模的倾角和倾角加速度控制车模车轮的加速度来消除车模的倾角,因此车模倾角以及倾角加速度的测量成为控制车模直立的关键。

测量车模倾角和倾角加速度可以通过加速度传感器和陀螺仪实现。

(1)加速度传感器:在硅片上加工形成了一个机械悬臂。

它与相邻的电极形成了两个电容。

由于加速度使得机械悬臂与两个电极之间的距离发生变化,从而改变了两个电容的参数。

通过集成的开关电容放大电路量测电容参数的变化,形成了与加速度成正比的电压输出。

(2)角速度传感器-陀螺仪:它利用了旋转坐标系中的物体会受到克里利奥力的原理,在器件中利用压电陶瓷做成振动单元。

当旋转器件时会改变振动频率从而反映出物体旋转的角速度。

在车模上安装陀螺仪,可以测量车模倾斜的角速度,将角速度信号进行积分便可以得到车模的倾角。

注意:由于陀螺仪输出的是车模的角速度,不会受到车体振动影响。

因此该信号中噪声很小。

车模的角度又是通过对角速度积分而得,这可进一步平滑信号,从而使得角度信号更加稳定。

因此车模控制所需要的角度和角速度可以使用陀螺仪所得到的信号。

由于从陀螺仪的角速度获得角度信息,需要经过积分运算。

如果角速度信号存在微小的偏差,经过积分运算之后,变化形成积累误差。

利用加速度计所获得的角度信息g θ与陀螺仪积分后的角度θ进行比较,将比较的误差信号经过比例g T 放大之后与陀螺仪输出的角速度信号叠加之后再进行积分。

对于加速度计给定的角度g θ,经过比例、积分环节之后产生的角度θ必然最终等于g θ。

由于加速度计获得的角度信息不会存在积累误差,所以最终将输出角度θ中的积累误差消除了。

使用加速度计来矫正陀螺仪的积分漂移只是其中一种方法。

还可以通过测量车模的运行速度和加速度来矫正陀螺仪的积分漂移,这样就可以省略加速度器件。

车模速度控制电机运动控制是通过改变施加在其上的驱动电压实现的。

对于电机的电磁模型、动力学模型以及车模的动力学模型进行分析和简化,可以将电机运动模型简化成如下的一阶惯性环节模型。

对应不同的电压,电机的速度变化曲线如图:电机运动明显分为两个阶段:第一个阶段是加速阶段;第二个阶段为恒速阶段。

其中,在加速阶段,电机带动车模后轮进行加速运动,加速度近似和施加在电机上的电压成正比,加速阶段的时间长度取决于时间常数T ,该常数由电机转。

动惯量、减速齿轮箱、车模的转动惯量决定;在恒速阶段,电机带动车模后轮进行恒速运行,运行速度与施加在电机上的电压成正比。

调整车模直立时间常数很小,此时电机基本上运行在加速阶段。

加速度控制量 a 再乘以一个比例系数,即为施加在电机上的控制电压,这样便可以控制车模保持直立状态。

电机速度控制需要测量电机的转速,电机旋转速度可以通过安装在电机输出轴上的光电编码盘方便获得。

如图车模运动控制总框图: Stm32需要采集如下信号:(1)车模陀螺仪信号;(2)车模加速度计信号(3)车模电机转速脉冲信号;车模的三种控制(直立、速度、方向)最终是将控制量叠加在一起作为电机输出电压控制量。

直立控制是基础,它的调整速度非常快,速度和方向控制相对调整速度慢。

速度和方向控制的输出量是直接叠加在电机控制电压上。

它们假定直立控制会始终保持车模不跌倒,直立控制会自动调节车模的倾角以适应车模的加速、减速和转弯的需要。

稍作分析如下:车模加速前进时,由速度控制算法给出电机增加的正向电压,电机开始逐步加速旋转。

在此同时,车模直立控制会迅速进行调整,使得车模往前倾斜,车模开始加速。

当车模速度达到设定值,由车模速到控制算法使得电机进入恒速运行。

此时车模直立控制算法也会相应调整车模出于直立状态,车模恒速运行。

车模减速过程与此类似,由速度控制算法减少了电机的电压,电机开始减速运行。

直立控制算法会自动调整车模往后倾斜,使得车模减速。

车模转向控制是在车速控制基础之上,调节两个电机驱动电压差使得电机运行速度出现差动,进而调整车模的方向。

附录:直立小车主程序/*Includes------------------------------------------------------------*/#include "stm32f10x.h"#include "hardware.h"#include "usart.h"#include "ili932x.h"#include "rtc.h"#include "adc.h"#include <math.h>#include "kalman.h"/* Private typedef -----------------------------------------------------------*/#define Kp 12 // 比例常数Proportional Const //60#define Kd 0 // 微分常数Derivative Const //先调0 //30 #define siqu 5#define PWMpl 71/*Privatedefine--------------------------------------------------------*//*Privatemacr--------------------------------------------------------*/extern uint8_t gImage_11[];static __IO uint32_t TimingDelay;extern float angle, angle_dot;vu16 ADCCValue[2];float jiao=0;float sudu=0;float ADCa1=0,ADCa0=0;int dat=0,i=0;/* Private variables ---------------------------------------------------------*//*const char menu[] ="\n\r""********************* MINI-开发板**********************\n\r""| MINI-STM32开发板试验程序|\n\r""| 可调电阻VR试验|\n\r""| |\n\r""| 2010.12.17 |\n\r""| 技术支持群:121939788 |\n\r""*-------------------------------------------------------*\n\r";*//* Private function prototypes -----------------------------------------------*/void GPIO_Configuration(void);void NVIC_Configuration(void);void Time_Display(uint32_t TimeVar);void Absolute_Pressure_ADC_Init(void) ;uint8_t KEY_Scan(void);void Delay(__IO uint32_t nTime);void active(void);void FORWARD_Init(uint16_t);void BACKWARD_Init(uint16_t);void STOP_Init(void);void TIM1_Configuration(void);//void TIM3_CONFIGURATION(void);void PWMTIM1Set(uint16_t);void PWMTIM3Set(uint16_t);void TIM2_Configuration(void);/* Private functions ---------------------------------------------------------*//***************************************************************************** ** 函数名称: main** 功能描述: 主函数入口** 作者: Dream** 日期: 2010年12月17日*****************************************************************************/ int main(void){SystemInit(); //配置系统时钟72M(包括clock, PLL and Flash configuration) while(SysTick_Config(SystemFrequency / 1000)); //Systick 配置延时n*msGPIO_Configuration(); // 引脚配置TIM1_Configuration();USART_Configuration(); //异步通信初始化NVIC_Configuration(); //系统中断配置LCD_Init(); // LCD初始化LCD_Clear(WHITE); //清屏PAout(1)=1;Absolute_Pressure_ADC_Init();Absolute_Pressure_ADC_Init(); //初始化2次??TIM2_Configuration(); //开tim2定时中断while(1){}}//读取ENC03和7361的输入void Absolute_Pressure_ADC_Init(void){ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;/* Enable DMA1 clock */RCC_AHBPeriphClockCmd(/*RCC_AHBPeriph_DMA1*/(uint32_t)0x00000001, ENABLE);/* Enable ADC1 clock */RCC_APB2PeriphClockCmd(/*RCC_APB2Periph_ADC1*/(uint32_t)0x00000200, ENABLE);/* DMA1 channel1 configuration ----------------------------------------------*/DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)0x4001244C/* ADC1_DR_Address*/; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADCCValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 2;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* Enable DMA1 channel1 */DMA_Cmd(DMA1_Channel1, ENABLE);/* Start ADC1 Software Conversion */ADC_SoftwareStartConvCmd(ADC1, ENABLE);/* ADC1 structre initialization */ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = ENABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel =2;ADC_Init(ADC1, &ADC_InitStructure);/* ADC1 regular channel0 configuration */ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_41Cycles5); //239 ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_41Cycles5); //239 /* Enable ADC1 DMA */ADC_DMACmd(ADC1, ENABLE);/* Enable ADC1 */ADC_Cmd(ADC1, ENABLE);/* Enable ADC1 reset calibaration register */ADC_ResetCalibration(ADC1);/* Check the end of ADC1 reset calibration register */while(ADC_GetResetCalibrationStatus(ADC1));/* Start ADC1 calibaration */ADC_StartCalibration(ADC1);/* Check the end of ADC1 calibration */while(ADC_GetCalibrationStatus(ADC1));}void active(void){int16_t pwm=0,pulse_wide=0;// angle+=0.180*180/3.14159;float angle_1;angle_1=0.180*180/3.14159;angle+=angle_1;pwm=angle*Kp+angle_dot*Kd;if(pwm<0)pulse_wide=0-pwm;elsepulse_wide=pwm;pulse_wide+=siqu; //最终输出if(angle>(0.6*180/3.14159))pulse_wide=0;if (angle<(-0.6*180/3.14159))pulse_wide=0;if(pulse_wide>100)pulse_wide=100;if(angle>0.000){// pulse_wide-=10;// LCD_ShowNum(60,280,(uint8_t)angle,2,16); //显示整数部分// LCD_ShowNum(100,280,(angle-(uint8_t)angle)*1000,3,16); //显示小数部分// LCD_ShowNum(60,300,(uint8_t)angle_dot,2,16); //显示整数部分// LCD_ShowNum(100,300,(angle_dot-(uint8_t)angle_dot)*1000,3,16); //显示小数部分FORWARD_Init(pulse_wide);}else if(angle<-0.000){// pulse_wide-=10;// LCD_ShowNum(60,280,(uint8_t)angle,2,16); //显示整数部分// LCD_ShowNum(100,280,(angle-(uint8_t)angle)*1000,3,16); //显示小数部分// LCD_ShowNum(60,300,(uint8_t)angle_dot,2,16); //显示整数部分// LCD_ShowNum(100,300,(angle_dot-(uint8_t)angle_dot)*1000,3,16); //显示小数部分BACKWARD_Init(pulse_wide);}else //if(angle>=-0.020&&angle<=0.000){// LCD_ShowNum(60,280,(uint8_t)angle,2,16); //显示整数部分// LCD_ShowNum(100,280,(angle-(uint8_t)angle)*1000,3,16); //显示小数部分// LCD_ShowNum(60,300,(uint8_t)angle_dot,2,16); //显示整数部分// LCD_ShowNum(100,300,(angle_dot-(uint8_t)angle_dot)*1000,3,16); //显示小数部分STOP_Init();}}void PWMTIM3Set(uint16_t pulse_wide){TIM_SetAutoreload(TIM3,100);TIM_SetCompare1(TIM3,pulse_wide);}void PWMTIM1Set(uint16_t pulse_wide){TIM_SetAutoreload(TIM1,1000);TIM_SetCompare1(TIM1,pulse_wide*10);}void FORWARD_Init(uint16_t pluse_wide){// PWMTIM3Set(0);PWMTIM1Set(pluse_wide);GPIO_ResetBits(GPIOC, GPIO_Pin_14); //0GPIO_SetBits(GPIOC, GPIO_Pin_15); //1}void BACKWARD_Init(uint16_t pluse_wide){// PWMTIM1Set(0);GPIO_SetBits(GPIOC, GPIO_Pin_14); //1GPIO_ResetBits(GPIOC, GPIO_Pin_15); //0PWMTIM1Set(pluse_wide);}void STOP_Init(void){// PWMTIM1Set(0);// PWMTIM3Set(0);GPIO_ResetBits(GPIOC, GPIO_Pin_14); //0GPIO_ResetBits(GPIOC, GPIO_Pin_15); //0}//TIM1,OC1通道void TIM1_Configuration(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //TIM_DeInit(TIM1);TIM_TimeBaseStructure.TIM_Prescaler = PWMpl/*71999*/; //时钟预分频得CK_INT时钟提供给计数器APB2时钟/(n+1) n=1~65536TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseStructure.TIM_Period = 1000-1; //自动重装载值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟倍频因子,输出时钟供给死区发生器等TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); //初始化TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM1; //PWM1模式TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //信号输出到对应的输出引脚TIM_OCInitStructure.TIM_Pulse=0; //脉冲宽度TIM_OCInitStructure.TIM_OCPolarity=TIM_OCNPolarity_High; //互补输出高电平有效TIM_OC1Init(TIM1,&TIM_OCInitStructure); //OC1通道初始化TIM_Cmd(TIM1,ENABLE); //使能定时器1TIM_CtrlPWMOutputs(TIM1,ENABLE); //使能PWM输出}//TIM3,OC1通道void TIM3_CONFIGURATION(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // tim3时钟使能/* Time base configuration */TIM_TimeBaseStructure.TIM_Period =1000-1;TIM_TimeBaseStructure.TIM_Prescaler = PWMpl;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/* PWM1 Mode configuration: Channel1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM3, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // 使能TIMx在CCR1上的预装载寄存器TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能TIMx在ARR上的预装载寄存器TIM_SetClockDivision(TIM3,TIM_CKD_DIV1); // 这句话好像没有什么用处// 设定为TIM_CKD_DIV4,TIM_CKD_DIV1都是一样的TIM_Cmd(TIM3, ENABLE); // 定时器开始运行}/******************************************************************************* 函数名称: TIM2_Configuration** 功能描述: 定时器配置** 作者: Dream** 日期: 2010年12月17日*****************************************************************************/ void TIM2_Configuration(void){TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;TIM_DeInit( TIM2); //复位TIM2定时器RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2//定时5mSTIM_BaseInitStructure.TIM_Period =15/*2000*/; //设置自动重载寄存器值为最大值TIM_BaseInitStructure.TIM_Prescaler = 7200-1; //自定义预分频TIM_BaseInitStructure.TIM_ClockDivision = 0;TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式TIM_BaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_BaseInitStructure);//清中断,以免一启用中断后立即产生中断TIM_ClearFlag(TIM2, TIM_FLAG_Update);//使能TIM2中断源TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//TIM2总开关:开启TIM_Cmd(TIM2, ENABLE);}/***************************************************************************** ** 函数名称: TIM2_IRQHandler** 功能描述: 定时器2中断处理函数*****************************************************************************/ void TIM2_IRQHandler(void){if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);for(i=0;i<20;i++){ADCa1+=ADCCValue[1];}ADCa1=ADCa1/20;jiao=180/3.14159*asin((float)(ADCa1-2065)/190);for(i=0;i<20;i++){ADCa0+=ADCCValue[0];}ADCa0=ADCa0/20;sudu=(float)((float)(3.3/4096)*ADCa0-1.380)/0.67*180/3.14159/*7892*/;ADCa1=0;ADCa0=0;Kalman_Filter(jiao,sudu);active();}}/***************************************************************************** ** 函数名称: GPIO_Configuration** 功能描述: 配置IO口** 作者: Dream** 日期: 2010年12月17日*****************************************************************************/ void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;//使能端口时钟,重要!!!RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC| RCC_APB2Periph_USART1, ENABLE);/* 配置KEY1、KEY2引脚的功能*********************/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入模式GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA0、PA1/* 配置USART1 Tx (PA9) */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用开漏输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出最大频率为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);/* 配置USART1 Rx (PA10) */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入模式GPIO_Init(GPIOA, &GPIO_InitStructure);//A2是enc03_out口ch_2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);//A1为7361的SL端GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(GPIOA, &GPIO_InitStructure);//B0是7361的Z轴ch_8GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOB, &GPIO_InitStructure);// TIM3_CH1_PA6GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM1_CH1_PA8GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//电机控制脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);}/***************************************************************************** ** 函数名称: KEY_Scan** 功能描述: 按键处理函数0,没有任何按键按下1,KEY1按下2,KEY2按下** 作者: Dream** 日期: 2010年12月17日*****************************************************************************/ uint8_t KEY_Scan(void){static uint8_t KEY_UP=1; //按键按松开标志if(KEY_UP&&(KEY1==0||KEY2==0)){Delay(10); //去抖动KEY_UP=0;if(KEY1==0)return 1;else if(KEY2==0)return 2;}else if(KEY1==1&&KEY2==1)KEY_UP=1;return 0; //无按键按下}/***************************************************************************** ** 函数名称: Delay** 功能描述: 用Systick延时** 作者: Dream** 日期: 2010年12月17日*****************************************************************************/ void Delay(__IO uint32_t nTime){TimingDelay = nTime;while(TimingDelay != 0);}/***************************************************************************** ** 函数名称: TimingDelay_Decrement** 功能描述: Systick中断进入函数** 作者: Dream** 日期: 2010年12月17日*****************************************************************************/ void TimingDelay_Decrement(void){if (TimingDelay != 0x00){TimingDelay--;}}/***************************************************************************** ** 函数名称: NVIC_Configuration** 功能描述: 系统中断管理** 作者: Dream** 日期: 2010年12月17日*****************************************************************************/ void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#else /* VECT_TAB_FLASH *//* Set the Vector Table base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断组为0NVIC_InitStructure.NVIC_IRQChannel = /*TIM2_IRQn*/28; //更新事件NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断NVIC_Init(&NVIC_InitStructure); //写入设置}#ifdef USE_FULL_ASSERT/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval : None*/void assert_failed(uint8_t* file, uint32_t line){/* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* Infinite loop */while (1){}}#endif/************************************** End of File*/。

相关文档
最新文档