基于STM32-PID闭环控制调速系统_第1页
基于STM32-PID闭环控制调速系统_第2页
基于STM32-PID闭环控制调速系统_第3页
基于STM32-PID闭环控制调速系统_第4页
基于STM32-PID闭环控制调速系统_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计报告课程:运动控制系统实践题目:基于STM32-PID闭环控制调速系统专业班级:机器人201姓名:指导教师:完成周数:目录TOC\o"1-3"\h\z\u10240第1章绪论 一.绪论传统的控制系统采用模拟元件,虽在一定程度上满足生产要求,但是因为元件容易老化,在使用中易受外界干扰影响,并且线路复杂、通用性差,控制效果受器件性能、温度等因素的影响,故系统的运行可靠性及标准性得不到保证,甚至出现事故。而如今首先实现了整流器的更新换代,以晶闸管整流装置取代了习用已久的直流发电机电动机组及水银整流装置使直流电气传动完成了一次大的跃进。大功率直流调速系统通常采用三相全控桥式整流电路对电动机进行供电,从而控制电动机的转速。同时,控制电路已经实现高集成化、小型化、高可靠性及低成本。以上技术的应用,使直流调速系统的性能指标大幅提高,应用范围不断扩大。直流调速技术不断发展,走向成熟化、完善化、系列化、标准化,在可逆脉宽调速、高精度的电气传动领域中仍然难以替代。直流调速是指人为地或自动地改变直流电动机的转速,以满足工作机械的要求。从机械特性上看,就是通过改变电动机的参数或外加电压等方法来改变电动机的机械特性,从而改变电动机机械特性和工作特性机械特性的交点,使电动机的稳定运转速度发生变化。直流电动机具有良好的起动、制动性能,宜于在大范围内平滑调速,在轧钢机、矿井卷扬机、挖掘机、高层电梯等需要高性能可控电力拖动领域应用历史悠久。二.课程设计方案2.1概述本综合实践是本专业必修实践课程通过本综合实践,增强对机电传动部件的感性认识,培养学生综合分析问题的能力和实际动手能力。通过本课程的学习,对机械电子工程专业10.2,能通过口头及书面方式就复杂工程问题与同行进行有效沟通,陈述自己的想法。通过本综合实践,从理论学习和实践的角度了解机电传动系统,增强对机电传动部件的感性认识,熟悉机电传动系统各部件的结构、工作原理和传动系统的基本分析方法。掌握机电传动系统常见故障分析和排除方法,掌握一般机电传动系统的初步设计和性能分析能力2.2系统组成总体结构本系统主要由STM32单片机控制器、电机驱动模块、变压模块、LED显示模块、霍尔编码器、按键输入模块和直流电动机构成。系统由按键输入给定转速,给定值与接口电路接收的转速反馈信号及电流反馈信号形成偏差,由单片机控制器分别进行转速和电流的PID调节,输出控制信号经数模转换作为触发整流电路的控制电压,调节整流输出电压以调节直流电动机的转速,使转速尽快达到给定值并实现无静差,并实时显示电机转速。系统结构图如下图2.3所示。图2.3系统结构框图三.硬件设计3.1STM32单片机控制器闭环直流调速系统的控制功能简单,选择单片机STM32作为主控制器,STM32是一款由意法半导体公司生产的32位微控制器,基于ARM

Cortex-M内核开发。STM32单片机旁边的一排金属针脚就是引脚,分为电源、时钟、控制和其他功能。其中,ST表示意法半导体公司,M表示微控制器,32表示32位。单片机的使用领域广泛,从家用电器和通讯设备到智能仪表以及导航系统都有应用。STM32单片机的型号命名规则为2FFF3103R,其中2FFF代表芯片子系列,3103代表增强型系列,R代表引脚数,B代表内嵌Flash容量。STM32单片机如下图3.1.1所示,STM32单片机样图如下图3.1.2所示。图3.1.1STM32单片机系统电路图3.1.2STM32单片机样图3.2电机驱动

电机控制模块的功效是操纵电动式车子的起动运作、胜败速率、上坡力度等行车情况,或是将协助电动车子刹车踏板,并将一部分刹车踏板动能储存到动力锂电池中。

1、电机控制模块具有制动感恩回馈作用,当全车刹车踏板制动时,电机控制模块根据制动感恩回馈将电磁能存有动力锂电池中,提升里程数。

2、放流坡作用是以便防止有半坡起步时,当制动脚踏板向油门转换的全过程中车子后溜,当发觉车子后溜时,电机控制模块进到防溜坡转态,控制板全自动调节转距輸出在线客服车子因作用力造成的后溜。

电机控制模块还具有巡航定速作用,不在踩油门的状况下,电机控制模块可輸出扭矩全自动依照VCU设置时速,维持车子以固定不动的速率行车,以节约司机精力,提升安全驾驶感受。

电机控制模块操作温度范畴:-40~85℃,在其中65℃之上便会开展限定输出功率輸出。环境湿度规定,承继控制板在空气湿度不超过95%的状况下会一切正常工作中,应在其外表温度小于漏点的状况下,及电机控制模块在表层造成冷疑也可以安全生产工作,在海拔高度三千米下列能够一切正常工作中,在其中防污防水级别IP67。

电机特性

小车前进的动力是通过直流电机来驱动的,直流电机是最早出现的电动机,也是最早能实现调速的电动机。长期以来,直流电动机一直占据着调速控制的统治地位。它具有良好的线性调速特性,简单的控制性能,较高的效率,优异的动态特性。系统选用的大谷基础车的260马达作为驱动电机。其额定电压为3-12V,额定功率0.02KW,额定转速3000r/min

近年来,直流电动机的结构和控制方式都发生了很大变化,随着计算机进入控制领域,以及新型的电力电子功率元件的不断出现,使采用全控制型的开关功率元件进行脉冲调制(Pulse

Width

Modulation简称PWM)控制方式已经成为主流,这种控制方式容易在单片机控制中实现。

PWM技术的具体有以下5点:

1.调速范围宽,可以使电机安全地工作在每分钟几转到全速运转;

2.效率高,电源能源损耗小;

3.易于数字量控制;

4.应用广泛,PWM技术不仅可以用在电机调速,还可以在直流电压、

5.交流变频控制等领域有很大应用。驱动模块电路图如下图3.1.1所示,驱动模块样图如下图3.1.2所示。图3.2.1驱动模块电路图图3.2.2驱动模块样图TB6612FNG的工作原理:1.电源接入:将电源正极连接到电机驱动模块的VCC引脚,将电源负极连接到GND引脚。这样可以提供工作电压供电。2.电机连接:将要控制的直流电机的两个端口连接到电机驱动模块的OUT1和OUT2引脚,或者OUT3和OUT4引脚,具体连接方式取决于电机的运行方式和控制需求。3.控制输入:通过微控制器或其他控制设备,将控制信号引脚(如AIN1、AIN2、BIN1、BIN2等)连接到电机驱动模块的相应引脚。通过改变这些控制信号的状态,可以控制电机的转向和速度。4.PWM调制:使用脉冲宽度调制(PWM)信号来控制电机的速度。通过改变PWM信号的占空比,可以改变电机的平均电压和速度。5.逻辑控制:TB6612FNG电机驱动模块具有内置的逻辑电路,根据输入的控制信号和PWM信号状态,控制相应的H桥开关打开或关闭,从而控制电机的电流和转向。6.保护功能:TB6612FNG电机驱动模块通常具有过流保护和过热保护功能。当电机的电流或温度超过设定阈值时,保护电路会自动停止电机的运行,以防止电机和驱动器受到损害。TB6612FNG电机驱动模块通常由驱动芯片、电源接口、引脚接口和保护电路等组成。它广泛应用于机器人、智能车、无人机以及自动化控制等领域,为直流电机提供了可靠的驱动和控制。通过控制信号,可以实现直流电机的双向运动、速度调节和停止等功能。3.3变压模块本设计的变压模块我们采用的是LM2596SDC-DC降压模块如图3.3.1所示,选择的输入电压范围是6.5V~36V输出电压是稳定的5V。LM2596S是一种常见的DC-DC降压模块,它是一种集成电路,可将高电压转换为较低电压。图3.3.1变压模块电路图图3.3.2变压模块样图3.4LED显示模块为使线路简单,工作可靠,装置体积小,本设计采用KJ004组成的六脉冲集成触发电路。触发电路根据给定的控制电压,输出相应的触发脉冲信号,分别控制三相晶闸管整流电路的晶闸管触发端,改变导通角以实现调节直流电动机的供电电压。a相触发电路图如下图3.4所示。图3.4.1LED显示模块电路图图3.4.2LED显示模块样图3.5按键控制模块我们采用了开关式按键输入方式如图2-6所示,通过按键输入信号给STM32控制器控制转速的加减。开关式输入:按键在按下和释放时会产生一个二进制状态变化。按下时,电路闭合,输入为高电平或1;释放时,电路断开,输入为低电平或0。按键变量输入可以通过设备或系统进行解码和处理,从而执行特定的操作或修改变量值。图3.5.1按键控制模块电路图图3.5.2按键控制模块样图按键连接电阻和电容的主要原因有以下几点:1.限制电流:电阻可以限制电流的流动。通过连接电阻,当按键按下时,电流可以受到限制,防止电路中电流过大而导致损坏。2.平滑电流:电容器可以平滑电流的波动。由于电容器具有储存电荷的能力,可以通过连接电容器来平滑电流的变化,以稳定电路的运行。3.延迟响应:电容器可以延迟电路的响应时间。电容器通过存储和释放电荷,可以在启动或关闭电路时提供额外的时间来激活或解除电路的响应。4.调整频率:电容和电阻的组合可以调整电路的频率响应。通过选择适当的电容和电阻值,可以调整电路对特定频率的响应,实现滤波、增益等功能。需要注意的是:按键变量输入通常受到输入响应速度、按键反馈和稳定性等因素的影响。因此,在设计和使用按键输入时,需要考虑这些因素以确保准确和可靠的数据输入。3.6霍尔编码器和直流电机我们采用了霍尔编码器是和直流电机固定在一起,霍尔编码器(Hallencoder)是一种用于检测轴或物体位置和角度的装置。它由霍尔传感器和磁极组成。霍尔传感器通常安装在旋转轴上,而磁极则固定在旋转或移动的物体上。通过测量霍尔电压的变化,霍尔编码器可以实时准确地获取物体的位置和角度信息。采用JGB37-520(DC12V1100RPM)直流减速电机如图2-5所示,这种电机通常用于一些需要高扭矩和低速运转的应用。图3.6.1霍尔编码器电路图图3.6.2霍尔编码器和直流电机样图霍尔编码器相比其他位置或角度检测装置具有以下优点:1.高精度:霍尔编码器可以提供非常高的位置和角度测量精度,通常可以达到亚毫米或亚度的级别,适用于对位置和角度要求较高的应用。2.高速度:由于霍尔传感器能够快速检测和转换磁场变化为电信号,霍尔编码器能够快速响应并提供高速度的位置和角度测量,适用于高速旋转或移动的应用。3.高可靠性:霍尔编码器不受灰尘、油污等外界环境因素的影响,能够在较恶劣的工作环境下稳定工作。4.不受机械磨损影响:相比于接触式编码器,霍尔编码器是非接触式的,传感器与磁极之间没有直接的物理接触,因此不会出现因机械磨损导致测量精度下降的情况。5.简单的安装和调整:霍尔编码器的安装相对简单,只需将传感器固定在轴上,磁极固定在物体上即可。同时,调整也相对容易,只需调整传感器与磁极之间的距离和位置。3.7电源模块电源模块是电子设备中重要的组成部分,它的作用是将输入的电能转换为设备所需的稳定、可靠的电源输出。电源模块通常由电源输入端、变换器、稳压器、滤波器和输出端组成。

电源模块的作用可以总结为以下几点:

1.输入电源适配:电源模块可以适配不同的输入电源,可以接受来自市电、电池、太阳能等多种电源输入。它可以将输入电源的电压、频率和波形进行调整和适配,以满足设备对电源输入的要求。

2.电源转换:电源模块通过变换器将输入电源的电压转换为设备所需的电压。变换器一般采用开关电源技术,可以实现高效率的转换和稳定的输出。

3.电源稳压:电源模块通过稳压器对输出电压进行稳定控制,以确保设备获得稳定的电源供应。稳压器可以通过负载调整、反馈控制、电压调整等方式实现电源的稳定输出。

4.电源过滤:电源模块内部还配备了滤波器,用于滤除输入电源中的噪声和干扰,以提供干净、稳定的电源供应。

5.保护功能:电源模块通常还具备一些保护功能,如过载保护、过压保护、短路保护等,以保护设备免受电源异常或故障的损害。

总体来说,电源模块的作用是将输入电源转换为稳定、可靠的电源输出,以保证设备正常运行。它对设备的性能、可靠性和功耗等方面起着重要的影响。四.程序设计#include"sysinc.h"#include"motor.h"#include"encoder.h"voidkey_deal(void);voidkey_init(void);intPWM_MAX=9000;/**这段代码是一个简单的示例,它包含了几个函数和一个变量的声明。

1."#include"是一个预处理指令,用于包含头文件。sysinc.h是一个自定义的头文件,可能包含了一些系统需要的宏定义、数据类型定义或者其他需要在这个代码中使用的声明。motor.h和encoder.h可能是其他模块或者外部设备的头文件,用于对电机和编码器进行操作和控制。

2.key_deal()是一个函数的声明,并且没有返回值(void)。这个函数可能用于处理按键的操作,但是在这段代码中没有具体的实现。

3.key_init()也是一个函数的声明,同样没有返回值(void)。这个函数可能用于初始化按键的相关设置和配置。

4.PWM_MAX是一个整型变量的声明,初始化为9000。根据变量名和数值的命名规则,它可能代表了一个最大PWM脉宽值,用于控制电机的速度或者位置。

总体来说,这段代码可能是一个控制电机和编码器的简单程序。其中包含了一些需要用到的头文件,以及处理按键操作的函数和初始化按键的函数。同时,定义了一个整型变量用于控制电机的PWM输出值。但是由于代码的片段较短,没有完整的实现和上下文,只能就给出的代码进行大致的解释。floatSKp=5,SKi=10; intIncremental_PI(intEncoder,intTarget){ staticintBias,Pwm,Last_bias; Bias=Encoder-Target;//计算偏差 Pwm+=SKp*(Bias-Last_bias)+SKi*Bias;//增量式PI控制器 Last_bias=Bias; //保存上一次偏差 returnPwm;//增量输出}intSPWM=0;inttarget_v=20;intencoder_v=0;voidtimer3(){ if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET){//检查TIM3更新中断发生与否 encoder_v=get_encoder_val(); SPWM=Incremental_PI(encoder_v,target_v); if(SPWM>PWM_MAX)SPWM=PWM_MAX; elseif(SPWM<-PWM_MAX)SPWM=-PWM_MAX; set_motor_pwm(SPWM); printf("qh-0-%d,%d-ed\n",encoder_v,target_v); //key_deal(); TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx更新中断标志 }}这段代码是一个基于增量式PI控制器的控制算法,用于控制电机的转速或位置。下面我对代码进行解释:

1.`SKp`和`SKi`是浮点型变量,用于设置PI控制器中的比例增益和积分增益。

2.`Incremental_PI`函数是一个整型函数。它的参数包括`Encoder`(编码器的读数)和`Target`(目标值)。在函数内部,偏差`Bias`被计算为`Encoder-Target`。然后,根据增量式PI控制器的算法,计算出

`Pwm`

的值,公式为`Pwm

+=

SKp*(Bias-Last_bias)+

SKi*Bias`,其中

`Last_bias`

是上一次的偏差。最后,将增量输出

`Pwm`

返回。

3.`SPWM`、`target_v`、`encoder_v`

是三个整型变量。`SPWM`

用于保存通过PI控制器计算得到的PWM输出值,`target_v`

是设定的目标速度或位置,`encoder_v`

是当前的编码器读数。

4.`timer3`

函数是一个中断处理函数,它用于处理定时器TIM3的更新中断。在函数内部,首先检测TIM3的更新中断是否发生,如果发生,则执行以下操作:

使用`get_encoder_val()`函数获取当前编码器的读数,并将其保存在`encoder_v`中。调用`Incremental_PI`函数,计算得到的增量输出值,并将其保存在`SPWM`中。通过条件判断,限制SPWM在一定的范围内,防止输出过大或过小。使用`set_motor_pwm(SPWM)`函数设置电机的PWM输出值。使用`printf`函数输出当前的编码器值和目标值。最后,清除TIM的更新中断标志。

总体来说,这段代码实现了一个基于增量式PI控制器的电机控制算法。它通过对编码器读数和目标值之间的差异进行运算,得到一个PWM输出值,用于控制电机的转速或位置。在

`timer3`

函数中,该算法被调用,并与定时器中断结合使用,以实现实时控制和反馈。 motor_init(); encoder_init(); key_init(); IIC_Init(); OLED_Init(); OLED_CLS(); OLED_P8x16Str(0,0,"TAR:");OLED_P8x16Num(48,0,target_v,0); OLED_P8x16Str(0,2,"CUR:");OLED_P8x16Num(48,2,encoder_v,0); OLED_P8x16Str(0,4,"P:");OLED_P8x16Num(48,4,SKp,2); OLED_P8x16Str(0,6,"I:");OLED_P8x16Num(48,6,SKi,2); TIM_ms_Init(TIM3,100,TIM_IT_Update,2,ENABLE); TIMER_CallbackInstall(HW_TIMER3,timer3);while(1){ PCout(13)=!PCout(13); OLED_P8x16Str(0,0,"TAR:");OLED_P8x16Num(48,0,target_v,0); OLED_P8x16Str(0,2,"CUR:");OLED_P8x16Num(48,2,encoder_v,0); OLED_P8x16Str(0,4,"P:");OLED_P8x16Num(48,4,SKp,2); OLED_P8x16Str(0,6,"I:");OLED_P8x16Num(48,6,SKi,2); }这段代码是用于初始化和控制OLED显示屏以及定时器的部分,下面我来解释一下其中的细节:

1.`motor_init()`是一个函数用于初始化电机的相关设置和配置。它可能包括GPIO的初始化、PWM的初始化等。

2.`encoder_init()`是一个函数用于初始化编码器的相关设置和配置。它可能包括GPIO的初始化、外部中断的配置等。

3.`key_init()`是一个函数用于初始化按键的相关设置和配置。它可能包括GPIO的初始化、外部中断的配置等。

4.`IIC_Init()`是一个函数用于初始化I2C总线的相关设置和配置。

5.`OLED_Init()`是一个函数用于初始化OLED显示屏的相关设置和配置。

6.`OLED_CLS()`是一个函数用于清空OLED屏幕的显示内容。

7.`OLED_P8x16Str()`和`OLED_P8x16Num()`是用于在OLED屏幕上显示字符串和数字的函数。

8.`TIM_ms_Init()`是一个函数用于初始化定时器的相关设置和配置。它可以设置定时器的时钟源、计数周期等。这里是使用定时器TIM3,设置为每100ms触发一次。

9.`TIMER_CallbackInstall()`是一个函数用于安装定时器中断的回调函数。这里将

`timer3`

函数作为定时器中断的回调函数。

10.`while(1)`是一个无限循环。在循环中,`PCout(13)=

!PCout(13);`

可能是用于控制GPIO口的输出,进行闪烁的效果。

11.在每次循环中,通过`OLED_P8x16Str()`和

`OLED_P8x16Num()`

函数,更新OLED屏幕上显示的内容,包括目标值、编码器值、SKp和SKi的值。

总体来说,这段代码主要用于初始化各个模块的配置,然后进入一个无限循环,在循环中更新OLED屏幕的显示内容。定时器被配置为每100ms触发一次中断,通过回调函数

`timer3`

进行相应的操作和处理。同时,通过对GPIO的控制,实现了一个LED的闪烁效果。五.实物展示5.1样品正面5.2样品反面六.课程设计总结在完成基于STM32的PID闭环控制调速系统的课程设计过程中,我收获了很多经验和知识。首先,学习了STM32单片机的基本使用和编程方法,了解了单片机的工作原理和相关的控制原理。其次,通过实际操作和调试,深刻理解了PID控制算法的原理和实现方法。最后,通过与电机的结合,实现了一个具有调速功能的闭环控制系统。

在实施课程设计的过程中,首先进行了软硬件的设计和搭建。我学会了如何使用Keil和STM32CubeMX软件进行代码编写和配置。通过对STM32F103C8T6单片机的了解和学习,我完成了相关的硬件设计,包括电机驱动电路的搭建和与STM32单片机的连接。

接下来,我根据PID控制算法的原理和公式,对代码进行编写和调试。我先理解了P、I、D三个参数的含义和作用,然后根据具体的要求和系统特点,调整了参数的大小。通过不断的调试和优化,最终实现了一个稳定、快速的闭环控制系统。

在整个实施过程中,我也遇到了一些问题和挑战。例如,初始时电机的转速波动较大,导致PID算法调节出现问题。通过分析和调试,我发现是传感器信号不稳定,导致反馈信号有误差。我重新检查了电路连接,并增加了一些滤波电路,最终解决了问题。

通过这次课程设计,我不仅加深了对单片机和控制算法的理解,还培养了自己的动手实践能力和解决问题的能力。我学会了如何将理论知识应用到实际中,并通过不断调试和优化,最终实现了一个满意的控制系统。

总的来说,基于STM32的PID闭环控制调速系统的课程设计让我收获了很多。通过实践操作和调试,我不仅学到了专业知识,还提高了实际操作和解决问题的能力。这对我今后的学习和工作都具有重要意义。我相信这次经历将成为我未来发展的基石,帮助我更好地应对实际工程中的挑战和问题。附录#include"sysinc.h"#include"motor.h"#include"encoder.h"voidkey_deal(void);voidkey_init(void);intPWM_MAX=9000;/***@function增量PI控制器*@param[in]Encoder编码器测量值,目标速度*@param[in]Target目标速度*@retvalpwm计算出的PWM值,代表增量输出*@node增量式离散PID公式pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]*@nodee(k)代表本次偏差*@nodee(k-1)代表上一次的偏差*@nodee(k-2)代表上上次的偏差*@node速度控制闭环系统里面,只使用PI控制pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)*/floatSKp=5,SKi=10; intIncremental_PI(intEncoder,intTarget){ staticintBias,Pwm,Last_bias; Bias=Encoder-Target;//计算偏差 Pwm+=SKp*(Bias-Last_bias)+SKi*Bias;//增量式PI控制器 Last_bias=Bias; //保存上一次偏差 returnPwm;//增量输出}intSPWM=0;inttarget_v=20;intencoder_v=0;voidtimer3(){ if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET){//检查TIM3更新中断发生与否 encoder_v=get_encoder_val(); SPWM=Incremental_PI(encoder_v,target_v); if(SPWM>PWM_MAX)SPWM=PWM_MAX; elseif(SPWM<-PWM_MAX)SPWM=-PWM_MAX; set_motor_pwm(SPWM); printf("qh-0-%d,%d-ed\n",encoder_v,target_v); //key_deal(); TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx更新中断标志 }}u8flag_rev=0;//串口中断接收标志位u8flag_rev_num=0;//串口数据索引u8rxbuf[55]={1,9,3,4};//串口中断接收数据BUFF//串口中断函数voiduart1(uint16_tRes);intmain(void){ NVIC_init(); SYSTICK_DelayInit(); //延时函数初始化 GPIO_QuickInit(HW_GPIOC,GPIO_Pin_13,GPIO_Mode_Out_PP);//初始化与LED连接的硬件接口 UART_QuickInit(HW_UART1,115200,2,2,ENABLE); UART_CallbackInstall(HW_UART1,uart1);//串口中断函数注册 motor_init(); encoder_init(); key_init(); IIC_Init(); OLED_Init(); OLED_CLS(); OLED_P8x16Str(0,0,"TAR:");OLED_P8x16Num(48,0,target_v,0); OLED_P8x16Str(0,2,"CUR:");OLED_P8x16Num(48,2,encoder_v,0); OLED_P8x16Str(0,4,"P:");OLED_P8x16Num(48,4,SKp,2); OLED_P8x16Str(0,6,"I:");OLED_P8x16Num(48,6,SKi,2); TIM_ms_Init(TIM3,100,TIM_IT_Update,2,ENABLE); TIMER_CallbackInstall(HW_TIMER3,timer3); while(1){ PCout(13)=!PCout(13); OLED_P8x16Str(0,0,"TAR:");OLED_P8x16Num(48,0,target_v,0); OLED_P8x16Str(0,2,"CUR:");OLED_P8x16Num(48,2,encoder_v,0); OLED_P8x16Str(0,4,"P:");OLED_P8x16Num(48,4,SKp,2); OLED_P8x16Str(0,6,"I:");OLED_P8x16Num(48,6,SKi,2); }}//字符串转数字函数floatgetNum(u8rb[]){ floatdata=0; inti; for(i=0;i<8;i++){ if(i==0&&rb[i]=='-')continue; if(rb[i]!='.'&&rb[i]!=121&&rb[i]!=','){ data=(data)*10+rb[i]-48; }else{ break; } } if(rb[i]=='.'){data=(data*10+rb[i+1]-48)/10;} if(rb[0]=='-'){data=-1*data;} returndata;}//字符串中得到PID函数voidgetPID(){ u8i=0;flag_rev_num=5; u8buf[15]; for(i=0;i<15&&rxbuf[4]=='-';i++){ buf[i]=121;buf[i+1]=121;buf[i+2]=121; buf[i]=rxbuf[flag_rev_num];flag_rev_num++; //printf("%c",buf[i]); if(rxbuf[flag_rev_num]==','){break;} } SKp=getNum(buf); if(rxbuf[flag_rev_num++]==','){ for(i=0;i<15;i++){ buf[i]=121; buf[i+1]=121;buf[i+2]=121; buf[i]=rxbuf[flag_rev_num];flag_rev_num++; printf("%c",buf[i]); if(rxbuf[flag_rev_num]==','){break;} } } SKi=getNum(buf); if(rxbuf[flag_rev_num++]==','){ for(i=0;i<15;i++){ buf[i]=121; buf[i+1]=121;buf[i+2]=121; buf[i]=rxbuf[flag_rev_num];flag_rev_num++; printf("%c",buf[i]); if(rxbuf[flag_rev_num]==','){break;} } } floatSKd=getNum(buf); if(rxbuf[flag_rev_num++]==','){ for(i=0;i<15;i++){ buf[i]=121; buf[i+1]=121;buf[i+2]=121; buf[i]=rxbuf[flag_rev_num];flag_rev_num++; printf("%c",buf[i]); if(rxbuf[flag_rev_num]==','){break;} } } target_v=getNum(buf); if(rxbuf[flag_rev_num++]==','){ for(i=0;i<15;i++){ buf[i]=121;buf[i+1]=121;buf[i+2]=121; buf[i]=rxbuf[flag_rev_num];flag_rev_num++; //printf("%c",buf[i]); if(rxbuf[flag_rev_num]=='-'){break;} } } PWM_MAX=getNum(buf); printf("qh-1-%.1f,%.1f,%.1f,%d,%d-ed",SKp,SKi,SKd,target_v,PWM_MAX); OLED_P8x16Str(0,0,"TAR:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论