基于树莓派ROSstm32搭载Freertos智能平衡车Day2
前言
上一章节我们搭建了框架,实现了环境数据采集进程,今天做的是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,还没有整理,整理完给链接地址