当前位置: > 投稿>正文

gti所有车型,stm32做PID算法控制减速直流电机

04-04 互联网 未知 投稿

关于【gti所有车型】,今天涌涌小编给您分享一下,如果对您有所帮助别忘了关注本站哦。

1、gti所有车型:stm32做PID算法控制减速直流电机

本例程采用了HAL库进行项目开发(主要使用软件CubexMX和keil5),文章末尾会有代码开源,欢迎各位对文章进行指正和探讨。

基于PID的减速电机控制","content"

一、 硬件模块与原理图","content"

1、硬件组成","content"

硬件组成:stm32f103c8t6最小系统板;0.96寸LED12864(I2C通讯模式);智能小车12v移动电源;25GA370直流减速电机(带霍尔编码器);JDY-31蓝牙模块;L298N电机驱动模块;杜邦线若干;1个面包板;

图片如下:

gti所有车型,stm32做PID算法控制减速直流电机

2、模块分析","content"

1、L298N电机驱动模块","content"

gti所有车型,stm32做PID算法控制减速直流电机

gti所有车型,stm32做PID算法控制减速直流电机

1.模块可驱动两路直流电机,输出A和B各接一直流电机即可;

2.若使用12V供电,将12V供电端口及GND接上电源正负即可,同时5V供电端可以作为最小系统板的输入电源;

3.若不需要使用PWM调速,只需要控制电机正反转,则逻辑A与B跳线帽插上即可,相当于始终使能;

4.若需要使用PWM调速,需将跳线帽拔起,将使能端接上单片机IO口。(定时器IO口,PWM输出模式);

5.逻辑输入四个端口IN1、IN2、IN3、IN4接单片机四个IO口,每两个端口控制的一路电机。

温馨提示:特别不建议新手或者资金有限的情况下,使用电机驱动模块直连成品开发板,很容易烧坏。

原因:(1) 由于电机的特性,电机在堵转或者高负载下,电流会增大,可能会影响到单片机。(2)新手玩单片机可能出现短路等情况,很容易板子冒烟;

L298N的转动逻辑图:

gti所有车型,stm32做PID算法控制减速直流电机

2、0.96寸OLED(I2C通讯)","content"

gti所有车型,stm32做PID算法控制减速直流电机

gti所有车型,stm32做PID算法控制减速直流电机

(1)目前市面主要分为OLED与LCD这2种屏幕;

(2)OLED自发光特性,LCD都要背光,而OLED不需要,因为它是自发光。这样同样的显示,OLED效果要来得好一些;

(3)多种接口方式:6800,8080两种并行接口方式,4线的穿行SPI接口,IIC接口方式(2线);

(4)不要接过高电压,3.3V就可以正常工作了;

(5)OLED不足之处是做大之后成本较高。

本实验采用了0.96寸OLED的屏幕(通讯方式IIC),4个接线柱(SCL,SDA,GND,VCC); IIC通讯实现方式: IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。高速 IIC 总线一般可达 400kbps 以上。

模拟IIC通讯:

I2C 是支持多从机的,也就是一个 I2C 控制器下可以挂多个 I2C 从设备,这些不同的 I2C从设备有不同的器件地址,这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C设备了。SDA 和SCL 这两根线必须要接一个上拉电阻,一般是 4.7K。其余的 I2C 从器件都挂接到 SDA 和 SCL 这两根线上,这样就可以通过 SDA 和 SCL 这两根线来访问多个 I2C设备。

I2C 协议:(1)起始位;(2)停止位;(3)数据传输;(4)应答信号;(5)I2C 写时序;(6)I2C 读时序

I2C 写时序:

gti所有车型,stm32做PID算法控制减速直流电机

1)、开始信号。

2)、发送 I2C 设备地址,每个 I2C 器件都有一个设备地址,通过发送具体的设备地址来决

定访问哪个 I2C 器件。这是一个 8 位的数据,其中高 7 位是设备地址,最后 1 位是读写位,为

1 的话表示这是一个读操作,为 0 的话表示这是一个写操作。

3)、 I2C 器件地址后面跟着一个读写位,为 0 表示写操作,为 1 表示读操作。

4)、从机发送的 ACK 应答信号。

5)、重新发送开始信号。

6)、发送要写写入数据的寄存器地址。

7)、从机发送的 ACK 应答信号。

8)、发送要写入寄存器的数据。

9)、从机发送的 ACK 应答信号。

10)、停止信号。

I2C 读时序:

gti所有车型,stm32做PID算法控制减速直流电机

I2C 单字节读时序比写时序要复杂一点,读时序分为 4 大步,第一步是发送设备地址,第二步是发送要读取的寄存器地址,第三步重新发送设备地址,最后一步就是 I2C 从器件输出要读取的寄存器值,我们具体来看一下这几步。

1)、主机发送起始信号。

2)、主机发送要读取的 I2C 从设备地址。

3)、读写控制位,因为是向 I2C 从设备发送数据,因此是写信号。

4)、从机发送的 ACK 应答信号。

5)、重新发送 START 信号。

6)、主机发送要读取的寄存器地址。

7)、从机发送的 ACK 应答信号。

8)、重新发送 START 信号。

9)、重新发送要读取的 I2C 从设备地址。

10)、读写控制位,这里是读信号,表示接下来是从 I2C 从设备里面读取数据。

11)、从机发送的 ACK 应答信号。

12)、从 I2C 器件里面读取到的数据。

13)、主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了。

14)、主机发出 STOP 信号,停止 I2C 通信。

3、JDY-31蓝牙模块","content"

gti所有车型,stm32做PID算法控制减速直流电机

gti所有车型,stm32做PID算法控制减速直流电机

市场上蓝牙模块有很多,常见的JDY-xx,HC-xx等系列。其实看似高级的蓝牙功能背后就是简单的串口通讯

USART 的全称是 Universal Synchronous/Asynchronous Receiver/Transmitter,也就是同步/异步串行收发器。相比 UART 多了一个同步的功能,在硬件上体现出来的就是多了一条时钟线。一般 USART 是可以作为 UART 使用的,也就是不使用其同步的功能。

串口通讯协议:

数据包:串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备得RXD接口,在协议层中规定了数据包的内容,具体包括起始位、主体数据(8位或9位)、校验位以及停止位,通讯的双方必须将数据包的格式约定一致才能正常收发数据。

具体如图所示:

gti所有车型,stm32做PID算法控制减速直流电机

波特率:由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有4800、9600、115200等。STM32中波特率的设置通过串口初始化结构体来实现。

注意:MCU设置的波特率大小要与蓝牙APP设置的大小一致!

4、6线减速电机(带编码器)模块:

市面上电机有很多,常用的有步进电机,直流减速电机,伺服电机等等; 编码器:用来测量电机转速的仪器元件,常见的有:霍尔编码器,光电编码器等 电机的驱动原理很简单,给电压差即可使得电机转动,调速则利用PWM调节发。

gti所有车型,stm32做PID算法控制减速直流电机

编码器原理: 编码器是一种将角位移或者角速度转换成一串电数字脉冲的旋转式传感器。 编码器工作原理: 霍尔编码器是有霍尔马盘和霍尔元件组成。霍尔马盘是在一定直径的圆板上等分的布置有不同的磁极。霍尔马盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。

gti所有车型,stm32做PID算法控制减速直流电机

gti所有车型,stm32做PID算法控制减速直流电机

注意:通过判断A与B相哪一位在前,即可判断出正转还是反转

二、CubexMX设置","content"

使用的MCU为stm32f103c8t6:

gti所有车型,stm32做PID算法控制减速直流电机

RCC:

gti所有车型,stm32做PID算法控制减速直流电机

SYS:

gti所有车型,stm32做PID算法控制减速直流电机

注意:Debug这里一定要设置成Serial Wire否则可能出现芯片自锁

GPIO设置:

gti所有车型,stm32做PID算法控制减速直流电机

定时TIM2用来测速与测量正转反转(计数器模式)

gti所有车型,stm32做PID算法控制减速直流电机

定时3:PWM调节

gti所有车型,stm32做PID算法控制减速直流电机

I2C:

gti所有车型,stm32做PID算法控制减速直流电机

USART1:

gti所有车型,stm32做PID算法控制减速直流电机

之后按照自己习惯生成初始化文件

三、代码","content"

自动生成的:

gti所有车型,stm32做PID算法控制减速直流电机

需要自己编写的:

gti所有车型,stm32做PID算法控制减速直流电机

I2C代码:

#include "oled.h"#include "asc.h"#include "main.h"void WriteCmd(unsigned char I2C_Command)//??? {HAL_I2C_Mem_Write(&hi2c2,OLED0561_ADD,COM,I2C_MEMADD_SIZE_8BIT,&I2C_Command,1,100); }void WriteDat(unsigned char I2C_Data)//??? {HAL_I2C_Mem_Write(&hi2c2,OLED0561_ADD,DAT,I2C_MEMADD_SIZE_8BIT,&I2C_Data,1,100); }void OLED_Init(void){HAL_Delay(100); //????????WriteCmd(0xAE); //display offWriteCmd(0x20);//Set Memory Addressing ModeWriteCmd(0x10);//00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,InvalidWriteCmd(0xb0);//Set Page Start Address for Page Addressing Mode,0-7WriteCmd(0xc8);//Set COM Output Scan DirectionWriteCmd(0x00); //---set low column addressWriteCmd(0x10); //---set high column addressWriteCmd(0x40); //--set start line addressWriteCmd(0x81); //--set contrast control registerWriteCmd(0xff); //???? 0x00~0xffWriteCmd(0xa1); //--set segment re-map 0 to 127WriteCmd(0xa6); //--set normal displayWriteCmd(0xa8); //--set multiplex ratio(1 to 64)WriteCmd(0x3F); //WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM contentWriteCmd(0xd3); //-set display offsetWriteCmd(0x00); //-not offsetWriteCmd(0xd5); //--set display clock divide ratio/oscillator frequencyWriteCmd(0xf0); //--set divide ratioWriteCmd(0xd9); //--set pre-charge periodWriteCmd(0x22); //WriteCmd(0xda); //--set com pins hardware configurationWriteCmd(0x12);WriteCmd(0xdb); //--set vcomhWriteCmd(0x20); //0x20,0.77xVccWriteCmd(0x8d); //--set DC-DC enableWriteCmd(0x14); //WriteCmd(0xaf); //--turn on oled panel} void OLED_SetPos(unsigned char x, unsigned char y) //???????{ WriteCmd(0xb0+y);WriteCmd(((x&0xf0)>>4)|0x10);WriteCmd((x&0x0f)|0x01);} void OLED_Fill(unsigned char fill_Data)//????{unsigned char m,n;for(m=0;m<8;m++){WriteCmd(0xb0+m);//page0-page1WriteCmd(0x00);//low column start addressWriteCmd(0x10);//high column start addressfor(n=0;n<128;n++){WriteDat(fill_Data);}}} void OLED_CLS(void)//??{OLED_Fill(0x00);} void OLED_ON(void){WriteCmd(0X8D); //?????WriteCmd(0X14); //?????WriteCmd(0XAF); //OLED??} void OLED_OFF(void){WriteCmd(0X8D); //?????WriteCmd(0X10); //?????WriteCmd(0XAE); //OLED??} // Parameters : x,y -- ?????(x:0~127, y:0~7); ch[] -- ???????; TextSize -- ????(1:6*8 ; 2:8*16)// Description : ??codetab.h??ASCII??,?6*8?8*16???void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize){unsigned char c = 0,i = 0,j = 0;switch(TextSize){case 1:{while(ch[j] != '\0'){c = ch[j] - 32;if(x > 126){x = 0;y++;}OLED_SetPos(x,y);for(i=0;i<6;i++)WriteDat(F6x8[c][i]);x += 6;j++;}}break;case 2:{while(ch[j] != '\0'){c = ch[j] - 32;if(x > 120){x = 0;y++;}OLED_SetPos(x,y);for(i=0;i<8;i++)WriteDat(F8X16[c*16+i]);OLED_SetPos(x,y+1);for(i=0;i<8;i++)WriteDat(F8X16[c*16+i+8]);x += 8;j++;}}break;}} // Parameters : x,y -- ?????(x:0~127, y:0~7); N:???.h????// Description : ??ASCII_8x16.h????,16*16??void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N){unsigned char wm=0;unsigned int adder=32*N;OLED_SetPos(x , y);for(wm = 0;wm < 16;wm++){WriteDat(F16x16[adder]);adder += 1;}OLED_SetPos(x,y + 1);for(wm = 0;wm < 16;wm++){WriteDat(F16x16[adder]);adder += 1;}} // ????????????????,????????“??——???——????”??????ascll.h?????(????)//???????:x:????? //y:???(??0-7) //begin:????????????????ascll.c??????? // num:????????// ????“??”,??????????????????0,1,???0,??????,??:x:0,y:2,begin:0,num:2void OLED_ShowCN_STR(u8 x , u8 y , u8 begin , u8 num){u8 i;for(i=0;i<num;i++){OLED_ShowCN(i*16+x,y,i+begin);} //OLED????} // Parameters : x0,y0 -- ?????(x0:0~127, y0:0~7); x1,y1 -- ?????(???)???(x1:1~128,y1:1~8)// Description : ??BMP??void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]){unsigned int j=0;unsigned char x,y; if(y1%8==0)y = y1/8; elsey = y1/8 + 1;for(y=y0;y<y1;y++){OLED_SetPos(x0,y); for(x=x0;x<x1;x++){WriteDat(BMP[j++]);}}} void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size){ unsigned char c=0,i=0;c=chr-' ';//???????if(x>128-1){x=0;y=y+2;}if(Char_Size ==16){OLED_SetPos(x,y);for(i=0;i<8;i++)WriteDat(F8X16[c*16+i]);OLED_SetPos(x,y+1);for(i=0;i<8;i++)WriteDat(F8X16[c*16+i+8]);}else {OLED_SetPos(x,y);for(i=0;i<6;i++)WriteDat(F6x8[c][i]);}}u32 oled_pow(u8 m,u8 n){u32 result=1; while(n--)result*=m; return result;}//??2???//x,y :???? //len :?????//size:????//mode:??0,????;1,????//num:??(0~4294967295); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2){ u8 t,temp;u8 enshow=0; for(t=0;t<len;t++){temp=(num/oled_pow(10,len-t-1))%10;if(enshow==0&&t<(len-1)){if(temp==0){OLED_ShowChar(x+(size2/2)*t,y,' ',size2);continue;}else enshow=1; } OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); }}

UART代码:

#include "uart.h" uint8_t USART1_RX_BUF[USART1_REC_LEN];//????,??USART_REC_LEN???.uint16_t USART1_RX_STA=0;//??????//bit15:??????,bit14~0:??????????uint8_t USART1_NewData;//?????????1???????? extern int flag; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//????????{ if(huart ==&huart1) { if((USART1_RX_STA&0x8000)==0)//????? { if(USART1_NewData==0x5A)//????0x5A { USART1_RX_STA|=0x8000; //?????,?USART2_RX_STA??bit15(15?)?1 } else { USART1_RX_BUF[USART1_RX_STA&0X7FFF]=USART1_NewData; if(USART1_RX_BUF[1] == 0x01){flag = 2;} USART1_RX_STA++; //???????1 if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//??????,?????? } } HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1); }}

常规的编写如上,但是本人的MCU存在问题,单片机并未接收到预设的数据。

所以,本人项目中采用了下方代码:

#include "uart.h" uint8_t USART1_RX_BUF[USART1_REC_LEN];//????,??USART_REC_LEN???.uint16_t USART1_RX_STA=0;//??????//bit15:??????,bit14~0:??????????uint8_t USART1_NewData;//?????????1???????? extern int flag; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//????????{ if(huart ==&huart1) { USART1_RX_BUF[USART1_RX_STA&0X7FFF]=USART1_NewData; USART1_RX_STA++; //???????1 if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//??????,??????if(USART1_RX_BUF[USART1_RX_STA-4] == 0xA0){flag = 1;}if(USART1_RX_BUF[USART1_RX_STA-4] == 0x90){flag = 2;}if(USART1_RX_BUF[USART1_RX_STA-4] == 0xD0){flag = 3;}if(USART1_RX_BUF[USART1_RX_STA-4] == 0x88){flag = 4;}if(USART1_RX_BUF[USART1_RX_STA-4] == 0x48){flag = 5;} HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1); }}

如果大家自己使用的花,可以根据自己的蓝牙APP写这段程序,有问题欢迎留言

Motor代码:

#include "motor.h" void MOTOR_GO(){__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1,3000);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);} void MOTOR_BACK(){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);} void MOTOR_STOP(){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);} void MOTOR_UP(){__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1,1);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);} void MOTOR_DOWN(){__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1,400);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);}

PID:

PID算法:

PID分为位置型和增量型

增量型即通过 u(k)-u(k-1) 从而得出式子:

公式的第一部分是比例式 是为了让值按一定比例达到目标值;

第二部分是积分值,正值,在计算的过程中往往会受到环境等一些其他因素的影响,导致值不能到达目标值;

第三部分是微分值,通常是负值,后一次偏差值往往小于前一次偏差值,目的是为了防止值增加过大,通常起一个阻碍的作用;

gti所有车型,stm32做PID算法控制减速直流电机

PID代码:

#include "pid.h"#include "tim.h"#include "main.h"#include "math.h"#include "i2c.h"#include "oled.h" unsigned int MotorSpeed;//È«¾Ö±äÁ¿£¬µç»úµ±Ç°×ªËÙint SpeedTarget = 750;//Ä¿±êתËÙint MotorOutput;//µç»úÊä³ö //1.ÀûÓÃTIM2¼ÆËãµç»úתËÙ void GetMotorSpeed(void){//int CaptureNumber =(short)__HAL_TIM_GET_COUNTER(&htim2); //HAL¿âº¯Êý¼ÆËãÂö³å´ÎÊý//////µç»úתËÙת»»Speed=1sÄÚµÄÂö³åÊý/44(һȦ11¸öÐźţ¬4±¶Æµ·¨)/34¼õËÙ±È//int MotorSpeed=CaptureNumber*20/44/34*2*3.14*3;//OLED_ShowNum(40,0,MotorSpeed,4,16);////__HAL_TIM_GET_COUNTER(&htim2) = 0;//¼ÆÊýÆ÷ÇåÁãint CaptureNumber =(short)__HAL_TIM_GET_COUNTER(&htim2); //???????__HAL_TIM_GET_COUNTER(&htim2) = 0;//int Speed=CaptureNumber*5/44/34*2*3.14*3; int Direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2); if(Direction == 1){CaptureNumber -= 65535;}MotorSpeed=CaptureNumber;OLED_ShowNum(40,0,MotorSpeed,4,16);HAL_Delay(100);OLED_CLS();//__HAL_TIM_GET_COUNTER(&htim2) = 0;} //2.ÔöÁ¿Ê½PID¿ØÖÆÆ÷£¨PID³£¼û·ÖΪλÖÃPIDºÍÔöÁ¿Ê½PID£© int Error_Last,Error_Prev;//ÉÏ´ÎÎó²î£¬ÉÏÉÏ´ÎÎó²îint Pwm_add,Pwm;//PWMÔöÁ¿,PWMÕ¼¿Õ±È int Kp = 5, Ki = 3, Kd = 1;//PIDË㷨ϵÊý£¬¸¡µãÀàÐÍ£¬Ð¾Æ¬¼ÆËãÄÜÁ¦Ò»°ãʱ½¨ÒéÕûÐÍ£¬»òÕß*1024 int SpeedInnerControl(int Speed,int Target)//ËÙ¶ÈÄÚ»·¿ØÖÆ{ int Error = Target - Speed;//Îó²î = Ä¿±êËÙ¶È - ʵ¼ÊËÙ¶È Pwm_add = Kp * (Error - Error_Last) + //±ÈÀýKi * Error +//»ý·ÖKd * (Error - 2.0f * Error_Last + Error_Prev);//΢·Ö Pwm += Pwm_add;//Êä³öÁ¿=ԭʼÁ¿+ÔöÁ¿Error_Prev = Error_Last;//±£´æÉÏÉÏ´ÎÎó²î Error_Last = Error;//±£´æÉÏ´ÎÎó²î if(Pwm > 4999) Pwm = 3000;//ÏÞÖÆÉÏÏÂÏÞ£¬·ÀÖ¹PWM³¬³öÁ¿³Ì if(Pwm <-4999) Pwm =-3000; return Pwm;//·µ»ØÊä³öÖµ} //3.µç»úתËÙÓë·½ÏòµÄº¯Êý£¨PID¿ØÖÆ£© void SetMotorVoltageAndDirection(int Pwm){ if(Pwm < 0)//Èç¹ûPWMСÓÚ0 { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET); Pwm = (-Pwm);//PWMÖ»ÄÜÈ¡ÕýÖµ£¬Èç¹ûΪ¸ºÊý£¬Ö±½ÓÈ¡·´ __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, Pwm);//PWMµ÷ËÙ } else {HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, Pwm);//PWMµ÷ËÙ }} void ModePID(){ GetMotorSpeed(); MotorOutput = SpeedInnerControl(MotorSpeed,SpeedTarget); SetMotorVoltageAndDirection(MotorOutput);}

主函数代码:

2、gti所有车型,GTI的同门搅局者竟然是它

[资讯-牛车网]

GTI的同门搅局者

gti所有车型,stm32做PID算法控制减速直流电机

众所周知,大众高尔夫GTI在无数车迷心中就是情怀的所在,也是很多人的向往。不得不承认,GTI的的确确是款好车,论性能论情怀,GTI都是无与伦比的。

gti所有车型,stm32做PID算法控制减速直流电机

继高尔夫GTI和明锐RS之后,大众汽车在国内再次推出了一台主打性能的国产车型:凌渡GTS。GTS最大的卖点就是在你能体验一番驾驶乐趣的同时,还兼顾了日常使用,其官方指导价格为22.89万元,比GTI官方指导价格的23.99万元还便宜了1万左右。

你可以说GTI的情怀是凌渡GTS所没法比较的,这点没错。但凌渡GTS到底何德何能可以作为搅局者的身份出现?

外观及内饰部分

gti所有车型,stm32做PID算法控制减速直流电机

凌渡GTS版本的车身尺寸比普通的凌渡几乎没有变化,依然是紧凑型车的身材,其长宽高分别为4598/1826/1425mm,轴距为2655mm。外观细节上通过增加套件,营造更为运动的视觉效果,另外红色的车漆也让它更惹眼。

gti所有车型,stm32做PID算法控制减速直流电机

前脸进气格栅呈蜂窝网状式设计,格栅下部增加了一条红白相见的直线,右侧依然标有GTS高性能版本的标志。

gti所有车型,stm32做PID算法控制减速直流电机

雾灯处同样和GTI的设计有共通之处,增加了三条黑色装饰条,底部为黑色打底。

gti所有车型,stm32做PID算法控制减速直流电机

凌渡GTS两侧底部增加黑色裙边,与头尾形成呼应。18寸轮毂放在凌度GTS身上一点也不显小,但比起GTI的战斧式轮毂造型有些平庸。

gti所有车型,stm32做PID算法控制减速直流电机

黑色后视镜、轮圈、车顶及熏黑尾灯归属于黑色造型包。

gti所有车型,stm32做PID算法控制减速直流电机

尾部相对于普通版车型增加了扰流板,底部还提供了扩散器,配上双边单出放置在“菱形”包裹的镀铬装饰筒内的排气,高性能版本被诠释的很不错。

gti所有车型,stm32做PID算法控制减速直流电机

内饰整体风格与普通版本的凌度保持一致,改变是在细节处发生,这些变化也都是为了提升凌渡GTS的运动感和GTS版本的专属感。

gti所有车型,stm32做PID算法控制减速直流电机

打开车门,车门下方有GTS版本的专属铭牌。

gti所有车型,stm32做PID算法控制减速直流电机

抬头一看,座椅靠背上有GTS三个字。

gti所有车型,stm32做PID算法控制减速直流电机

坐下一看,方向盘底部同样也有GTS版本的标识。

三幅方向盘的握感同GTI一样非常棒,方向盘上的可控制功能也非常多,并且也使用红色缝线处理,后侧也配有换挡拨片。

gti所有车型,stm32做PID算法控制减速直流电机

中控位置依然配有8英寸多媒体显示屏,搭载了MIB Standard Navi系统。凌渡GTS还配备了GTI车上的DCC驾驶模式系统,可以在经济、舒适、标准、运动以及个性化这几种模式中调节,提供不同风格的驾驶体验。

gti所有车型,stm32做PID算法控制减速直流电机

值得一提的是凌渡GTS的运动型座椅包裹非常到位,两侧凸起的材质比较柔软,整体乘坐感受非常舒服,又不缺乏对驾驶员的支撑。

gti所有车型,stm32做PID算法控制减速直流电机

gti所有车型,stm32做PID算法控制减速直流电机

后排空间与普通版车型区别很小,日常使用没有任何问题。但后排中央的突起会让坐在中间位置的乘客舒适性大打折扣。

gti所有车型,stm32做PID算法控制减速直流电机

作为又能体验一番驾驶乐趣又能宜家的车,凌渡GTS的后备箱空间还算是很实用的,日常使用及旅途放一些普通行李是没有任何问题的。

动力系统

gti所有车型,stm32做PID算法控制减速直流电机

凌渡GTS搭载的是第三代EA888 2.0T发动机,其最大功率为220马力(162千瓦)/4500-6200rpm,最大扭矩350牛·米/1500-4400rpm,其发动机配置与参数与高尔夫GTI相同。与之匹配的是代号为DQ380的7速湿式双离合变速箱,由此可以看出凌度GTS的动力配置与高尔夫GTI基本型相同。

gti所有车型,stm32做PID算法控制减速直流电机

凌渡GTS的悬挂与普通版本车型没有变化,都采用麦弗逊式独立前悬挂 多连杆式独立后悬挂,这点其实也能想到,好在配有DCC驾驶模式调节,可以根据实际使用调节悬的软硬度。

实际驾驶感受

凌渡GTS的实测百公里加速成绩为6.95秒,这点还是没能赢过高尔夫GTI的实测6.7秒。但凌渡GTS车身尺寸及重量可要比GTI大多了,我认为这个环节其实两车是打平的。

gti所有车型,stm32做PID算法控制减速直流电机

实际驾驶中,在经济和标准模式下油门的感觉都偏向保守,依旧很大众的油门调教。2000转以下感受不到动力有多强,但一旦切换到运动模式以后,凌渡GTS的油门响应立即精神起来,转速也维持在了2000转以上。普通模式下凌渡GTS的实测综合油耗为10.5L,运动模式固然很爽,但其油耗也会相应增加,燃油经济方面凌渡GTS做的还不够好。

gti所有车型,stm32做PID算法控制减速直流电机

运动模式下,踩下油门会伴随动力的输出排气传来声浪,但声浪声音还是比较小。转向系统也会变得更直接和灵敏,减振器的阻尼也会调到最硬,路面情况也直接传达到了驾驶员身上。

切换到舒适模式下,减振器的阻尼会调节到最小状态,对于路面波动的过滤表现更好。实际开起来感觉与运动模式区别真的很大,过减速带也不会很颠。舒适模式下可以说完全不像一个主打运动性能的车了。

综合来看,凌渡GTS其实竞争力还是非常高的,性价比高于高尔夫GTI。动力与高尔夫GTI相比其实真的差不多,舒适性和配置上也要优于GTI。至于外观嘛,这就仁者见仁智者见智了。如果说买高尔夫GTI是为了情怀,那么买凌渡GTS则是更兼顾了一份实用性。

(图片来源于网络)

本文关键词:gti车型有哪些,gti的,gti这车怎么样,gti图片,gti最新款。这就是关于《gti所有车型,stm32做PID算法控制减速直流电机》的所有内容,希望对您能有所帮助!更多的知识请继续关注《犇涌向乾》百科知识网站:http://www.029ztxx.com!

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。

猜你喜欢