您当前的位置:首页 > 科普小常识 > 正文

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

关于【11年郑州日产奥丁什么样】,08款日产奥丁,今天犇涌小编给您分享一下,如果对您有所帮助别忘了关注本站哦。

内容导航:1、stm32做PID算法控制减速直流电机2、11年郑州日产奥丁什么样3、郑州日产奥丁和帕拉丁哪个好4、郑州日产奥丁是什么类型的车?

1、stm32做PID算法控制减速直流电机

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

基于PID的减速电机控制

一、 硬件模块与原理图

1、硬件组成

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

图片如下:

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

2、模块分析

1、L298N电机驱动模块

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

11年郑州日产奥丁什么样,08款日产奥丁(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的转动逻辑图:

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

2、0.96寸OLED(I2C通讯)

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

11年郑州日产奥丁什么样,08款日产奥丁(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 写时序:

11年郑州日产奥丁什么样,08款日产奥丁(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 读时序:

11年郑州日产奥丁什么样,08款日产奥丁(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蓝牙模块

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

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

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

串口通讯协议:

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

具体如图所示:

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

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

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

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

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

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

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

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

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

二、CubexMX设置

使用的MCU为stm32f103c8t6:

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

RCC:

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

SYS:

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

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

GPIO设置:

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

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

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

定时3:PWM调节

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

I2C:

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

USART1:

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

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

三、代码

自动生成的:

11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)

需要自己编写的:

11年郑州日产奥丁什么样,08款日产奥丁(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) 从而得出式子:

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

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

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

11年郑州日产奥丁什么样,08款日产奥丁(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、11年郑州日产奥丁什么样

东风日产的奥丁性价比不高,日常的维修保养费用成本高且油耗相比同价位并不少。奥丁的推出是郑州日产深化双品牌战略的一个重要举措,虽然奥丁来自于帕拉丁的平台,并且从图中可以看出,奥丁和帕拉丁的线条是非常接近的,但奥丁和帕拉丁相比其还是有很多的不同,后期客户反响也不是很好。

喷油器都是进口博士品牌的,照说应该很耐用,有的客户反映车才一年零两个月行驶3.5万公里,喷油器就损坏一个,到维修站后被告知高压油泵,喷油器损坏是因油品问题,不在保修之列。日产奥丁是郑州日产在帕拉丁的基础上改造完成,不仅用的是帕拉丁的生产平台,而且外形也像极了他的前辈,奥丁共有三款发动机,其中编号为QD32T的柴油3.2L发动机是全进口日产的产品,其他2款则分别有东风和沈航制造,停产的原因是性价比太低,不符合消费。

3、郑州日产奥丁和帕拉丁哪个好

询问: 日产和奥丁有什么区别? 回答: 1.帕拉丁发动机是进口KA24发动机,奥丁是4G64S4M发动机(应该是三菱系列国产),奥丁也有2.5柴油发动机; 2.四驱系统不一样。圣骑士应该是纯机械的两档四驱。

除了logo,车顶行李架和行李架是不一样的。 4.中控略有不同。 5.奥丁只有4驱柴油和2驱汽油; 6.前后 悬挂 不同,车身结构不同; 7360奥丁发动机和圣骑士发动机最大的区别就是有国产发动机和进口发动机,所以两款发动机价格相差很大。不过最近郑州日产新奥丁听说更换ZD30柴油发动机的动力肯定比帕拉丁KA24汽油发动机强很多。

只要感觉不太吵,动力就很大。另外奥丁的电子兼职四驱改成了和圣骑士一样的机械四驱,只不过分动箱是国产的,后悬挂奥丁是弹簧,圣骑士是钢板弹簧。如果新奥丁zd30柴油发动机搭配机械兼职四驱,我个人觉得还是很刺激的。

毕竟汽油机的动力还是太弱了。不过进口圣骑士零件的耐用性肯定比国产奥丁好。 8360越野性能,圣骑士Mobile可以直接改成四驱高速不超过50km。

4、郑州日产奥丁是什么类型的车?

记者从2007上海国际车展上获悉,在上月被定位为NISSAN品牌 LCV(轻型商用车)主要发展基地的郑州日产,将于今年8月份推出SUV“奥丁”。这款秉承帕拉丁达喀尔基因、在帕拉丁平台上开发的更具城市化特性的中级SUV,将以较高的性价比冲击并有望改写现有的市场格局,必将成为都市新生力量。

去年,郑州日产在NISSAN D22高档汽油皮卡的基础上,研发出柴油版东风锐骐系列中高级皮卡,在市场上一举成功。该车型为去年郑州日产的产销量由2万辆升至3万辆,起到了关键作用。日产、东风两个股东因此深受鼓舞,加强了对郑州日产的支持力度。郑州日产深信,SUV“奥丁”将与MPV“御轩”一起,为郑州日产实现今年的4万辆产销目标起到重大支撑作用。

据悉,“奥丁”系列车型将不少于6款,价格区间初步定在13万至18万元之间。“奥丁”今年的销量目标是8000辆左右。根据全国乘用车市场信息联席会的统计结果,2004年至2006年,国产SUV的总销量逐年增加,由17.2万辆发展到22.8万辆,年均增加量不少于2万辆;估计今年的总销量将接近26万辆。

据郑州日产分析,自2004年以来,城市型SUV骤然兴起,成为SUV市场的主流产品,具有典型城市化特征的“奥丁”由帕拉丁脱胎而来,既能有效地利用帕拉丁的技术资源,而且还能通过差异化抢占中级SUV市场份额,并发展自主品牌,提高创新能力,是一个一举多得的好事情。与帕拉丁相比,“奥丁”有五大变化。其一,帕拉丁的发动机只有2.4升和3.3升两种排量,且全为原装进口汽油机,而“奥丁”则有2.4升、3.0升和3.2升等3种国产和进口的汽、柴油发动机可供匹配。

其二,“奥丁”的前悬挂承袭了帕拉丁的双叉臂独立式,而后悬挂则改为五连杆螺旋弹簧非独立式,提高了舒适性。其三,“奥丁”既有3.0升柴油机配手动变速器的车型,也有2.4升汽油机配自动变速器的车型,两款发动机的扭矩都相当出色,数值分别为235N•m/2200rpm和196N•m/2500rpm。其四,“奥丁”具备了典型的城市型SUV的特征,如两驱自动档、电子四驱转换、外观造型等更适合城市使用,可视倒车雷达、电子指南针等都可选装。

其五,价格较低,扩展了帕拉丁平台上SUV价格区间。当然,出自同门,“奥丁”身上也有五处不变的东西。其一,高可靠性、高品质不会变。“奥丁”与帕拉丁共线生产,采用相同的质量保障体系。

其二.达喀尔拉力赛凝结在帕拉丁身上“挑战无限”的基因没有变。卓越的可靠性是“奥丁”继承帕拉丁达喀尔基因的基础,优秀的越野性能是其第二个条件。有两款“奥丁”的爬坡度达到了78%。其三,经济省油的长处没有变。

“奥丁”所有车型的等速百公里油耗均在8升以下。两款柴油发动机不仅运行安静,扭力突出,节油能力也相当高。其四,出色的操控性和安全性没有降低。其五,销售服务网络与帕拉丁没有区别,“奥丁”将享受到与帕拉丁同样的服务。

本文关键词:东风日产奥丁09款,08款日产奥丁,08年日产奥丁,郑州日产奥丁是前驱还是后驱,日产奥丁二手车。这就是关于《11年郑州日产奥丁什么样,08款日产奥丁(stm32做PID算法控制减速直流电机)》的所有内容,希望对您能有所帮助!


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 明朝的首都在哪里,明朝的首都是什么地方(明朝自己都纠结了五代人)

下一篇: qq飞车大恶魔,QQ飞车开什么能开到更名卡(B车蓝魔鬼跑11城用了2分06秒)



推荐阅读