前言

上一章节我们搭建了框架,实现了环境数据采集进程,今天做的是PWM控制电机,以及PID调节部分,用的是直流电机,pwm基础将会在本人分类专栏STM32里面详细说明代码,以及一个小实验来帮助大家理解


一、小车PID控制进程

在这里插入图片描述

电机的分类

在这里插入图片描述在这里插入图片描述

直流电机的分类

直流电机按照结构可分为有刷电机和无刷电机

有刷电机

在这里插入图片描述
在这里插入图片描述
特点: 电刷和换向器之间有摩擦,效率低,低速扭矩大,价格较便宜

无刷电机

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
特点: 安静,效率高,转矩特性优异,启动电流小,价格较贵

直流减速电机即齿轮减速电机

是在普通直流电机的基础上,组装上微型齿轮减速箱。齿轮减速箱的作用是,提供较低的转速,较大的力矩。同时,齿轮箱不同的减速比可以提供不同的转速和力矩。
在这里插入图片描述
在这里插入图片描述

H桥电路

在这里插入图片描述
为了方便可以用芯片
MC3386电机驱动芯片
在这里插入图片描述

在这里插入图片描述

PWM

在这里插入图片描述
在这里插入图片描述

它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域。脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。

常见应用有:电机控制,DAC输出等

STM32-PWM 直流电机驱动

在这里插入图片描述
电机1
IN1  PC3
IN2  PA3
PWMA  PA2 (TIM5-CH3)

电机2
IN3  PE15
IN4  PE13
PWMB  PD12(TIM4-CH1)

二、测试Start!

基本配置
在这里插入图片描述
在这里插入图片描述
TIM5也一样通道注意是3
配置PWM
AAR决定了周期
配置:
在这里插入图片描述

CCR初始为0就行
在这里插入图片描述
测试代码主要部分:

int main(void)
{
  /* USER CODE BEGIN 1 */

	int pwm_value = 100, temp =0;
	
	
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM5_Init();
  MX_TIM4_Init();
  /* USER CODE BEGIN 2 */

	printf("电机驱动测试程序\n");
	
	//电机1设置
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
	HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_3);
	
	//电机2设置
	HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_SET);
	HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
	

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		
		if(pwm_value >= 8000)
			temp = -100;
		if(pwm_value <= 100)
			temp = 100;
		
		pwm_value = pwm_value + temp;
		TIM5->CCR3 = pwm_value;
		TIM4->CCR1 = pwm_value;
		
		printf("pwm_value = %d\n",pwm_value);
		
		HAL_Delay(500);
		
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

现象加速减速循环
PID调节时注意死区
代码日后更新github,还没有整理,整理完给链接地址

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐