范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  本例程采用了HAL库进行项目开发(主要使用软件CubexMX和keil5),文章末尾会有代码开源,欢迎各位对文章进行指正和探讨。 基于PID的减速电机控制一、 硬件模块与原理图1、硬件组成
  硬件组成:stm32f103c8t6最小系统板;0.96寸LED12864(I2C通讯模式);智能小车12v移动电源;25GA370直流减速电机(带霍尔编码器);JDY-31蓝牙模块;L298N电机驱动模块;杜邦线若干;1个面包板;
  图片如下:
  2、模块分析1、L298N电机驱动模块
  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的转动逻辑图:
  2、0.96寸OLED(I2C通讯)
  (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 写时序:
  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 读时序:
  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蓝牙模块
  市场上蓝牙模块有很多,常见的JDY-xx,HC-xx等系列。其实看似高级的蓝牙功能背后就是简单的 串口通讯 ;
  USART 的全称是 Universal Synchronous/Asynchronous Receiver/Transmitter,也就是同步/异步串行收发器。相比 UART 多了一个同步的功能,在硬件上体现出来的就是多了一条时钟线。一般 USART 是可以作为 UART 使用的,也就是不使用其同步的功能。
  串口通讯协议:
  数据包:串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备得RXD接口,在协议层中规定了数据包的内容,具体包括起始位、主体数据(8位或9位)、校验位以及停止位,通讯的双方必须将数据包的格式约定一致才能正常收发数据。
  具体如图所示:
  波特率:由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有4800、9600、115200等。STM32中波特率的设置通过串口初始化结构体来实现。
  注意:MCU设置的波特率大小要与蓝牙APP设置的大小一致!
  4、6线减速电机(带编码器)模块:
  市面上电机有很多,常用的有步进电机,直流减速电机,伺服电机等等; 编码器:用来测量电机转速的仪器元件,常见的有:霍尔编码器,光电编码器等 电机的驱动原理很简单,给电压差即可使得电机转动,调速则利用PWM调节发。
  编码器原理:  编码器是一种将角位移或者角速度转换成一串电数字脉冲的旋转式传感器。 编码器工作原理: 霍尔编码器是有霍尔马盘和霍尔元件组成。霍尔马盘是在一定直径的圆板上等分的布置有不同的磁极。霍尔马盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。
  注意:通过判断A与B相哪一位在前,即可判断出正转还是反转 二、CubexMX设置
  使用的MCU为stm32f103c8t6:
  RCC:
  SYS:
  注意:Debug这里一定要设置成Serial Wire否则可能出现芯片自锁
  GPIO设置:
  定时TIM2用来测速与测量正转反转(计数器模式)
  定时3:PWM调节
  I2C:
  USART1:
  之后按照自己习惯生成初始化文件 三、代码
  自动生成的:
  需要自己编写的:
  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 off 	WriteCmd(0x20);	//Set Memory Addressing Mode	 	WriteCmd(0x10);	//00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid 	WriteCmd(0xb0);	//Set Page Start Address for Page Addressing Mode,0-7 	WriteCmd(0xc8);	//Set COM Output Scan Direction 	WriteCmd(0x00); //---set low column address 	WriteCmd(0x10); //---set high column address 	WriteCmd(0x40); //--set start line address 	WriteCmd(0x81); //--set contrast control register 	WriteCmd(0xff); //???? 0x00~0xff 	WriteCmd(0xa1); //--set segment re-map 0 to 127 	WriteCmd(0xa6); //--set normal display 	WriteCmd(0xa8); //--set multiplex ratio(1 to 64) 	WriteCmd(0x3F); // 	WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content 	WriteCmd(0xd3); //-set display offset 	WriteCmd(0x00); //-not offset 	WriteCmd(0xd5); //--set display clock pide ratio/oscillator frequency 	WriteCmd(0xf0); //--set pide ratio 	WriteCmd(0xd9); //--set pre-charge period 	WriteCmd(0x22); // 	WriteCmd(0xda); //--set com pins hardware configuration 	WriteCmd(0x12); 	WriteCmd(0xdb); //--set vcomh 	WriteCmd(0x20); //0x20,0.77xVcc 	WriteCmd(0x8d); //--set DC-DC enable 	WriteCmd(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-page1 		WriteCmd(0x00);		//low column start address 		WriteCmd(0x10);		//high column start address 		for(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] != "") 			{ 				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] != "") 			{ 				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:2 void OLED_ShowCN_STR(u8 x , u8 y , u8 begin , u8 num) { 	u8 i; 	for(i=0;i128-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(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) 从而得出式子:
  公式的第一部分是比例式 是为了让值按一定比例达到目标值;
  第二部分是积分值,正值,在计算的过程中往往会受到环境等一些其他因素的影响,导致值不能到达目标值;
  第三部分是微分值,通常是负值,后一次偏差值往往小于前一次偏差值,目的是为了防止值增加过大,通常起一个阻碍的作用;
  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); }
  主函数代码: while (1)  {       		 switch(flag)         		 {     		 case(1):MOTOR_GO();break;     		 case(2):MOTOR_BACK();break;     		 case(3):MOTOR_STOP();break;     		 case(4):MOTOR_UP();break;     		 case(5):ModePID();break;     		 default:break;     		 }      		     /* USER CODE END WHILE */ 		if(flag != 5) 		{ 		int CaptureNumber =	(short)__HAL_TIM_GET_COUNTER(&htim2);	  //??????? 		__HAL_TIM_GET_COUNTER(&htim2) = 0; //    int 	Direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2);  		//µç»ú ªËÙ ª»»Speed=1sÄÚµÄÂö³åÊý/44(Ò»È 11 öÐźŠ4 ¶Æµ· )/34¼õËÙ È //		int Speed=CaptureNumber*5/44/34*2*3.14*3;     int 	Direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2); 		 		if(Direction == 1) 		{ 				CaptureNumber -= 65535; 		} 			 		int Speed=CaptureNumber;     OLED_ShowNum(40,0,Speed,5,16); 		HAL_Delay(100); 		OLED_CLS();			 		} 		     int 	Direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2); 			 		OLED_ShowCN_STR(0,0,0,3); //    OLED_ShowNum(40,0,Speed,4,16); 		OLED_ShowStr(90,0,"cm/s",2); 		OLED_ShowCN_STR(0,3,3,2);		     if(Direction==0) 		{ 			OLED_ShowCN_STR(40,3,5,2);	 		} 		if(Direction==1) 		{ 			OLED_ShowCN_STR(40,3,7,2); 		}		 //		HAL_Delay(1000); //		OLED_CLS();     /* USER CODE BEGIN 3 */   }
  蓝牙APP源代码以及技术论文:链接:https://pan.baidu.com/s/1-rbicxuyLVCq6rglCWcJTg
  提取码:huzm

万名跑友相聚河南陆家嘴郑州龙湖半程马拉松周日开跑大河报豫视频记者田育臣文受访者供图4月9日,光大银行杯2023郑州龙湖半程马拉松将在龙湖畔鸣枪开跑。届时,来自全国各地的万名跑友将相聚郑东新区,奔跑在郑州最美赛道上,尽享高楼林立长瓜帅输掉一场比赛我们就会输掉竞争,不认为阿森纳会丢很多积分直播吧4月3日讯在41击败利物浦后,曼城主帅瓜迪奥拉谈到了本赛季的争冠情况,他表示,自己不认为阿森纳会丢掉很多积分。瓜迪奥拉这样谈道我们正处于之前经历过的情况,我有一种感觉,如果我意甲AC米兰胜那不勒斯4月2日,AC米兰队球员莱奥(右)进球后与队友吉鲁庆祝。新华社发(阿尔贝托林格利亚摄)当日,在20222023赛季意大利足球甲级联赛第28轮比赛中,AC米兰队客场以4比0战胜那不勒203040!米兰复仇,罗马止连败,争四呈现5队大混战!头条创作挑战赛北京时间4月2日晚3日凌晨,意甲争四大战迎来三场焦点大战,蓝鹰拉齐奥卫冕冠军米兰及狂人罗马相继登场亮相,结果三大豪门集体高奏凯歌,拉齐奥20力克蒙扎,罗马30横扫桑普遭人恨?朱旭航关键3分一剑封喉,他把同曦通往季后赛大门关上了新疆队和同曦队这场比赛,是双方这个赛季最重要的一场比赛,只有谁赢了这场比赛,才保留有进入季后赛的可能。这场比赛之前新疆队18胜21负,同曦队17胜22负。新疆队排名12位,同曦队排蜜蜂误飞进嘴里引发过敏性休克,43岁巴西运动员身亡环球时报综合报道骑行是一项健康的运动,但巴西一名运动员却在骑车时遭遇飞来横祸。据巴西G1新闻网3月30日报道,上月初,43岁的巴西赛艇运动员瓦尔德尼尔顿雷斯在骑自行车时,一只蜜蜂撞德索萨国安的新5号一定不会让大家失望记者刘翔宇报道帽衫牛仔裤棒球帽,德索萨穿着一身休闲装留下了自己在北京街头的第一张照片。当时,几乎没有人能认出这个巴西大个子,以为他和在北京的所有外国人一样。但几周几个月后,德索萨会法甲大巴黎不敌里昂4月2日,梅西在比赛中。新华社发(戈兰热尔沃摄)当日,在20222023赛季法国足球甲级联赛第29轮比赛中,巴黎圣日耳曼队主场以0比1不敌里昂队。4月2日,姆巴佩(前右)在比赛中带最新!2023亚洲羽毛球锦标赛名单出炉!北京时间2023年4月2日,每年一度的羽毛球亚锦赛从昨天公布了参赛名单。中国羽毛球队由男单主力石宇奇和女单陈雨菲领衔参赛,本届比赛将于本月25日到30日,为期五天进行。亚洲羽毛球锦01爆冷!梅西获全队最佳仍遭狂嘘被骂散步不出力只顾着捞钱法甲第29轮,梅西和姆巴佩集体哑火,最终大巴黎在主场01爆冷不敌里昂,遭遇联赛两连败。在这一场比赛中首发登场,35岁的梅西完成在法甲的50场里程碑,但广播读到梅西的名字时,现场球迷足球这件事关于中国足球的思考(5)三体能与技术的辩证关系中国足球几十年来关于学习欧洲派拉丁派欧洲拉丁派的争论一直在延续,延续到现在连争论都没有了。八十年代沃特福德足球队访华,五比一战胜了中国队,大家都看到了英国人身
爆大冷!张本智和轰出111却遭绝杀,男乒2大世界冠军同日输球北京时间2023年2月16日,欧洲乒乓球冠军联赛结束半决赛争夺,拥有张本智和莫雷加德奥恰洛夫等名将的乌尔姆俱乐部32险胜杜塞尔多夫俱乐部,在决赛争夺战中占得先机。比赛中,张本智和1价值投资的选择潜力币是如何选择出来的?比特币从15,000美元迅速上涨至23,000美元并保持在该水平附近,我们看到山寨币呈爆炸式上涨。会一直这样下去吗?如果我们继续看到比特币每日高于其200天移动平均线(今天就是这种广东如何激发县域经济活力,将短板变潜力板?广东有122个县(市区)1609个乡镇(街道)2。65万个行政村(社区)。县域经济既是广东经济的短板,也是潜力板。如何更好地激发县域经济活力,是推动广东经济高质量发展的重要一步。而数字人民币玩不会?昆明有人被骗了8万多数字人民币听说过没?简单来说就是把你兜兜里的人民币变成一张张数字人民币,把法定人民币数字化。支付过程只涉及到你和商家,无需第三方,可谓方便极了。去年12月,国家批准数字人民币在云南青岛西安郑州,谁是北方第三城?原创刘博团队目前,24座万亿城市成绩单全部出炉。我们对北方TOP10城市的经济数据进行梳理,看看北京天津之后,北方第三城,谁与争锋?01hr我们抽取了GDP金融机构本外币存款余额一日照担保集团斩获两项省级大奖2月10日,在全省政府性融资担保体系2022年度工作总结暨表彰大会上,日照担保集团一举斩获最佳风控奖和业务创新奖两项实力大奖,以实干实绩交出政府性融资担保事业高质量发展的优异答卷。03Hadoop高可用集群环境搭建Hadoop高可用集群环境搭建lizliang202109251高可用简介1。1高可用架构1。2基于QJM的共享存储系统的数据同步机制分析1。3NameNode主备切换2集群规划2王者荣耀曾经火热,如今冷门的4位英雄,有一位老婆还被抢了头条创作挑战赛文丨可儿游戏说原创王者荣耀中,一共有113个英雄,这么多的英雄,有的人气很高,比如貂蝉瑶这种,基本上每一把都可以看到这些英雄的影子。但是也有一些人气很低,只有在特定的千年3手游这款游戏还有人在玩吗?千年刚推出的时候还在上高中那时全班一半玩千年一半玩传奇说起千年还是在网吧打cs结账时看网吧老板在玩那时老板在和别人pk发现一个小人刀枪棍棒弓都用上了相信每个男孩都有一个武侠梦顿时就开学好物,1500元档高性价比手机推荐随着手机性能的不断提升和工艺的改进,新手机两年后的卡顿现象也越来越少,人们换手机的欲望也就随之减小,各大厂发布新机的热情虽然不减但很难再引起购买热潮,动辄四五千的价位也吓退很多人,梦幻!珠海蓝眼泪奇观似星河落凡间近日,广东珠海,高栏港西沙滩出现荧光海景观,也称蓝眼泪。夜幕下,荧光海随浪起舞,仿佛星河坠落,如梦如幻。夜晚幽蓝的海面神秘浪漫,浪花拍打岸边,迸发出晶莹的蓝色光束静态镜头下,更宛如