2021年电赛国赛E题 智能送药小车 代码部分原理详解

之前在校电赛做过送药小车,效果还不错。当时刚刚学STM32,用的还是标准库,写的代码也是非常粗糙,现在准备回过头来用HAL库对整体的代码进行移植,并在一些小细节上进行逻辑的优化和重构,在两年来的技术积累中,PID的使用也逐渐熟练,尤其是在送药小车的代码中更是大量运用PID算法,下面我会讲解一些我做的送药小车的一些基本配置代码和一些关键的PID算法代码。

首先要明白做送药小车需要用到什么外设,一般小车,能做三轮的最好都做成是三轮的,所以结构搭建材料选用方面我选择的是一个三轮小车车模、两个霍尔编码器电机、一个万向轮。电子元件材料方面选择STM32103C8T6最小系统板作为主控板,TB6612FNG作为电子驱动模块,OLED显示一些数据(可用可不用),两个K210模块分别用作巡线和数字识别功能(也可以用一块同时作巡线和数字识别,但是那样的话屏幕帧数很低,巡线效果会比较差)。

整体代码采用STM32CubeMX生成在Keil工程里,也就是HAL库。

其中,使用TIM1的CH1和CH4两路通道发出PWM波驱动左右电机,并且使用TIM2和TIM3的编码器模式分别读取左右电机传回的脉冲数进行闭环控制,最后用TIM4的定时器中断功能进行PID的调速以及后续功能的实现。

TIM的预分频系数配置成1-1,重装载值配置成7200-1,发出频率为10kHZ的PWM波(这个频率是最适合驱动市面上大多数的编码器电机的)

同时,TIM2和TIM3都配置成Encoder Mode也就是编码器模式,计数沿选择Encoder Mode TI1 and TI2,也就是上下沿都计数,这样就是实现了四倍频。

最后TIM4的定时器中断模式,NVIC里面开启TIM4的全局中断功能,预分频系数配置成720-1,重装载值配置成1000-1,这样就实现了TIM4每10ms中断一次。

然后开启串口1的中断接收模式,波特率配置成115200,串口2也配置成相同的模式。

  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);  //使能定时器1通道1,输出PWM波给左电机
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);  //使能定时器1通道4,输出PWM波给右电机
  HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);  //使能定时器2编码器模式
  HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_ALL);  //使能定时器3编码器模式
  HAL_TIM_Base_Start_IT(&htim4);  //使能定时器4中断,10ms一次
  HAL_UART_Receive_IT(&huart1,(uint8_t*)&Rx1_Buff,1);  //串口1接收到一个字符就中断一次
  HAL_UART_Receive_IT(&huart2,(uint8_t*)&Rx2_Buff,1);  //串口2接收到一个字符就中断一次

在主函数的/* USER CODE BEGIN 2 */和/* USER CODE END 2 */之间加入上述代码,使能所有外设。

下面来看整个工程的核心代码,定时器4的中断回调函数中的内容:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)  //定时器4每10ms发生一次中断
{
	if(htim->Instance==TIM4)
	{		
		if(time_count++%5==0)
			key_scan();
		if(pid_flag==1)
		{
			static int16_t Current_Speed_L; 
			static int16_t Current_Speed_R;
			static int16_t Output_L;
			static int16_t Output_R;
			Current_Speed_L=Get_Speed(2);  //读取左电机编码器数值
			Current_Speed_R=Get_Speed(3);   //读取右电机编码器数值
			Output_L=Increment_Pid(Current_Speed_L,Speed_Set_L);
			Output_R=Increment_Pid(Current_Speed_R,Speed_Set_R);
			Set_Speed_L(Output_L);  //将PID运算的结果输出给左电机
			Set_Speed_R(Output_R);  //将PID运算的结果输出给左电机
		}
		if(pid_flag==2)
		{	
			static int16_t Current_Speed_L;  
			static int16_t Current_Speed_R;
			static int16_t Output_L;
			static int16_t Output_R;
			Current_Speed_L=Get_Speed(2);  //读取左电机编码器数值
			Current_Speed_R=Get_Speed(3);  //读取右电机编码器数值
			Left_Sum+=Current_Speed_L;   //将左边电机的脉冲数累加
			Right_Sum+=Current_Speed_R;  //将右边电机的脉冲数累加
			Output_L=Position_Pid(Left_Sum,Position_Set_L);
			Output_R=Position_Pid(Right_Sum,Position_Set_R);
			Set_Speed_L(Output_L);  //将PID运算的结果输出给左电机
			Set_Speed_R(Output_R);
		}
		else
		{
			Set_Speed_L(0);  //将PID运算的结果输出给左电机
			Set_Speed_R(0);
		}
	}
}

 这里的pid_flag是pid模式标志位,是为了判断要用速度环还是位置环,方便进行控制。其中Increment_PID和Position_PID分别是自己写的增量式PID和位置式PID的函数

int16_t Position_Pid(int16_t Current_Position,int16_t Target_Position)  //直立环PID控制
{
	static int16_t Error;
	static int16_t Output;
	static int16_t Last_Error;
	static int16_t Error_Sum;
	
	Error=Target_Position-Current_Position;
	Error_Sum+=Error;
	if(Error_Sum>5000)
		Error_Sum=5000;
	if(Error_Sum<-5000)
		Error_Sum=-5000;
	Output=Position_Kp*Error+Position_Ki*Error_Sum+Position_Kd*(Error-Last_Error);  
	Last_Error=Error;
	return Output;
}
int16_t Increment_Pid(int16_t Current_Speed,int16_t Target_Speed)  //左电机速度环增量式PI控制
{
	static int16_t Error;
	static int16_t Output;
	static int16_t Last_Error;
	Error=Target_Speed-Current_Speed;
	Output+=Speed_Kp*Error+Speed_Ki*(Error-Last_Error);
	Last_Error=Error;
	return Output;
}

增量式PID主要用在电机转速控制中,优点是不需要积分部件,也就是不需要对前面时刻的误差进行累加,只需要知道上次的误差就可以了。

下面我会更新视觉识别红线并传回误差的部分,并且有视觉模块与单片机串口通信的部分,未完待续。

### 回答1: STM32送药小车是一种基于STM32微控制器的智能送药系统,具有自主导航、避障能力,并能在特定区域内进行准确的药品投递。 首先,STM32送药小车采用了STM32微控制器作为核心控制器,该微控制器具有高性能、低功耗和强大的处理能力,能够实现人机交互、导航控制和数据传输等功能。小车上还配备了源管理模块,用于控制池充和供,确保小车的持续运行。 其次,STM32送药小车通过激光雷达、超声波传感器等多个传感器实时检测周围环境,实现避障功能。它能够根据传感器数据分析出前方障碍物的位置和距离,从而调整行进路线,避免与障碍物发生碰撞。 此外,STM32送药小车还具备自主导航功能。它采用了视觉识别技术,通过摄像头拍摄和图像处理算法,能够识别出特定区域内的目标位置,并通过路径规划算法确定最优行进路线,从而实现自主导航和定位。 最重要的是,STM32送药小车能够准确投递药品。系统可通过药柜中的RFID芯片和扫描仪,识别出药品的位置和数量,并将药品放置在指定的投递位置。在投递过程中,系统还能够实时监控药品的状态,确保药品的安全和完整性。 综上所述,STM32送药小车具有自主导航、避障和准确投递的功能,为医疗机构提供了快速、安全的药品投递服务,极大地提高了送药的效率和准确度。 ### 回答2: STM32送药小车是一种基于STM32微控制器的智能机器人,用于在医院或药店中自动送药。它具有高度的智能化和自主性,可以根据事先设定的路径和时间表,在预定的时间内按需将药物送达指定地点。 STM32送药小车采用了先进的传感器技术和编程算法,能够实时感知环境,避免障碍物并进行路径规划。它具有较高的定位准确性和精确的运动控制,可确保安全稳定地行驶。 在实际使用中,医院或药店的工作人员可以通过设置药物的种类、数量和目的地等参数,将这些信息输入到STM32送药小车中。然后,小车根据设定的路径规划和时间表,在规定的时间内按需将药物送到指定的位置。 STM32送药小车不仅可以提高送药的效率和准确性,减轻了医护人员的工作压力,还可以避免药物错误投放和患者药物遗漏的问,保证患者的用药安全。 此外,STM32送药小车还具有远程控制和监控功能,医护人员可以通过远程操作控制小车的移动,并实时监测小车的运行状态。这样,即使医护人员在远离小车的情况下,也能随时了解到送药的进展情况和现场情况。 综上所述,STM32送药小车是一种能够实现智能自主送药的机器人,它利用STM32微控制器的优势,结合先进的传感器和编程技术,能够高效、准确地将药物送达指定地点,极大地提升了医疗行业的服务质量和效率。 ### 回答3: STM32是一款常用的嵌入式系统开发板,也是一种微控制器。送药小车是一种通过STM32进行控制的智能装置,用于自动化配送药品。 STM32送药小车可以根据设定的路径和时间表,自动将药品送到指定的位置。它配备了各种传感器,如红外线传感器、声音传感器和距离传感器,可以检测障碍物并避免碰撞。 小车上的STM32芯片负责控制整个运行过程。它接收来自传感器的数据,并根据这些数据做出相应的动作。如果检测到障碍物,STM32会发出指令,使小车改变方向或者停止前进。同时,它还可以通过蓝牙或无线网络连接,与配送人员或管理人员进行通信。 通过使用STM32芯片,我们可以实现送药小车的智能化和自动化。它可以节省人力资源,提高配送的效率和准确性。同时,它还可以减少人为因素对配送过程的影响,避免了潜在的错误和差错。 总的来说,STM32送药小车是一种通过STM32芯片进行控制的智能装置,能够实现药品的自动化配送。它具有灵活的路径规划、自动避障和远程通信等功能,可以有效提高配送效率和准确性,同时也降低了人力资源的消耗。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值